float __fastcall ADCToFloat(int type, int code)
{
float press;
float bit_range;
float Vref;
float Imin;
float Imax ;
float Res;
float Pmax;
float Ku;
float Umin;
float Umax;
float ADCmin;
float ADCmax;
switch (type)
{
case devMI_CYL_PRESS: // давление цилиндра
case devMI_END1: // плата МИ хвоста
bit_range = 12;
Vref = 2.2;
Umin = 0.5;///////////////////////
Umax = 4.5;
Pmax = 10.206894152479644707623982235381;
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);
if (press > 10) press = 253;
break;
case devSI_NEW:
bit_range = 12;
Vref = 2.2;
Imin = 0.004;
Imax = 0.020;
Res = 249;
Pmax = 9.8692326671601283000246730816679;
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_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 devUNIS_FLOW: // расходомер
{
bit_range = 12;
Vref = var.Vref_Unis;
Imin = 0.004;
Imax = 0.020;
Res = 249;
Ku = 0.5;
Umin = 150;//minFlow[device]; // расход
Umax = 3000;//maxFlow[device]; // расход
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 devCENTRAL_UDTM: // плата УДТМ
// if (code >= 250)
// press = code; // служебные коды
// else
{
bit_range = 16;
Vref = 5.0;
Umin = 0.5;
Umax = 4.5;//4.5;
Pmax = 9.8692326671601283000246730816679;
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 devCENTRAL_UDTM2_TMP36:
bit_range = 12;
Vref = 1;//2.43;
Ku = 0.5;
Umin = code/(pow(2, bit_range)-1) * Vref/Ku; // напряжение на датчике
press = 25 + (Umin-0.75)/0.010; // 0,75 В == 25 градусов, 10 мВ/градус
break;
case devCENTRAL_UDTM2:
case devUNIS:
bit_range = 12;
Vref = var.Vref_Unis;
Imin = 0.004;
Imax = 0.020;
Res = 249;
Pmax = 9.8692326671601283000246730816679;
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 devPNEUMO_CHANNEL_NEW: // новая пневматика
bit_range = 16;
Vref = 5.0;
Imin = 0.004;
Imax = 0.020;
Res = 124.5;
Pmax = 9.8692326671601283000246730816679;
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 = 9.8692326671601283000246730816679;
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 = 9.8692326671601283000246730816679;
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 devPNEUMO_IS: // стандартная пневматика со старыми контролерами
case devCENTRAL_OLD: // центральный контроллер
bit_range = 16;
Vref = 5.0;
Imin = 0.004;
Imax = 0.020;
Res = 249.0;
Pmax = 9.8692326671601283000246730816679;
Ku = 1;
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; // после усилителя
float slope = 0.00286*Ku; // после усилителя
float U = code/(pow(2, bit_range)-1) * Vref; // после усилителя
press = (U-Umin)/slope/4;
break;
}
return press;
}