Arduino定时器中断:修訂版本之間的差異

出自YFRobotwiki
跳轉到: 導覽搜尋
参考资料
 
(由1名用戶作出的一個中途修訂版本未被顯示)
第 76 行: 第 76 行:
 
 在编写Arduino并使用使用定时器的函数或库时,您可能会遇到一些陷阱。
 
 在编写Arduino并使用使用定时器的函数或库时,您可能会遇到一些陷阱。
  
 伺服库使用Timer1。在Arduino上使用伺服库时,不能在引脚9,10上使用PWM。对于Arduino Mega来说,它有点困难。所需的计时器取决于伺服器的数量。每个计时器可以处理12个伺服系统。对于前12个伺服系统,将使用定时器5(在引脚44,45,46上松开PWM)。对于24伺服定时器,将使用定时器5和1(在引脚11,12,44,45,46上松开PWM)。对于36个伺服定时器5,将使用1和3(在引脚2,3,5上丢失PWM, 11,12,44,45,46)..对于48个伺服系统,将使用所有16​​位定时器5,1,3和4(丢失所有PWM引脚)。
+
* 伺服库使用Timer1。
 引脚11具有共用功能PWM和MOSI。 SPI接口需要MOSI,Arduino上不能同时使用引脚11上的PWM和SPI接口。在Arduino Mega上,SPI引脚位于不同的引脚上。
+
**  在Arduino上使用伺服库时,不能在引脚9,10上使用PWM。
tone()函数至少使用timer2。当您在Arduino Mega上使用Arduino和Pin 9,10的tone()函数时,不能在引脚3,11上使用PWM。
+
**  对于Arduino Mega来说,它有点困难。所需的计时器取决于伺服器的数量。每个计时器可以处理12个伺服系统。对于前12个伺服系统,将使用定时器5(在引脚44,45,46上松开PWM)。对于24伺服定时器,将使用定时器5和1(在引脚11,12,44,45,46上松开PWM)。对于36个伺服定时器5,将使用1和3(在引脚2,3,5上丢失PWM, 11,12,44,45,46)..对于48个伺服系统,将使用所有16​​位定时器5,1,3和4(丢失所有PWM引脚)。
 +
 
 +
* 引脚11具有共用功能PWM和MOSI。 SPI接口需要MOSI,Arduino上不能同时使用引脚11上的PWM和SPI接口。在Arduino Mega上,SPI引脚位于不同的引脚上。
 +
* tone()函数至少使用timer2。当您在Arduino Mega上使用Arduino和Pin 9,10的tone()函数时,不能在引脚3,11上使用PWM。
 +
 
 +
 
 +
 
 +
 
 +
===参考资料===
 +
<br>
 +
* [https://www.pipipi.net/diy/1030.html Arduino定时器和中断的使用]
 +
 
 +
 
 +
----
 +
 
 +
 
 +
[[首页 | 返回首页]]
 +
 
 +
更多建议和问题欢迎反馈至 [http://www.yfrobot.com YFRobot论坛]

2019年7月18日 (四) 18:10的最新修訂版本

當你想讓代碼在一個固定的時間間隔後執行時,你可以很容易的用delay()函數來實現。但是,這只是讓程序暫停一個特定的時間段。特別是如果你需要同時讓處理器做其他處理時,這麼做同時也是一種浪費

這時候就是定時器(Timer)和中斷(Interrupt)的用武之地了。

Arduino UNO有三個timer

  • timer0 - 一個被Arduino的 delay() ,millis() 和 micros()使用的8位定時器 
  • timer1 - 一個被Arduino的 Servo()庫使用的16位定時器(Servo 庫在Arduino Mega上使用timer5)
  • timer2 - 一個被Arduino的 Tone()庫使用的8位定時器 

"Arduino Mega"板有另外三個可使用的timer3/4/5,這些定時器都是16位定時器。



PWM和定時器 定時器和PWM輸出之間存在固定的關係。 當您查看數據手冊或處理器的引腳分配時,這些具有PWM功能的引腳具有OCRxA,OCRxB或OCRxC等名稱(其中x表示定時器編號0..5)。PWM功能通常與其他引腳功能共享。 Arduino有3個定時器和6個PWM輸出引腳。定時器和PWM輸出之間的關係是:

  • 引腳5和6:由timer0控制
  • 引腳9和10:由timer1控制
  • 引腳11和3:由timer2控制

在Arduino Mega上我們有6個定時器和15個PWM輸出:

  • 引腳4和13:由timer0控制
  • 引腳11和12:由timer1控制
  • 引腳9和10:由timer2控制
  • 引腳2,3和5:由定時器3控制
  • 引腳6,7和8:由定時器4控制
  • 引腳46,45和44 ::由定時器5控制

在以下的例子中,我們將在我們的中斷使用timer1。顯然,如果你用了Servo()庫就會有衝突,所以你應該選擇其他timer。

下面是一個基本的中斷驅動程序。這是基本的LED閃光燈程序。但是現在我們用中斷而不是delay()來每半秒開啟和關閉LED燈一次,從而實現讓LED每秒閃一次的效果。

/*
  timer1 中断实例
  LED闪光灯每秒闪亮一下
*/

#define ledPin 13     //设置输出口为13口
int timer1_counter;

void setup() {

  pinMode(ledPin, OUTPUT);

  //初始化定时器1
  noInterrupts(); //禁止所有中断
  TCCR1A = 0;
  TCCR1B = 0;

  //为我们的中断设置timer1_counter为正确的时间间隔
  // timer1_counter = 64911;    //预加载timer1为65536-16MHz/256/100Hz
  // timer1_counter = 64286;    //预加载timer1为65536-16MHz/256/50HZ
  timer1_counter = 34286;     //预加载timer1为65536-16MHz/256/2Hz
  TCNT1 = timer1_counter;     //预加载timer
  TCCR1B |= (1 << CS12);      //256 分频器(256 prescaler?)
  TIMSK1 |= (1 << TOIE1);     //启用定时器溢出中断
  interrupts();               //允许所有中断
}

ISR(TIMER1_OVF_vect) {        //常规中断服务
  TCNT1 = timer1_counter;     //预加载timer digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
}

void loop() {
  //你自己的程序
}


陷阱

在編寫Arduino並使用使用定時器的函數或庫時,您可能會遇到一些陷阱。

  • 伺服庫使用Timer1。
    • 在Arduino上使用伺服庫時,不能在引腳9,10上使用PWM。
    • 對於Arduino Mega來說,它有點困難。所需的計時器取決於伺服器的數量。每個計時器可以處理12個伺服系統。對於前12個伺服系統,將使用定時器5(在引腳44,45,46上鬆開PWM)。對於24伺服定時器,將使用定時器5和1(在引腳11,12,44,45,46上鬆開PWM)。對於36個伺服定時器5,將使用1和3(在引腳2,3,5上丟失PWM, 11,12,44,45,46)..對於48個伺服系統,將使用所有16​​位定時器5,1,3和4(丟失所有PWM引腳)。
  • 引腳11具有共用功能PWM和MOSI。 SPI介面需要MOSI,Arduino上不能同時使用引腳11上的PWM和SPI介面。在Arduino Mega上,SPI引腳位於不同的引腳上。
  • tone()函數至少使用timer2。當您在Arduino Mega上使用Arduino和Pin 9,10的tone()函數時,不能在引腳3,11上使用PWM。



參考資料





返回首頁

更多建議和問題歡迎反饋至 YFRobot論壇