Отслеживание -удержания вала (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()
Тринамик для определения хода использует абсолютный энкодер, например, а не датчик Холла.
Использовать несколько датчиков, тогда можно понять направление вращения. И если оно изменилось (а не должно) - вырубить питание.
Все, вопрос решен. Решил совершенно по-другому, попутно упростив код ;-). Так что вопрос закрыт.