跳轉到內容

Mizar32/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 的高保真度精度低,但對於測量溫度、壓力、光強度以及大多數其他物理訊號來說已經足夠精確了。

為了更好地解釋解析度的概念,我們輸入波形中表示的每個取樣點的值將儲存在固定長度的變數中。如果該變數使用八位,則意味著它可以儲存從 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 匯流排引腳 eLua 名稱 PicoLisp 備註
ADC0 PA21 BUS5 引腳 5 pio.PA_21 'PA_21
ADC1 PA22 BUS5 引腳 6 pio.PA_22 'PA_22
ADC2 PA23 BUS5 引腳 7 pio.PA_23 'PA_23
ADC3 PA24 BUS2 引腳 3 pio.PA_24 'PA_24 (1)
ADC4 PA25 BUS6 引腳 4 pio.PA_25 'PA_25
ADC5 PA26 BUS6 引腳 5 pio.PA_26 'PA_26
ADC6 PA27 BUS6 引腳 6 pio.PA_27 'PA_27
ADC7 PA28 BUS6 引腳 7 pio.PA_28 'PA_28

(1) ADC3 與乙太網中斷共享匯流排引腳,當不存在乙太網附加板時,可以將其用作 ADC 輸入。

軟體檢視

[編輯 | 編輯原始碼]

Alcor6L 的 ADC 模組用於配置和讀取 ADC 輸入。至少需要兩次函式呼叫:一次啟動轉換,另一次讀取結果值,這些值範圍從 0(在 0V 時)到 1023(在 3.3V 時)。

在 eLua 中

 -- Repeatedly measure and print the value on ADC channel 0
 adc_channel = 0       -- Measure the first ADC channel
 while true do
   adc.sample( adc_channel, 1 )              -- start conversion of one sample
   print( adc.getsample ( adc_channel ) )    -- read the result and print it
 end

在 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 輸入,您可以使用以下程式碼

語言 程式碼
eLua pio.pin.setdir(pio.OUTPUT, pio.PA_24)
PicoLisp (pio-pin-setdir *pio-output* 'PA_24)

請注意,ADC 的 setclock 函式在 AVR32 上未針對任何 Alcor6L 語言實現。請參閱 問題 #25

進一步閱讀

[編輯 | 編輯原始碼]
華夏公益教科書