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

Другие вопросы по тегам