Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Вот такой вот тупой кусок говнокода. Работает. А был момент не заходил в нужный case. Прошло само когда изменил что-то в совсем другом модуле.

Отправлено POV (78.31.77.123) 14 июля 2011, г. 15:07
В ответ на: хотелось бы на собачку посмотреть... отправлено DASM 14 июля 2011, г. 14:50


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;
}


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 76:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru