ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
18 июля
129738 Топик полностью
POV (01.09.2008 13:31, просмотров: 149) ответил bialix на код в студию
вот. этот кусок кода кочует из отладочной проги в основную. при очередном переносе в конечной проге как раз и начались чудеса. float __fastcall ADCToFloat(int ttre, int code) { float press = 0; float bit_range; float Vref; float Imin; float Imax ; float Res; float Pmax; float Ku; float Umin; float Umax; float ADCmin; float ADCmax; float slope; float U; switch (ttre) { case devUNIS_FLOW: // расходомер bit_range = 12; Vref = 2.43; Imin = 0.004; Imax = 0.020; Res = 249; Ku = 0.5; Umin = 50; // расход Umax = 500; // расход ADCmin = (Imin*Res*Ku/Vref)*(pow(2, bit_range)-1); ADCmax = (Imax*Res*Ku/Vref)*(pow(2, bit_range)-1); if (code > ADCmin) press = (code-ADCmin)/(ADCmax-ADCmin) *(Umax-Umin) + Umin; else press = code/ADCmin *Umin; break; case devUNIS_CTRL: bit_range = 12; Vref = 2.43; Imin = 0.004; Imax = 0.020; Res = 249; Pmax = 10.3069; Ku = 0.5; Umin = Imin*Res*Ku; Umax = Imax*Res*Ku; ADCmin = (Umin/Vref)*(pow(2, bit_range)-1); ADCmax = (Umax/Vref)*(pow(2, bit_range)-1); press = (code-ADCmin)*Pmax/(ADCmax-ADCmin) / 1.03; break; case devCENTRAL_UDTM: // плата УДТМ bit_range = 16; Vref = 5.0; Umin = 0.5; Umax = 4.5;//4.5; Pmax = 10.3069;//10.30; Ku = 1.0; ADCmin = (Umin*Ku/Vref)*(pow(2, bit_range)-1); ADCmax = (Umax*Ku/Vref)*(pow(2, bit_range)-1); press = (code-ADCmin)*Pmax/(ADCmax-ADCmin); break; case devPNEUMO_CHANNEL_NEW: // новая пневматика bit_range = 16; Vref = 5.0; Imin = 0.004; Imax = 0.020; Res = 124.5; Pmax = 10.0; Ku = 2.0; Umin = Imin*Res*Ku+0.000; // при использовании активного фильтра имеется смещение на входе АЦП около 50 мВ (+- сколько-то мВ) Umax = Imax*Res*Ku+0.000; ADCmin = (Umin/Vref)*(pow(2, bit_range)-1); ADCmax = (Umax/Vref)*(pow(2, bit_range)-1); press = (code-ADCmin)*Pmax/(ADCmax-ADCmin); break; case devSI_OLD: // плата СИ от Тормоз-Р if (code >= 250) press = code; // служебные коды else { bit_range = 8; Vref = 3.3; Imin = 0.004; Imax = 0.020; Res = 249.0; Pmax = 10.0; Ku = 0.5; Umin = Imin*Res*Ku; Umax = Imax*Res*Ku; ADCmin = (Umin/Vref)*(pow(2, bit_range)-1); ADCmax = (Umax/Vref)*(pow(2, bit_range)-1); press = (code-ADCmin)*Pmax/(ADCmax-ADCmin); } break; case devMI_OLD: // плата МИ от Тормоз-Р if (code >= 250) press = code; // служебные коды else { bit_range = 8; Vref = 2.5; Umin = 0.5; Umax = 4.5; Pmax = 10.3069; Ku = 0.5; ADCmin = (Umin*Ku/Vref)*(pow(2, bit_range)-1); ADCmax = (Umax*Ku/Vref)*(pow(2, bit_range)-1); press = (code-ADCmin)*Pmax/(ADCmax-ADCmin); } break; case devMI_NEW: // плата МИ от Тормоз-Р bit_range = 12; Vref = 2.2; Umin = 0.5; Umax = 4.5; Pmax = 10.3069; Ku = 24.0/(24+10); ADCmin = (Umin*Ku/Vref)*(pow(2, bit_range)-1); ADCmax = (Umax*Ku/Vref)*(pow(2, bit_range)-1); press = (code-ADCmin)*Pmax/(ADCmax-ADCmin); break; case devMI_CYL_PRESS: // давление цилиндра case devMI_END1: // плата МИ хвоста bit_range = 12; Vref = 2.2; Umin = 0.5+0.01; Umax = 4.5; Pmax = 10.3069; Ku = 24.0/(24+10); ADCmin = (Umin*Ku/Vref)*(pow(2, bit_range)-1); ADCmax = (Umax*Ku/Vref)*(pow(2, bit_range)-1); press = (code-ADCmin)*Pmax/(ADCmax-ADCmin); break; case devMI_CYL_SHTOK1: // выход штока bit_range = 12; Vref = 2.2; Imin = 0.004; Imax = 0.020; Res = 249.0; Ku = 8.2/(8.2+10); Umin = 60; // дальность Umax = 500; // дальность ADCmin = (Imin*Res*Ku/Vref)*(pow(2, bit_range)-1); ADCmax = (Imax*Res*Ku/Vref)*(pow(2, bit_range)-1); press = (code-ADCmin)/(ADCmax-ADCmin) * (Umax-Umin) + Umin; break; case devTERMO_BAT: bit_range = 12; Vref = 2.43; Ku = 0.5 * (1.1/(1.1+6.8)); press = Vref*(code/(pow(2, bit_range)-1)) / Ku; break; case devPNEUMO_CHANNEL_OLD: // стандартная пневматика со старыми контролерами case devCENTRAL_OLD: // центральный контроллер bit_range = 8; Vref = 3.0; Imin = 0.004; Imax = 0.020; Res = 249.0; Pmax = 10.0; Ku = 0.5; Umin = Imin*Res*Ku; Umax = Imax*Res*Ku; ADCmin = (Umin/Vref)*(pow(2, bit_range)-1); ADCmax = (Umax/Vref)*(pow(2, bit_range)-1); press = (code-ADCmin)*Pmax/(ADCmax-ADCmin); break; case devCENTRAL_OLD_TEMPER: // датчик температуры центрального контроллера (он-чип) bit_range = 8; Vref = 3.0; Ku = 0.5; Umin = 0.776*Ku; // после усилителя slope = 0.00286*Ku; // после усилителя U = code/(pow(2, bit_range)-1) * Vref; // после усилителя press = (U-Umin)/slope/4; break; } return press; } а это вот описание номеров устройств для switch - case enum AllDeviceTypes { devPNEUMO_CHANNEL_OLD = 1, devSI_OLD, devMI_OLD, devPNEUMO_CHANNEL_NEW, devSI_NEW, // не нужен devMI_NEW, // не нужен devCOMMUTATOR, devUNIS_CTRL = 20, // новое пневмоуправление devTERMO, devTERMO_BAT, // для преобразования напруги devMI_END1, devMI_CYL_SHTOK1, devMI_CYL_PRESS, devTERMO_U, // оцифровка напряжения devUNIS_FLOW, devCENTRAL_OLD =100, devCENTRAL_OLD_TEMPER, devCENTRAL_UDTM, };