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

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

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

001//********************************************************************
002unsigned long micros_sp = 0, micros_th = 0;
003volatile int tz;
004volatile int sz;
005volatile int sp;                            //импульсы спидометра
006volatile int th;                            //импульсы тахометра
007int resultInput[49];                        //массив значений входов
008String stringOne = "";                      //основная строка
009int i;                                      //счетчик циклов
010int x;                                      //конвертор аналогового входа до 2-х вольт в цифровой (для ABS)
011int ign;                                    //вход зажигания
012//********************************************************************
013void setup(){
014  for(i=0; i<=49; i++){                     //обнуление массива значений 
015    resultInput[i]=0;
016  }
017  Serial.begin(115200);                     //инициализация ком порта
018  attachInterrupt(0, speedometr, RISING);   //прерывание спидометра по фронтам импульса
019  attachInterrupt(1, tahometr,   RISING);   //прерывание тахометра по фронтам импульса
020   
021   
022  //pinMode(47, INPUT);                     //для тестов
023  digitalWrite(47, 0);                      //меняем на 1, чтоб эмулировать вкл зажигания
024   
025}
026//********************************************************************
027void loop(){
028  ign             = digitalRead(47);       //вход зажигания
029  if (analogRead(10) >100){x=1;}
030  else                    {x=0;}           //конвертируем ABS
031  resultInput[0]  = sp;                    //   A12    записываем частоту со входа спидометра в массив
032  resultInput[1]  = th;                    //   A11    тахометр
033  resultInput[2]  = analogRead(4);         //   B13    напряжение
034  resultInput[3]  = analogRead(2);         //   B11    топливо
035  resultInput[4]  = analogRead(0);         //   B9     температура охлаждения
036  resultInput[5]  = 0;                     //          температура за бортом
037  resultInput[6]  = 0;                     //          буст
038  resultInput[7]  = 0;                     //          егт
039  resultInput[8]  = 0;                     //          резерв
040  resultInput[9]  = 0;                     //          резерв
041  resultInput[10] = 0;                     //          резерв
042  resultInput[11] = 0;                     //          резерв
043  resultInput[12] = 0;                     //          резерв
044  resultInput[13] = 0;                     //          резерв
045  resultInput[14] = 0;                     //          резерв
046  resultInput[15] = 0;                     //          резерв
047  resultInput[16] = digitalRead(32);       //   A14    левый поворот
048  resultInput[17] = digitalRead(33);       //   A13    правый поворот
049  resultInput[18] = digitalRead(28);       //   A18    габарит
050  resultInput[19] =!digitalRead(29);       //   A17    дальний
051  resultInput[20] = 0;                     //          птф передние
052  resultInput[21] = digitalRead(31);       //   A15    птф задний
053  resultInput[22] =!digitalRead(24);       //   A22    чек
054  resultInput[23] = 0;                     //          уровень ож  резерв
055  resultInput[24] = 0;                     //          уровень тж  резерв ////////
056  resultInput[25] =!digitalRead(27);       //   A19    ручник
057  resultInput[26] = 0;                     //          износ колодок резерв
058  resultInput[27] =!digitalRead(22);       //   A24    давление масла
059  resultInput[28] = 0;                     //          лампа вентилятора
060  resultInput[29] =!digitalRead(23);       //   A23    зарядка
061  resultInput[30] = 0;                     //   B2     ремень
062  resultInput[31] =!digitalRead(26);       //   A20    srs
063  resultInput[32] = x;                     //   A21    абс
064  resultInput[33] = 0;                     //          esp  резерв
065  resultInput[34] = 0;                     //          elm  резерв
066  resultInput[35] = digitalRead(9);        //   B4     ночной скин
067  resultInput[36] = digitalRead(53);       //   B8     кнопка выбора
068  resultInput[37] = digitalRead(52);       //    B7      кнопка действия
069  resultInput[38] = 0;                     //          p    резерв
070  resultInput[39] = 0;                     //          r    резерв
071  resultInput[40] = 0;                     //          n    резерв
072  resultInput[41] = 0;                     //          d    резерв
073  resultInput[42] = 0;                     //          s    резерв
074  resultInput[43] =!digitalRead(46);       //   B1     лампа двери
075  resultInput[44] = 0;                     //          лампа топлива
076  resultInput[45] = 0;                     //          резерв
077  resultInput[46] = 0;                     //          резерв
078  resultInput[47] = digitalRead(47);       //   B2     зажигание
079     
080  for(i=0; i<=15; i++){                     //передаем аналоговые данные из массива в COM-port
081   stringOne =  String(stringOne + resultInput[i]);
082   stringOne =  String(stringOne + ",");
083  }
084   
085  for(i=16; i<=47; i++){                     //передаем цифровые данные из массива в COM-port 
086   stringOne =  String(stringOne + resultInput[i]);
087  }
088   
089  stringOne =  String(stringOne + resultInput[48]+ ":");
090 
091  Serial.print (stringOne);
092   
093  stringOne =  String("");
094  
095   
096  tz = tz - 1;
097  sz = sz - 1;
098  if (tz == 0){th = 0;}
099  if (sz == 0){sp = 0;}
100  delay(50);
101 }
102//********************************************************************
103void speedometr(){                          //измеряем частоту на входе спидометра по прерыванию
104   sp=(900000.0/( micros() - micros_sp));
105   micros_sp = micros();
106   sz = 10;
107 }
108//********************************************************************
109void tahometr(){                            //измеряем частоту на входе тахометра по прерыванию
110  th=(2900000.0/( micros() - micros_th));
111  micros_th = micros();
112  tz = 10;
113}

 

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