Arduino时钟事件

时间:2017-07-14 10:14:27

标签: loops arduino frequency

我目前正在编写curie nano v2.0 arduino board。我需要以250hz的速率调用函数。一种方法是简单地延迟3或4毫秒以获得250hz的近似值。

是否有库或某个时钟事件可以触发每4ms发送一个事件,从而运行我需要的功能或任何其他智能方法而不使用delay()函数。

这样做的一种方法是创建一个eventEmitter,它不断探测时钟并询问时间,如果需要时间帧,则发送一个事件。但我怀疑这种方法计算量很大,总是在探测时钟。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

您可以使用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()无法实现。

Reference to CurieTimeOne libary at official Arduino website

答案 1 :(得分:0)

您可以为已经为millis()运行的计时器添加一个中断,这会产生非常低的开销。这是一个基于中断的示例,它允许您的代码执行其他操作,除非4ms计时器已经过去。这样做的好处是无需额外的库,代码更小。如果您以前从未探索过中断,那么它也是对硬件级别中断的一个小介绍。

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;
  }
}