подсчет количества оборотов с помощью щелевого оптического датчика
- Войдите на сайт для отправки комментариев
Сб, 25/02/2017 - 16:38
добрый день!
Програмированием занялся недавно, написал код для подчета оборотов вала на ардуино, обороты сичтаю с помощью щелевого оптического датчика.
Только возникла проблема, если при остановки вала когда ответрстие на диске попадет на щелевой датчик, ардуино начинает считатать с большой скоростью.
Помогите с кодом, что не так?
# define PIN 3 //вход с датчика #include <LCD5110_Basic.h> LCD5110 myGLCD(8, 9, 10, 11, 12); extern uint8_t SmallFont[]; extern uint8_t MediumNumbers[]; extern unsigned char BigNumbers[]; int schet = 0; // переменая для счетчика void setup() { pinMode(PIN, INPUT); digitalWrite(PIN, HIGH); //Инициализируем дисплей myGLCD.InitLCD(); } void loop() { bool hoot = ! digitalRead(PIN); delay(10); if (hoot) { schet++; } //выводим колличество myGLCD.setFont(BigNumbers); myGLCD.printNumI (schet, CENTER, 8); }
Ваш код не имеет вообще никаколго отношения к подсчету количества оборотов.
Для подсчета оборотов необходмо считать количество переходов сигнала из "0" в "1" (или наоборот), а не то, сколько раз Ваша программа читает с датчика единицу. Да еще и считывание производится с неизвестным периодом, т.к. в его длительность вносит вклад время отображения на дисплее.
тоесть мне нужно считать сколько переходов с 1 на 0 и 0 на 1
у меня одно отвестие в диске с которого он считывает, получается 2 перехода за один круг. верно?
Вам нужно считать либо один переход, либо другой. Оба - совершенно излишне.
Если в диске 1 отверстие, будет один переход. Количество переходов в единицу времени - и есть скорость вращения.
Если бы отверстий было бы больше, результат нужно было бы делить на количество отверстий.
Правильней наверное зацепть датчик на прерывание, для нано пин D2 и по прерыванию увеличивать счётчик?