Как использовать сервопривод в прерывании?

Сейчас я работаю над небольшой схемой, в которой увеличиваю вращение серводвигателя и одновременно мигаю светодиодом.

Я использовал все известные мне методы, но он все равно не работает или мигает, а затем сервопривод начинает работать, но никогда оба одновременно. Вот с чем я в основном работаю:

  for(position=0;position<=90;position=position+5){
    digitalWrite(led_pin,HIGH);
    delay(200);
    digitalWrite(led_pin,LOW);
    delay(200);
    servoBar.write(position);
    delay(15);
  }

Но он мигнет один раз, а затем перестанет, и сразу после этого сервопривод начнет работать.

Я знаю, что нельзя использовать задержки в прерываниях. Я использую функцию, которую могу, но просто для того, чтобы показать вам, с чем я работаю.

, 👍1


2 ответа


3

Проблема в том, что процедура задержки блокируется. Он останавливает работу и блокирует другие события. Взгляните на пример «Мигание без задержки» на вкладке «Пример». (также ссылка ниже) https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Что вам нужно сделать, так это не блокировать. Часто вызывайте программу проверки времени и проверяйте, не истекло ли время, которое вы хотите отложить. Выполните действие, которое необходимо было выполнить в данный момент.

Это более сложный способ обработки синхронизированных событий. Также посмотрите это Демонстрационный код для нескольких задач одновременно. https://forum.arduino.cc/index.php?topic=223286.0

Учитесь с удовольствием. :)

,

Если вам нужна механика синхронизации прерывания, вам нужно создать очень тонкую процедуру loop(), которая только проверяет, установлен ли ваш собственный флаг «переместить сервопривод». Если да, удалите флаг и переместите сервопривод, а прерывание используйте только для установки флага., @towe


0

Хорошим способом управления временем без задержек является использование:

if(millis()-lastCheck > delayPeriod){
lastCheck=millis();
doStuffHereOrChangeServo();
}

Этот код естественным образом защищен от переполнения, и на самом деле именно так работает функция задержки. Разница в том, что функция задержки() использует цикл while(), который прерывается при выполнении этого условия, поэтому он предотвращает запуск любого кода после задержки ДО тех пор, пока задержка не завершится. Вот почему в вашем коде возникают странные паузы.

Кстати, на самом деле это интересный проект по созданию простого планировщика задач, который использует список указателей на функции и вариацию этого метода для выполнения абсолютно общего планирования. Если вы хотите попробовать этот маршрут, вам следует сохранить структуру, содержащую указатель функции и целое число с подписанным, превышающее максимально предполагаемый размер задержки. Затем при каждом вызове планировщика вы вычитаете разницу между millis() и сохраненным значением millis() из каждого из этих целых чисел в структуре. Как только оно станет отрицательным или нулевым, задачу можно будет запустить!

,