2017-07-14 78 views
0

我目前正在编程居里纳米v2.0 arduino板。我需要以250hz的速率调用一个函数。一种做法是简单地延迟3或4毫秒以获得250Hz的近似值。Arduino时钟事件

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

这样做的一种方法是制作一个eventEmitter,它不断探测时钟并询问时间,如果期望的时间范围已过,则发送一个事件。但我怀疑这种方法在计算上会很沉重,总是在探测时钟。有人可以帮忙吗?

+0

请参阅下面的答案,它不需要额外的库,因此可能会更紧凑的代码大小。 – TomServo

回答

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

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

我得到这个错误。 sketch_jul14b:4:错误:预期构造,析构函数,或类型 '(' 令牌 SIGNAL(TIMER0_COMPA_vect)之前转换//中断处理程序 ^ 退出状态1 预期构造,析构函数,或类型转换之前 '(' 令牌 – user3630461

+0

@ user3630461我刚刚编辑,直接从跑步草图粘贴。 – TomServo