我目前正在編程居里納米v2.0 arduino板。我需要以250hz的速率調用一個函數。一種做法是簡單地延遲3或4毫秒以獲得250Hz的近似值。Arduino時鐘事件
是否有庫或某些時鐘事件可以觸發每4ms發送一個事件,從而運行我需要的功能或任何其他智能方法,而無需使用delay()函數。
這樣做的一種方法是製作一個eventEmitter,它不斷探測時鐘並詢問時間,如果期望的時間範圍已過,則發送一個事件。但我懷疑這種方法在計算上會很沉重,總是在探測時鐘。有人可以幫忙嗎?
我目前正在編程居里納米v2.0 arduino板。我需要以250hz的速率調用一個函數。一種做法是簡單地延遲3或4毫秒以獲得250Hz的近似值。Arduino時鐘事件
是否有庫或某些時鐘事件可以觸發每4ms發送一個事件,從而運行我需要的功能或任何其他智能方法,而無需使用delay()函數。
這樣做的一種方法是製作一個eventEmitter,它不斷探測時鐘並詢問時間,如果期望的時間範圍已過,則發送一個事件。但我懷疑這種方法在計算上會很沉重,總是在探測時鐘。有人可以幫忙嗎?
您可以使用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
你可以添加一箇中斷,這已經爲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;
}
}
我得到這個錯誤。 sketch_jul14b:4:錯誤:預期構造,析構函數,或類型 '(' 令牌 SIGNAL(TIMER0_COMPA_vect)之前轉換//中斷處理程序 ^ 退出狀態1 預期構造,析構函數,或類型轉換之前 '(' 令牌 – user3630461
@ user3630461我剛剛編輯,直接從跑步草圖粘貼。 – TomServo
請參閱下面的答案,它不需要額外的庫,因此可能會更緊湊的代碼大小。 – TomServo