在嵌入式系統中,有一個幾乎無所不在、卻常常被低估的重要模組,就是 Timer(計時器)。無論是最基本的 LED 閃爍、系統運行時間統計,還是進階的 PWM 控制與週期性任務排程,都離不開 Timer 的運作。很多時候,我們在撰寫韌體時,只是「把 Timer 設起來讓它動」,但當遇到計時不準、頻率錯誤,或是系統行為異常時,才發現問題往往不是出在程式邏輯,而是對底層硬體運作理解不夠深入。
其實,Timer 的本質並不複雜,可以把它想像成一個搭配時脈(Clock)運作的計數器,就像日常生活中的碼表或鬧鐘一樣:時脈提供節奏,計數器負責累積,當達到某個條件時觸發對應的行為。
本篇文章將從硬體角度出發,說明 Timer 的基本運作原理、時脈來源與計時概念,並整理實務上常見的計時誤差原因,幫助韌體工程師建立更扎實的底層觀念,為後續實際應用(如 MCU Timer 設定與範例)打下基礎。
一、計時器使用概念
- 上數(Up Counter):從 0 開始累加,直到達到設定值
- 下數(Down Counter):從設定值開始往下遞減至 0
- 自動重載(Auto-reload):計數器自動回到初始值,持續週期性運作
- 單次模式(One-shot):計數完成後停止
Timer 的精準度取決於其時脈來源(Clock Source),而這些時脈通常來自實體振盪器(如晶振或內部 RC 振盪器),本質上仍會存在微小誤差,這些誤差在短時間內幾乎難以察覺,但隨著時間累積,可能會逐漸放大。例如:每秒僅有極小誤差,長時間運行後,可能累積成數秒甚至數分鐘的偏差。
- 晶振誤差(Frequency tolerance)
- 溫度影響(Temperature drift)
- 電壓變動(Voltage variation)
小故事
小時候,不論是指針式還是數位手錶,為了能夠準確掌握下課鐘聲,總會特別把時間對準。當鐘聲響起的那一刻,按下調整鍵,讓手錶與鐘聲同步,開始下一堂課休息的倒數。
而現在的手錶,多半支援 Wi-Fi 或藍牙,可以自動與網路時間同步,不需要再手動校正,也大幅降低了時間誤差累積的問題。
三、如何減少誤差
在這個部分首先要釐清問題的種類,因為 Timer 的誤差並不是單一原因造成,也沒有一種方法可以套用在所有情境。在實務上,應先判斷應用需求,再選擇合適的改善方式。以下常見分為三類
案例一、低精度週期應用
- Timer 設定錯誤(clock / prescaler)
- ISR 執行時間過長
- 確認 clock source 與分頻設定正確
- ISR 僅執行必要操作
- 避免使用 printf 或大量運算
案例二、長時間計時(RTC / System Time)
這類的應用主要是時間的長時間累積而導致的誤差
- 使用精度較高的晶振(Crystal / TCXO)
- 避免極端溫度與電壓變化
- 長時間運作時,定期校正時間
- 使用時間校正機制(如 RTC、NTP)
案例三、高穩定波形輸出(PWM)
常見問題:
- ISR 執行時間不固定
- 中斷延遲(latency)
- Duty cycle 抖動(jitter)
- 優先使用硬體 PWM 模組
- 減少 ISR 執行時間
- 避免在 ISR 中做複雜運算
- 使用示波器確認實際波形
- 確認操作 PWM 硬體的流程
結語
沒有留言:
發佈留言