Помогите новичку разобраться в коде

tosik.nik
Offline
Зарегистрирован: 15.10.2014

Объясните пожалуйста новичку, принцип вычисления в функции speedometr, tahometr (что на что делим и что получаем) и зачем переменным sz и tz присваиваем 10, а потом с каждым циклом минусуем 1 (я понимаю что идет обнуление переменных th sp) только зачем? если можно ответьте развернуто (подробно) з.ы. сильно не пинайте

//********************************************************************
unsigned long micros_sp = 0, micros_th = 0;
volatile int tz; 
volatile int sz;
volatile int sp;                            //импульсы спидометра
volatile int th;                            //импульсы тахометра
int resultInput[49];                        //массив значений входов
String stringOne = "";                      //основная строка
int i;                                      //счетчик циклов
int x;                                      //конвертор аналогового входа до 2-х вольт в цифровой (для ABS)
int ign;                                    //вход зажигания
//********************************************************************
void setup(){ 
  for(i=0; i<=49; i++){                     //обнуление массива значений  
    resultInput[i]=0; 
  } 
  Serial.begin(115200);                     //инициализация ком порта 
  attachInterrupt(0, speedometr, RISING);   //прерывание спидометра по фронтам импульса
  attachInterrupt(1, tahometr,   RISING);   //прерывание тахометра по фронтам импульса
  
  
  //pinMode(47, INPUT);                     //для тестов
  digitalWrite(47, 0);                      //меняем на 1, чтоб эмулировать вкл зажигания
  
} 
//********************************************************************
void loop(){
  ign             = digitalRead(47);       //вход зажигания
  if (analogRead(10) >100){x=1;}
  else                    {x=0;}           //конвертируем ABS
  resultInput[0]  = sp;                    //   A12    записываем частоту со входа спидометра в массив
  resultInput[1]  = th;                    //   A11    тахометр
  resultInput[2]  = analogRead(4);         //   B13    напряжение
  resultInput[3]  = analogRead(2);         //   B11    топливо
  resultInput[4]  = analogRead(0);         //   B9     температура охлаждения
  resultInput[5]  = 0;                     //          температура за бортом
  resultInput[6]  = 0;                     //          буст
  resultInput[7]  = 0;                     //          егт
  resultInput[8]  = 0;                     //          резерв
  resultInput[9]  = 0;                     //          резерв
  resultInput[10] = 0;                     //          резерв
  resultInput[11] = 0;                     //          резерв
  resultInput[12] = 0;                     //          резерв
  resultInput[13] = 0;                     //          резерв
  resultInput[14] = 0;                     //          резерв
  resultInput[15] = 0;                     //          резерв
  resultInput[16] = digitalRead(32);       //   A14    левый поворот
  resultInput[17] = digitalRead(33);       //   A13    правый поворот
  resultInput[18] = digitalRead(28);       //   A18    габарит
  resultInput[19] =!digitalRead(29);       //   A17    дальний
  resultInput[20] = 0;                     //          птф передние
  resultInput[21] = digitalRead(31);       //   A15    птф задний
  resultInput[22] =!digitalRead(24);       //   A22    чек
  resultInput[23] = 0;                     //          уровень ож  резерв
  resultInput[24] = 0;                     //          уровень тж  резерв ////////
  resultInput[25] =!digitalRead(27);       //   A19    ручник
  resultInput[26] = 0;                     //          износ колодок резерв
  resultInput[27] =!digitalRead(22);       //   A24    давление масла
  resultInput[28] = 0;                     //          лампа вентилятора
  resultInput[29] =!digitalRead(23);       //   A23    зарядка
  resultInput[30] = 0;                     //   B2     ремень
  resultInput[31] =!digitalRead(26);       //   A20    srs
  resultInput[32] = x;                     //   A21    абс 
  resultInput[33] = 0;                     //          esp  резерв
  resultInput[34] = 0;                     //          elm  резерв
  resultInput[35] = digitalRead(9);        //   B4     ночной скин
  resultInput[36] = digitalRead(53);       //   B8     кнопка выбора
  resultInput[37] = digitalRead(52);       //    B7      кнопка действия
  resultInput[38] = 0;                     //          p    резерв
  resultInput[39] = 0;                     //          r    резерв
  resultInput[40] = 0;                     //          n    резерв
  resultInput[41] = 0;                     //          d    резерв
  resultInput[42] = 0;                     //          s    резерв
  resultInput[43] =!digitalRead(46);       //   B1     лампа двери
  resultInput[44] = 0;                     //          лампа топлива
  resultInput[45] = 0;                     //          резерв
  resultInput[46] = 0;                     //          резерв
  resultInput[47] = digitalRead(47);       //   B2     зажигание
    
  for(i=0; i<=15; i++){                     //передаем аналоговые данные из массива в COM-port
   stringOne =  String(stringOne + resultInput[i]);
   stringOne =  String(stringOne + ",");
  } 
  
  for(i=16; i<=47; i++){                     //передаем цифровые данные из массива в COM-port  
   stringOne =  String(stringOne + resultInput[i]);
  } 
  
  stringOne =  String(stringOne + resultInput[48]+ ":");

  Serial.print (stringOne);
  
  stringOne =  String("");
 
  
  tz = tz - 1;
  sz = sz - 1;
  if (tz == 0){th = 0;}
  if (sz == 0){sp = 0;}
  delay(50);
 }
//********************************************************************
void speedometr(){                          //измеряем частоту на входе спидометра по прерыванию
   sp=(900000.0/( micros() - micros_sp));
   micros_sp = micros();
   sz = 10;
 }
//********************************************************************
void tahometr(){                            //измеряем частоту на входе тахометра по прерыванию
  th=(2900000.0/( micros() - micros_th));
  micros_th = micros();
  tz = 10;
}

 

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

для спидометра

на каждом прерывании делим 900000.0 () на число прошедших между прерыванием микросекунд.

sz - необходимо для того, что когда прерывание не будет или между сигналами будет очень долгий промежуток (а значит и не будет результата деления), через 10 циклов программы, значение спидометра (sh) станет равным 0. Если так не сделать, то при отсутсвии прерываний sp ,будет равнятся последнему результату деления.

для тахометра аналогично. 

Почему 90000 - надо понять как посчитали.

tosik.nik
Offline
Зарегистрирован: 15.10.2014

Спасибо за разьяснение .

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

там спидометр дает 4 импульса на 1 оборот... пооэтому и 900000