Отслеживание -удержания вала (attachInterrupt/detachInterrupt). Все работает-но есть нюанс. И вопрос.

mu_ssina
Offline
Зарегистрирован: 30.08.2013

Всем доброго!

Есть такой код, который отслеживает было ли удержание вращающегося вала микродвигателя.

Отслеживание происходит при помощи цифрового датчика Холла и магнитика на валу.

Практически все ок, все работает.

Но в чем проблема: если было короткое удержание вала, и сразу движок рестартил в другую сторону, но удержание сохраняется(и соответственно значение цифрового датчика Холла не изменилось) - он считает, что никакого удержания нет. И продолжает подавать напругу на движок(удерживаемый) -пока тот не сгорит :-)

ВОПРОС: как бы мне изменить код, чтобы и эта ситуация учитывалась? Спасибо!

 

 

 


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()

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Тринамик для определения хода использует абсолютный энкодер, например, а не датчик Холла.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Использовать несколько датчиков, тогда можно понять направление вращения. И если оно изменилось (а не должно) - вырубить питание. 

mu_ssina
Offline
Зарегистрирован: 30.08.2013

Все, вопрос решен. Решил совершенно по-другому, попутно упростив код ;-). Так что вопрос закрыт.