Как остановить двигатель через заданное время?
Я пытаюсь остановить двигатель постоянного тока через заданное время !! И мотор заводится при достижении состояния!! С этого самого момента я хочу, чтобы мой мотор просто поработал 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(), но он начинается с выполнения программы, и я не могу реализовать его непосредственно перед запуском двигателя!
@Hrithik Baishakhiya, 👍-1
Обсуждение1 ответ
Предполагая, что вы включаете двигатель с помощью 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
- Две батареи делят землю?
- Остановка двигателя постоянного тока с двумя концевыми выключателями
- Релейный модуль для водяного насоса
- Сервопривод продолжает сбрасывать положение, когда нет разницы в полученном значении?
- Использую nRF2401, и в передатчике и приемнике Rx не мигает, а Tx мигает; почему Rx не мигает?
- Использование прерывания внутреннего таймера для чтения аналогового датчика
- Работа двигателя в течение 3 секунд непрерывно с прерыванием и без него
- Перегорают ли мои шаговые двигатели? В чем здесь проблема?
1. Не используйте exit(0) на микроконтроллере. Нет ОС, которая могла бы взять на себя управление после окончания программы. Лучше используйте бесконечный цикл, если вы хотите завершить программу и больше ничего не делать., @chrisl
2. Вы поняли пример BlinkWithoutDelay, который поставляется с Arduino IDE? Я довольно хорошо объясняю использование
millis(). Вы берете временную метку (значениеmillis()), когда возникает условие запуска, а затем вычисляете разницу между текущим значениемmillis()и временной меткой и сравниваете ее с 5 с (5000 мс)., @chrislНедурно за выход(0); информация !! Я этого не знал, и это не работало !! Но миллис(); это хлопотно!! Идет отсчет времени с момента запуска программы !! И не с момента запуска мотора!!, @Hrithik Baishakhiya
@HrithikBaishakhiya Вы можете использовать переменную, чтобы сохранить время запуска двигателя. Затем всегда проверяйте разницу между текущим моментом и моментом запуска двигателя. А если разница >= то 5 секунд он выключается, @Zunzulla alagaty
Но миллис(); это хлопотно!! Идет отсчет времени с момента запуска программы !! И не с момента запуска мотора!!..... как сварить яйцо 3 минуты по часам, без таймера?, @jsotola