Hempl/ADC
ADC 代表模數轉換器。在現實世界中,像光或聲音這樣的訊號的數值通常可以以模擬方式測量,但是為了讓這些數值被微控制器處理,它們必須被轉換為數字資訊。ADC 完成了這項工作,並且嵌入在所有現代微控制器中。
因此,ADC 電路是感知外部世界最常見的方式,但它並不智慧。它只能在特定時間測量電壓水平,你需要另一個硬體部分,一個感測器,來將你的模擬值轉換為電壓,以便與 ADC 一起使用,併成為數字資訊。一些常見的模擬感測器型別是用於光、聲音、溫度、溼度、各種氣體、電流感測器等等。
ADC 電路所做的是不時地從模擬訊號中獲取樣本。每個樣本都被轉換為一個數字,它表示在特定時間模擬訊號波形的數值。
舉一個眾所周知的例子,CD 包含音樂的數字樣本,這些樣本是音訊(實際上是連續波形)的模數轉換,取樣率為 44.1KHz。這意味著,每秒 44,100 次,它的音訊波形被取樣成一個 16 位解析度的數字:一個從 0 到 65,535 的數字。為什麼是 65,535?因為每個樣本都表示為 16 位,每位都可以取兩個不同值中的一個(0 和 1),這給了你 216 = 65,536 個不同的可能值,也就是從 0 到 65535 的所有數字。
在每一次模數轉換中,我們都有這兩個重要的引數,頻率或採樣率,以及數字,樣本本身,具有固定的位解析度。解析度是取樣資料的精度。
Mizar32 的 ADC 以 8 位或 10 位的解析度進行取樣,這提供了 256 或 1024 個不同的可能值。這比音訊 CD 的高保真度精度要低,但對於測量溫度、壓力、光強以及大多數其他物理訊號來說已經足夠精確了。
為了更好地解釋解析度的概念,輸入波形中每個取樣點的值將儲存在一個固定長度的變數中。如果這個變數使用 8 位,這意味著它可以儲存從 0 到 255(28 = 256)的值。如果這個變數使用 10 位,這意味著它可以儲存從 0 到 1023(210 = 1024)的值。在 10 位解析度的情況下,數字 0 代表最低電壓,數字 1023 代表最高電壓。
AVR32 中使用的 ADC 型別是逐次逼近暫存器 (SAR) ADC,它反覆將它正在取樣的訊號與它當前的最佳估計值進行比較,直到它得到最接近的值,並在 10 個時鐘週期內(在 10 位解析度的情況下)找到樣本的正確數字值。
這種型別的電路的另一個優點是使用了輸出緩衝器,它允許由 ADC 供電的電路在 ADC 已經在處理下一個樣本時讀取數字資料。
Mizar32 有一個模數轉換器,它在最多八個輸入(ADC0 到 ADC7)之間複用。
ADC 通道可以在硬體中設定為執行 8 位或 10 位轉換,輸入電壓範圍為 0V 到 VDDANA(BUS1,第 9 腳),它透過 R3(一個 0 歐姆電阻)連線到 Mizar32 主機板上的 3.3V。
| 訊號 | GPIO | 匯流排引腳 | PicoLisp | 備註 |
|---|---|---|---|---|
| ADC0 | PA21 | BUS5 引腳 5 | 'PA_21 |
|
| ADC1 | PA22 | BUS5 引腳 6 | 'PA_22 |
|
| ADC2 | PA23 | BUS5 引腳 7 | 'PA_23 |
|
| ADC3 | PA24 | BUS2 引腳 3 | 'PA_24 |
(1) |
| ADC4 | PA25 | BUS6 引腳 4 | 'PA_25 |
|
| ADC5 | PA26 | BUS6 引腳 5 | 'PA_26 |
|
| ADC6 | PA27 | BUS6 引腳 6 | 'PA_27 |
|
| ADC7 | PA28 | BUS6 引腳 7 | 'PA_28 |
(1) ADC3 與乙太網中斷共享一個匯流排引腳,當沒有乙太網附加板時,可以作為 ADC 輸入使用。
Hempl 的 ADC 模組用於配置和讀取 ADC 輸入。至少需要兩個函式呼叫:一個啟動轉換,另一個讀取結果值,結果值範圍從 0(在 0V 時)到 1023(在 3.3V 時)。
在 PicoLisp 中
# Repeatedly measure and print the value on ADC channel 0 (setq adc-channel 0) # Measure the first ADC channel (loop (adc-sample adc-channel 1) # start conversion of one sample (prinl (adc-getsample adc-channel)) ) # read the result and print it
如果 ADC 引腳沒有用作 ADC 輸入,它可以透過在 PIO 子系統中呼叫 setdir 函式來用作通用 PIO 引腳。例如,要將 BUS5 引腳 7(ADC5)用作 PIO 輸出而不是 ADC 輸入,你可以使用以下程式碼
(pio-pin-setdir *pio-output* 'PA_24)
請注意,ADC 的 setclock 函式在 AVR32 上沒有實現。參見 問題 #25。
- Atmel AT32UC3A 資料手冊 第 33 章:模數轉換器 (ADC)。