POV (01.09.2008 13:31, просмотров: 169) ответил 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,
};