Как остановить двигатель через заданное время?

Я пытаюсь остановить двигатель постоянного тока через заданное время !! И мотор заводится при достижении состояния!! С этого самого момента я хочу, чтобы мой мотор просто поработал 5 секунд и остановился!! Ниже приведен псевдокод:

 #define max 150
 #define min -150
 #define pin1 3
 void setup()
    {
        Serial.begin(9600);
         mpu.initialise();
     }
   void loop()
     { 
        x= some_accelerometer_values;
         If (x>250)
            { 
                analogWrite(pin1,255);
                delay(5000);
                exit(0);
             }
      }

Я пробовал использовать millis(), но он начинается с выполнения программы, и я не могу реализовать его непосредственно перед запуском двигателя!

, 👍-1

Обсуждение

1. Не используйте exit(0) на микроконтроллере. Нет ОС, которая могла бы взять на себя управление после окончания программы. Лучше используйте бесконечный цикл, если вы хотите завершить программу и больше ничего не делать., @chrisl

2. Вы поняли пример BlinkWithoutDelay, который поставляется с Arduino IDE? Я довольно хорошо объясняю использование millis(). Вы берете временную метку (значение millis()), когда возникает условие запуска, а затем вычисляете разницу между текущим значением millis() и временной меткой и сравниваете ее с 5 с (5000 мс)., @chrisl

Недурно за выход(0); информация !! Я этого не знал, и это не работало !! Но миллис(); это хлопотно!! Идет отсчет времени с момента запуска программы !! И не с момента запуска мотора!!, @Hrithik Baishakhiya

@HrithikBaishakhiya Вы можете использовать переменную, чтобы сохранить время запуска двигателя. Затем всегда проверяйте разницу между текущим моментом и моментом запуска двигателя. А если разница >= то 5 секунд он выключается, @Zunzulla alagaty

Но миллис(); это хлопотно!! Идет отсчет времени с момента запуска программы !! И не с момента запуска мотора!! ..... как сварить яйцо 3 минуты по часам, без таймера?, @jsotola


1 ответ


0

Предполагая, что вы включаете двигатель с помощью analogWrite(pin1, 255); просто напишите analogWrite(pin1, 0); после delay(5000); .

И использование exit(0); не так уж и плохо, как люди, скорее всего, скажут. Использование exit(0) аналогично cli(); + while(1). Таким образом, он отключает прерывания и помещает ваш код в цикл while, пока вы не перезагрузите Arduino.

,

Но если x какое-то время остается больше 250, то он будет работать до тех пор, пока x < 250!!, @Hrithik Baishakhiya

@HrithikBaishakhiya, так как вы использовали выход(0); вы хотите, чтобы ваш код запускался только один раз. А если вы напишете AnalogWrite(pin1, 0); перед выходом (0) ваш мотор выключится. Тогда программа остановится и не будет спрашивать, больше х 250 или нет., @Zunzulla alagaty

@HrithikBaishakhiya if() запускается по условию и будет выполняться только один раз за цикл(), @Zunzulla alagaty

Я уважаю ваши усилия!! Но не рекомендуется использовать exit(0); как написано в некоторых контекстах и предложено Крислом выше !! Я тут немного запутался!!, @Hrithik Baishakhiya

@HrithikBaishakhiya, насколько я знаю, выход(0); отключает прерывания и переводит Arduino в цикл while(1). Я только что попробовал это на своем Arduino-Uno. Это по сути цикл(), но с отключением прерываний., @Zunzulla alagaty