ДМРВ-М и Ардуино
- Войдите на сайт для отправки комментариев
Ср, 01/05/2019 - 12:33
Добрый день! возникла необходимость использовать ДМРВ в качестве датчика расхода воздуха вне автомобиля. Имеется ДМРВ-М от Газели и вот такая статья. Дело в том что у него 4 контакта, а в ДМРВ-М целых 6. Подскажите по теме как получить данные с такого датчика.
С контактами разобрался, напряжение шлет в порт 0. Прошивка из ссылки сверху приведена внизу. Там расчитывается CFM, мне нужно расчитать скорость. Сделал небольшой стенд для тарирования из импеллера и термоанемометра testo 425. Сделал новую таблицу вольтаж-расход (я помню про температуру, к ней вернемся потом) Проблема в том, что при подставлении своей таблицы считает все равно неправильно. Приведено 26 значений, соответсвенно массив обзывается float theArray[52]= {. Моя таблица содержит 11 значений, и когда я ставлю вместо 52 число 22 то выдает ошибку. Ставлю 23 и нет ошибки. Дальше непонятно как происходит интерполяция, пожалуйста обьясните почему неправильно считает и как вообще он считает? Почему в цикле for второе условие x+2?
Моя тарировка напряжение-расход
Код из интернета:
// include library #include <LiquidCrystal.h> // create int for program int val = 0; float volt = 0; int cfm = 0; //Create lookup tale for Ford Mass Air Sensor float theArray[52]= { 0.1, 2, 0.6, 7, 0.8, 9, 0.9, 12, 1.1, 16, 1.2, 18, 1.3, 22, 1.5, 26, 1.6, 30, 1.7, 36, 1.8, 40, 1.9, 44, 2.0, 49, 2.2, 59, 2.3, 70, 2.4, 79, 2.6, 90, 2.7, 99, 2.9, 119, 3.1, 145, 3.4, 170, 3.5, 195, 3.9, 245, 4.2, 292, 4.4, 340, 4.8, 410}; // initialize the library by associating any needed LCD interface pin // with the arduino pin number it is connected to /* * pin1 = gnd * pin2 = +5v * pin3 = gnd * pin4 = rs = pin 2 arduino * pin5 = r/w = gnd * pin6 = e = pin 3 arduino * pin7 = no connection * pin8 = no connection * pin9 = no connection * pin10 = nl connection * pin11 = db4 = pin 4 arduino * pin12 = db5 = pin 5 arduino * pin13 = db6 = pin 6 arduino * pin14 = db7 = pin 7 arduino * pin15 = ledA = +5v * pin16 = ledA = gnd * * * volts, cfm */ LiquidCrystal lcd(2, 3, 4, 5, 6, 7); void setup() { // set up the LCD's number of columns and rows: lcd.begin(20, 4); } void loop() { int val = analogRead(0);// read analog input float volt = val * (5.0/1023.0);// convert to voltage //print header lcd.setCursor(2, 0); lcd.print("JOE'S FLOW BENCH"); //print volts line lcd.setCursor(0, 2); lcd.print("VOLTS"); lcd.setCursor(10,2); lcd.print(volt); //print cfm line lcd.setCursor(0, 4); lcd.print("CFM"); //create interpolation so we can convert voltage to cfm for (int x= 0; x<52; x=x+2){ if (volt >=theArray[x] && volt <=theArray[x+2]) { cfm = theArray[x+3] + ( (theArray[x+1] - theArray[x+3]) * ( (volt - theArray[x]) / (theArray[x+2] - theArray[x]) ) ); // temp = base temp + (high temp- base temp) * (Vread - Vbase) / (Vhigh - Vbase) } } // added this line because cfm would not go to 0 only the lowest value last read if(volt <= 0.1) cfm = 0; else cfm = cfm; lcd.setCursor(10, 4); lcd.print(cfm); delay(200); lcd.clear();// clear the LCD screen so numbers disappear and don,t stack up to create false reading }Разобрался?
Ну это как обычно на форумах: «Все, сейчас попробую и отпишусь о результатах» (обновлено 8 лет назад) ))))