Помогите новичку разобраться в коде
- Войдите на сайт для отправки комментариев
Вс, 26/10/2014 - 23:17
Объясните пожалуйста новичку, принцип вычисления в функции speedometr, tahometr (что на что делим и что получаем) и зачем переменным sz и tz присваиваем 10, а потом с каждым циклом минусуем 1 (я понимаю что идет обнуление переменных th sp) только зачем? если можно ответьте развернуто (подробно) з.ы. сильно не пинайте
001 | //******************************************************************** |
002 | unsigned long micros_sp = 0, micros_th = 0; |
003 | volatile int tz; |
004 | volatile int sz; |
005 | volatile int sp; //импульсы спидометра |
006 | volatile int th; //импульсы тахометра |
007 | int resultInput[49]; //массив значений входов |
008 | String stringOne = "" ; //основная строка |
009 | int i; //счетчик циклов |
010 | int x; //конвертор аналогового входа до 2-х вольт в цифровой (для ABS) |
011 | int ign; //вход зажигания |
012 | //******************************************************************** |
013 | void 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 | //******************************************************************** |
027 | void 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 | //******************************************************************** |
103 | void speedometr(){ //измеряем частоту на входе спидометра по прерыванию |
104 | sp=(900000.0/( micros() - micros_sp)); |
105 | micros_sp = micros(); |
106 | sz = 10; |
107 | } |
108 | //******************************************************************** |
109 | void tahometr(){ //измеряем частоту на входе тахометра по прерыванию |
110 | th=(2900000.0/( micros() - micros_th)); |
111 | micros_th = micros(); |
112 | tz = 10; |
113 | } |
для спидометра
на каждом прерывании делим 900000.0 () на число прошедших между прерыванием микросекунд.
sz - необходимо для того, что когда прерывание не будет или между сигналами будет очень долгий промежуток (а значит и не будет результата деления), через 10 циклов программы, значение спидометра (sh) станет равным 0. Если так не сделать, то при отсутсвии прерываний sp ,будет равнятся последнему результату деления.
для тахометра аналогично.
Почему 90000 - надо понять как посчитали.
Спасибо за разьяснение .
там спидометр дает 4 импульса на 1 оборот... пооэтому и 900000