Arduino定時器
每個微控制器都具有一個或多個定時器,可幫助使用者以精確的時間間隔執行任務。例如,Arduino Uno 有 3 個定時器:Timer0、Timer1 和 Timer2。其他開發板可能具有相同或不同數量的定時器,您可以從該開發板/微控制器的規格書中找到。
什麼是定時器?
定時器本質上是計數器。讓我舉一個簡單的例子。假設您想每 5 秒觸發一次任務。現在,如果您有一個可以從 0 計數到 255 的計數器,那麼如果您以某種方式調整計數速率,使其正好在 5 秒內完成計數,那麼您可以獲得 5 秒的精確間隔。現在,您可以透過兩種方式做到這一點:
- 您可以調整計數速度(每 19 毫秒計數一次,或 51.2 Hz 的計數頻率將使您獲得 5 秒的間隔)。
- 或者,您可以調整停止點。因此,您可以讓定時器從 0 計數到 100,或從 155 計數到 255,而不是從 0 計數到 255,然後所需的頻率將為 20 Hz(這比 51.2 更“好看”)。
但是,所有這些設定都需要對 Arduino 的內部暫存器進行一些更改。幸運的是,已經構建了可以自行處理所有這些設定的庫。我們只需要定義我們希望定時器執行的時間段即可。一個流行的例子是 **TimerOne** 庫:https://github.com/PaulStoffregen/TimerOne
我們在另一篇關於 Arduino 中定時器中斷的文章中介紹了 **TimerOne** 庫的使用。
當您有 delay 函式時,為什麼要使用定時器?
您現在可能會有這個問題。如果您希望每 1 秒執行某個任務,那麼只需新增 1 秒的延遲並在迴圈中執行該任務即可。問題在於,這並沒有考慮執行任務所需的時間。
假設您正在執行的任務需要 100 毫秒的執行時間。因此,兩次連續任務例項之間將會有(100 毫秒執行時間 + 1 秒延遲 = 1.1 秒)的間隔。這會擾亂頻率。定時器在後臺繼續執行。從 0 計數到 255 後,它將再次從 0 開始計數,而您的任務正在執行。這樣,您可以確保兩次任務例項之間具有正確的間隔,而不管任務的執行時間如何。
您唯一需要確保的是,在觸發中斷時呼叫的函式的執行時間不高於間隔週期。通常,中斷函式應該儘快返回。
廣告