Arduino часы событие
В настоящее время я программирую плату curie nano v2.0 arduino. И мне нужно вызывать функцию со скоростью 250 Гц. Один из способов сделать это - установить задержку в 3 или 4 миллисекунды, чтобы получить приблизительное значение 250 Гц.
Существует ли библиотека или какое-либо событие синхронизации, которое может запускать каждые 4 мсек, посылая событие и, таким образом, запускать нужную мне функцию или любой другой интеллектуальный метод без использования функции delay().
Один из способов сделать это - создать событие EventEmitter, которое постоянно проверяет часы и запрашивает время, и, если желаемый таймфрейм прошел, отправляет событие. Но я подозреваю, что этот метод будет сложным в вычислительном отношении, всегда проверяя время. Может кто-нибудь помочь?
2 ответа
Вы можете добавить прерывание к таймеру, который уже работает millis()
, что влечет за собой очень низкие накладные расходы. Вот пример на основе прерываний, который позволяет вашему коду делать другие вещи, кроме тех случаев, когда таймер 4 мс истек. Преимущество в том, что дополнительные библиотеки не нужны, меньший размер кода. Это также небольшое введение в прерывания на аппаратном уровне, если вы никогда не исследовали это раньше.
volatile uint8_t reduce4 = 0; // used to get 4 ms
volatile uint8_t timerAlert = LOW; // flag that tells you 4ms is up
void setup() {
pinMode(12, OUTPUT); // an output pin just for testing on my oscilloscope
OCR0A = 0xAF; // set up interrupt
TIMSK0 |= _BV(OCIE0A);
}
SIGNAL(TIMER0_COMPA_vect) // interrupt handler
{
reduce4++;
if (reduce4 == 4)
{
timerAlert = HIGH; // only fire every 4th time
reduce4 = 0;
}
}
void loop()
{
if (timerAlert == HIGH)
{
digitalWrite(12, !digitalRead(12));
// DO OTHER STUFF
timerAlert = LOW;
}
}
Вы могли бы использовать CurieTimerOne
библиотека для этого и его метод CurieTimerOne.start(int timerPeriodUsec, userCallBack)
,
Вот пример кода:
#include "CurieTimerOne.h"
bool ledState = false;
#define LED_PIN 13
// callback which toggles the LED
void blinkProc()
{
digitalWrite(LED_PIN, ledState);
ledState = !ledState; // change state.
}
void setup()
{
pinMode(LED_PIN, OUTPUT);
// 4000us is 4ms or 250Hz.
CurieTimerOne.start(4000, blinkProc);
}
void loop()
{
// do other stuff.
}
Что хорошо с использованием таймеров (прерываний), так это то, что ваша функция будет вызываться с той частотой, которую вы хотите, что невозможно с delay()
,
Ссылка на библиотеку CurieTimeOne на официальном сайте Arduino