Использование millis() для определения времени запуска/остановки двигателя постоянного тока
Я пытаюсь использовать двигатель постоянного тока с шестерней, соединенной с реечной передачей, и заставить этот двигатель пройти расстояние, сохранить расстояние, сделать задержку, дать задний ход и пройти то же расстояние с того места, где он начал, сделать задержку, сделать это снова. Я хочу запустить/остановить первоначальное сохранение нажатием кнопки, а затем из этих сохранений зациклить движение двигателя.
Я рассматривал возможность использования датчика Холла или геркона для подсчета, но, похоже, проще использовать программное прерывание или синхронизацию с использованием millis()
. Я провел исследование и обнаружил, что millis()
нельзя сбросить, поэтому мне интересно, возможно ли это.
Я не начал скетч, но эту идею я взял из примера скетча BlinkWithoutDelay, включенного в Arduino IDE. Например, установить двигатель в положение «домой», нажать кнопку, запустить таймер, двигатель переместится к концу заготовки, остановить таймер, сохранить пройденное расстояние вперед в переменную, повернуть двигатель в обратном направлении (в этот момент таймер снова будет на 0 для обратного хода), вернуться в «домой», сохранить пройденное расстояние назад в другую переменную нажатием кнопки, а затем использовать эти значения запуска/остановки в цикле. Поэтому я бы сохранил значения нажатием кнопки, а затем просто зациклил бы это.
Или я думаю о том, чтобы поместить нажатие кнопки if или while за пределы цикла с вложенным counter++
, визуально отслеживая перемещение мотора, и как только он достигает нужного мне значения, сохранять эти значения в переменных, а затем использовать их в цикле для analogWrite()
мотора.
@Jim, 👍0
Обсуждение1 ответ
Вы не можете сбросить функцию millis()
, но вы можете подсчитать количество миллисекунд и остановиться при необходимости: однако будьте осторожны, позиционирование может быть не таким точным, как вам хотелось бы, и вам следует учитывать, что ошибка будет накапливаться в долгосрочной перспективе.
Тем не менее, вот код:
uint16_t duration;
bool direction = true;
void loop() {
if (duration != 0 and !buttonPressed()) {
// запуск вперед и назад, если установлена настройка и кнопка «завершить» не обнаружена
uint16_t start = millis(); // сбросить таймер
startMotor(direction);
while (millis() - start < duration && !buttonPressed()) {
; // продолжать идти
}
direction = !direction; // обратное направление
} else if (duration == 0) {
// настройка позиционирования вашего двигателя
while (!buttonPressed()) {
; // ждем, пока кнопка начнет позиционирование
}
uint16_t start = millis(); // запросить время
startMotor(true); // запустить двигатель по часовой стрелке
while (!buttonPressed()) {
; wait for button to end positioning
}
duration = millis() - start; // сохранить продолжительность
direction = false; // изменить направление движения двигателя
// при следующем выполнении loop() двигатель вернется домой
}
}
bool buttonPressed() {} // определите это, чтобы определить, была ли нажата кнопка, безопаснее использовать прерывание
void startMotor(bool cw) {} // определите это, чтобы запустить двигатель по часовой стрелке или против часовой стрелки
- Как справиться с rollover millis()?
- Использование millis() и micros() внутри процедуры прерывания
- ардуино - миллисекунды ()
- Кнопка с таймером переключения и функцией сброса времени + светодиод обратной связи
- Использовать timer0, не влияя на millis() и micros().
- Торговый автомат Arduino для мониторинга ввода монет в слот во время ожидания ввода пользователя
- Влияет ли `millis()` на длинные ISR?
- nodeMCU — Millis() — Простой счетчик — Как долго горит светодиод?
Комментарии не предназначены для расширенного обсуждения; эта беседа была [перенесена в чат](http://chat.stackexchange.com/rooms/72199/discussion-on-question-by-jim-using-millis-to-time-the-start-stop-of-aa-dc)., @Nick Gammon
Комментарии под вопросом предназначены для **уточнения вопроса**, а также для ответа OP на такие запросы на разъяснение. Например, «какой у вас тип Arduino?». Они не предназначены для расширенной отладки проблемы. Это не форум. Если вы (Джим) хотите уточнить свой вопрос, пожалуйста, отредактируйте вопрос, чтобы сделать это., @Nick Gammon