Отслеживание -удержания вала (attachInterrupt/detachInterrupt). Все работает-но есть нюанс. И вопрос.
- Войдите на сайт для отправки комментариев
Втр, 28/07/2020 - 16:48
Всем доброго!
Есть такой код, который отслеживает было ли удержание вращающегося вала микродвигателя.
Отслеживание происходит при помощи цифрового датчика Холла и магнитика на валу.
Практически все ок, все работает.
Но в чем проблема: если было короткое удержание вала, и сразу движок рестартил в другую сторону, но удержание сохраняется(и соответственно значение цифрового датчика Холла не изменилось) - он считает, что никакого удержания нет. И продолжает подавать напругу на движок(удерживаемый) -пока тот не сгорит :-)
ВОПРОС: как бы мне изменить код, чтобы и эта ситуация учитывалась? Спасибо!
void sensor_impulse() { lasttime = millis(); //последнее время, когда произошло прерывание shaft_state = 1; } void setup() { attachInterrupt(4, sensor_impulse, CHANGE); } void loop() { //этот кусок кода отслеживает-было ли удержание вала--------------------------------- detachInterrupt(4); if ((shaft_state) && (millis() - lasttime > SENSOR_MIN_TIME)) { shaft_state = 0; //вал остановлен } attachInterrupt(4, sensor_impulse, CHANGE); static bool lastshaft_state = 1; //начальное значение. Считаем что вал изначально крутится. if (lastshaft_state!=shaft_state) { lastshaft_state=shaft_state; if (!shaft_state)//если вал остановлен, т.е. "0" { //Serial.println ("вал остановлен"); //-----------------------------Если вал рестартит с большими промежутками между ними-все ОК---------------- if (!IsRestarting) { Restarter (MOTOR_STOPPER_TIME);//быстро перезапуститься в другую сторону после остановки } if ((millis()-Motor_restart_time)>=RESTART_PERIOD) { restart_counter =0; } else { restart_counter = restart_counter+1; Serial.println ("попытка рестарта!"); if (restart_counter>=3) { Serial.println ("удержание!"); Restarter (Long_wait_period); restart_counter =0; } } } } }//void loop()
Тринамик для определения хода использует абсолютный энкодер, например, а не датчик Холла.
Использовать несколько датчиков, тогда можно понять направление вращения. И если оно изменилось (а не должно) - вырубить питание.
Все, вопрос решен. Решил совершенно по-другому, попутно упростив код ;-). Так что вопрос закрыт.