Помогите новичку разобраться в коде
- Войдите на сайт для отправки комментариев
Вс, 26/10/2014 - 23:17
Объясните пожалуйста новичку, принцип вычисления в функции 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;
}
для спидометра
на каждом прерывании делим 900000.0 () на число прошедших между прерыванием микросекунд.
sz - необходимо для того, что когда прерывание не будет или между сигналами будет очень долгий промежуток (а значит и не будет результата деления), через 10 циклов программы, значение спидометра (sh) станет равным 0. Если так не сделать, то при отсутсвии прерываний sp ,будет равнятся последнему результату деления.
для тахометра аналогично.
Почему 90000 - надо понять как посчитали.
Спасибо за разьяснение .
там спидометр дает 4 импульса на 1 оборот... пооэтому и 900000