計時器是嵌入式系統中不可或缺的元件,用於精確計時和觸發特定事件。要正確設定計時器,需要了解其底層硬體架構和相關暫存器的功能。設定暫存器決定時鐘源和計數模式,預分頻器用於降低時脈頻率,控制暫存器啟動和重置計時器,而中斷暫存器則管理計時器中斷。理解這些暫存器的作用是設定計時器的關鍵。此外,計算中斷頻率需要考慮時鐘輸入、預分頻器和比較暫存器的值,並根據目標頻率調整這些引數。位元數決定了計時器的計數範圍,例如 8 位元計時器最大計數值為 255。掌握這些數學基礎對於精確控制計時器至關重要。
設定計時器
計時器是一種常見的外設,允許我們根據特定的時間間隔執行特定的任務。要設定計時器,需要組態幾個重要的暫存器,包括設定暫存器、預分頻器暫存器、控制暫存器和中斷暫存器。
設定暫存器
設定暫存器用於指定計時器的時鐘源。有些處理器允許將時鐘連線到輸入引腳,而其他的可能只有系統時鐘可用。您可以選擇計數方式,例如計數上或計數下。在這些範例中,我們將使用計數上,但過程對於計數下也是相似的。
預分頻器暫存器
如圖 4-8 所示,預分頻器暫存器減少快速來自時鐘的訊號,使其執行得更慢,允許計時器對較慢的事件做出反應。
控制暫存器
控制暫存器設定計時器在組態後開始計數。通常,控制暫存器還有方法可以重置計時器。
中斷暫存器
如果您有計時器中斷,則需要使用適當的中斷暫存器啟用、清除和檢查每個計時器中斷的狀態。
計時器設定
設定計時器是處理器特有的,因此使用者手冊通常會引導您完成設定每個暫存器的過程。您的處理器使用者手冊可能會給暫存器稍微不同的名稱。瞭解如何使用計時器的一種好方法是檢視晶片供應商的示例程式碼:它通常包括幾個組態計時器的示例。您應該逐行瀏覽示例程式碼,並在前面放置資料表,以確保您瞭解計時器如何組態。
數學基礎
要組態計時器,需要進行一些數學計算。請隨意瀏覽或跳過此部分,稍後當您需要數學知識時再回來。另外,您也可以檢視本文的 GitHub 儲存函式庫,其中有一些計算器可以讓您在不需要遵循我這裡的代數的情況下進行這些計算。
計時器是為了處理物理時間尺度而設計的,因此您需要將一系列暫存器與實際時間相關聯。請記住,頻率(例如 10 Hz)與週期(例如 0.1 秒)成反比。
基本方程式如下: [ 中斷頻率 = \frac{時鐘輸入}{(預分頻器 \times 比較暫存器)} ]
這是一個最佳化問題。您知道時鐘輸入和目標中斷頻率,您需要調整預分頻器和比較暫存器,直到中斷頻率接近目標。但是,由於存在其他限制,這個問題並不總是容易解決。
位元數與最大值
瞭解位元數與最大值之間的關係非常重要。如果您不習慣計算 2 的冪,那麼您應該記住一些 2 的冪。
一個變數可以具有的不同值的數量是 2 的位元數次方(例如,8 位元提供 2^8,即 256 個不同值)。但是,這個數字必須包含 0,因此 8 位元變數的最大值是 2^8 - 1,即 255。但是,這只對於無符號變數才是正確的。有符號變數使用一位元來表示符號(+/–),因此 8 位元變數只有 7 位元可用於值,其最大值是 2^7 - 1,即 127。最小值是 -128,因為 0 只能被表示一次。
| 位元數 | 2 的冪 | 最大值 | 意義 |
|---|---|---|---|
| 4 | 2^4 = 16 | 15 | 一個 nibble |
| 7 | 2^7 = 128 | 127 | 有符號 8 位元變數 |
| 8 | 2^8 = 256 | 255 | 無符號 8 位元變數 |
透過瞭解這些概念,您可以更好地組態和使用計時器,以滿足您的具體需求。
位元與變數範圍
在電腦科學中,位元(bit)是最基本的資訊單位。一個位元可以代表兩種狀態:0 或 1。當我們將多個位元組合在一起時,就可以表示更大的數值範圍。
位元與數值範圍
- 8 位元(1 Byte)可以表示 $2^8 = 256$ 個不同的值,範圍從 0 到 255。對於無符號 8 位元變數,這個範圍是 0 到 255。
- 10 位元可以表示 $2^{10} = 1,024$ 個不同的值,範圍從 0 到 1,023。許多外部裝置(peripherals)使用 10 位元。
- 12 位元可以表示 $2^{12} = 4,096$ 個不同的值,範圍從 0 到 4,095。同樣,許多外部裝置也使用 12 位元。
- 15 位元可以表示 $2^{15} = 32,768$ 個不同的值,範圍從 0 到 32,767。這通常對應於有符號 16 位元變數的範圍。
- 16 位元可以表示 $2^{16} = 65,536$ 個不同的值,範圍從 0 到 65,535。這是無符號 16 位元變數的範圍。
- 24 位元可以表示 $2^{24} = 16,777,216$ 個不同的值,範圍從 0 到 16,777,215。
內容解密:
上述計算展示瞭如何根據位元數計算可以表示的數值範圍。這對於理解電腦如何以二進位制形式儲存和處理資料非常重要。每增加一位元,數值範圍就會加倍,這是二進位制系統的一個基本特性。
圖表翻譯:
graph LR
A[位元數] -->|計算|> B[數值範圍]
B -->|範圍|> C[最大值]
C -->|二進位制|> D[儲存和處理]
style A fill:#f9f,stroke:#333,stroke-width:4px
style B fill:#f9f,stroke:#333,stroke-width:4px
style C fill:#f9f,stroke:#333,stroke-width:4px
style D fill:#f9f,stroke:#333,stroke-width:4px
此圖表展示了位元數、數值範圍、最大值和二進位制儲存及處理之間的關係。它視覺化了如何根據位元數計算可以表示的數值範圍,並如何這影響電腦的儲存和處理能力。
使用計時器實作目標頻率
在使用計時器實作目標頻率時,我們需要考慮許多因素,包括計時器的大小、系統時脈頻率和目標頻率。下面,我們將探討如何使用計時器實作目標頻率,並提供一些實用的建議。
計時器大小和系統時脈頻率
首先,我們需要了解計時器的大小和系統時脈頻率。例如,ATtiny45 的 8 位計時器和 4 MHz 系統時脈頻率。這些引數將影響我們的計算結果。
目標頻率和計算
假設我們想要實作 20 Hz 的目標頻率,我們可以使用以下公式計算 prescaler 和 compare register 的值:
prescaler = clockIn / (compare * interruptFrequency)
其中,clockIn 是系統時脈頻率,compare 是 compare register 的值,interruptFrequency 是目標頻率。
解決方案
使用上述公式,我們可以計算出 prescaler 和 compare register 的值。然而,結果可能是浮點數,因此我們需要進行四捨五入或其他處理。
最佳解決方案
最佳解決方案是找到 prescaler 和 compare register 的值,使得其乘積等於 clockIn 除以 interruptFrequency。這可以透過以下公式實作:
prescaler * compare = clockIn / interruptFrequency
難以實作的目標頻率
當目標頻率難以實作時,我們可以使用其他方法,例如二元搜尋或暴力搜尋。二元搜尋涉及將 prescaler 值加倍並查詢最接近的 compare register 值,而暴力搜尋則涉及嘗試所有可能的 prescaler 和 compare register 值以找到最佳解決方案。
內容解密:
在本文中,我們探討瞭如何使用計時器實作目標頻率。首先,我們需要了解計時器的大小和系統時脈頻率。然後,我們可以使用公式計算 prescaler 和 compare register 的值。然而,結果可能是浮點數,因此我們需要進行四捨五入或其他處理。最佳解決方案是找到 prescaler 和 compare register 的值,使得其乘積等於 clockIn 除以 interruptFrequency。當目標頻率難以實作時,我們可以使用其他方法,例如二元搜尋或暴力搜尋。
flowchart TD
A[開始] --> B[計算 prescaler 和 compare register]
B --> C[四捨五入或其他處理]
C --> D[最佳解決方案]
D --> E[二元搜尋或暴力搜尋]
E --> F[找到最佳 prescaler 和 compare register 值]
圖表翻譯:
此圖表示使用計時器實作目標頻率的流程。首先,我們需要計算 prescaler 和 compare register 的值。然後,我們需要進行四捨五入或其他處理以得到整數值。最佳解決方案是找到 prescaler 和 compare register 的值,使得其乘積等於 clockIn 除以 interruptFrequency。如果目標頻率難以實作,我們可以使用二元搜尋或暴力搜尋來找到最佳解決方案。最終,我們可以找到最佳的 prescaler 和 compare register 值以實作目標頻率。
從底層實作到高階應用的全面檢視顯示,精確設定計時器對於嵌入式系統至關重要。本文深入探討了設定計時器的核心步驟,包括組態設定、預分頻器、控制和中斷暫存器,並詳細闡述了計算目標頻率、預分頻值和比較值的數學基礎,以及位元數與數值範圍的關係。分析不同位元計時器的數值範圍,以及如何根據系統時鐘和目標中斷頻率選擇合適的預分頻器和比較值,突顯了精確時間控制的重要性。然而,單純依靠公式計算並非總是能得到理想的整數解,這就需要靈活運用二元搜尋或暴力搜尋等方法來逼近目標值。對於初學者,理解這些概念可能存在一定挑戰,需要仔細研究處理器規格書和參考範例程式碼。玄貓認為,熟練掌握計時器設定技巧,不僅能提升嵌入式系統的效能和效率,更能為開發者開啟精確控制時間維度的可能性,對於建構更複雜、精密的嵌入式應用至關重要。未來,隨著嵌入式系統應用場景日益多元化,更精細的計時器控制和更便捷的設定工具將成為發展趨勢。