Подсчет оборотов.
- Войдите на сайт для отправки комментариев
Вс, 15/07/2012 - 12:49
Есть программа показывающая время с начала включения и количество оборотов в минуту. Подскажите пожалуйста как мне еще сделать чтоб она показывала общий пройденый путь( количество всех импульсов счас они сбрасывается каждую секунду). Никак не догоню как мне rpmcount сохранить
volatile byte rpmVse; volatile byte rpmcount; unsigned int rpm; // сохраняем обороты unsigned long timeold; // сохраняем время старое int mMin; #include <LiquidCrystal.h> // библиотека экрана // initialize the library with the numbers of the interface pins LiquidCrystal lcd(7, 8, 9, 10, 11, 12); void setup() { Serial.begin(9600); lcd.begin(16, 2); // инициализируем дисплей //Interrupt 0 is digital pin 2, so that is where the IR detector is connected //Triggers on FALLING (change from HIGH to LOW) attachInterrupt(0, rpm_fun, FALLING);// функция прерывания только при смене значения с 1 на 0 rpmVse = 0; rpmcount = 0; rpm = 0; timeold = 0; } void loop() { //Обновляем значения каждую секунду delay(1000); //Don't detachInterrupt(0); // порт //Если прерывание будет происходить один раз за оборот тогда 60*1000/(millis() - timeold)*rpmcount //если количество пребываний больше, то просто делим количество секунд в минуте на количество //прерываний за один оборот. rpm = 60*1000/(millis() - timeold)*rpmcount; timeold = millis(); rpmcount = 0; //Выводим результат на дисплей lcd.clear(); lcd.print("RPM="); lcd.print(rpm); //rpm = mMin; mMin = rpm*3/100; // метры в минуту если на 60 Serial.print(mMin);Serial.print("M/m"); //Перезапустить процесс прерывания attachInterrupt(0, rpm_fun, FALLING); } void rpm_fun() { //обновляем счетчик rpmcount++;// прибавляем единицу к полученому }
Извиняюсь скинул код без часов но это не так важно.
Можно просто закомментировать 38 строку. но тогда останется много не нужного мусора.
Ниче не понял. я хочу одновременно и замерять скорсоть и считать количество оборотов (растояние)
Пропустил слово "еще", тогда как то так:
Спасибо за помощь. Мучался мучался и пришел к такомуже решению хотя почемуто раньше у меня так не работало наверное не то делал. Добавил переменную как и у вас. Спасибо еще раз.
Если вы оставите отключение прерывания, то может случиться так, что прерывание выключено и в этот момент произайдет срабатывание, которое не будет зафиксировано... и данные будут не точны.
Вы про 21 строку????
Нет, про 44
Ну для меня в начаое такая погрешность не страшна. Это код как часть проекта по изготовлению телеметрии на радиоуправляюмую машинку там будет практически беспрерывное использование по 25 минут так что думаю ничего не пропустим.
У вас каждую секунду на нескалько миллисекунд отключается обработка прерываний, так что если ваша машинка будет ездить больше 1 секунды, то то шанс попасть в эти несколько миллисекунд есть.
Все убрал. Часть кода нашел в инете сидел вчера разбарался честно говоря думал что это совсем другое значение . Посмотрел в справочнике не пойму для чего это сделали. Спасибо за подсказку