class ADC -- 類比數位轉換¶
用法::
import pyb
adc = pyb.ADC("P6")
val = adc.read()
若需同時存取每一個 ADC 通道,以及 MCU 內部的晶片溫度、VBAT 與 VREFINT 感測器,請參閱 pyb.ADCAll。
建構函式¶
- class pyb.ADC(pin: int | str | Pin)¶
建立一個與指定接腳關聯的 ADC 物件。這樣您便能讀取該接腳上的類比值。
方法¶
- read_timed(buf: bytearray | 'array.array', timer: Timer | int) int¶
依照
timer物件設定的速率,將類比值讀入buf。buf例如可以是 bytearray 或 array.array。ADC 數值具有 12 位元解析度,若其元素大小為 16 位元或以上,則會直接存入buf。若buf只有 8 位元的元素(例如 bytearray),則取樣解析度會降為 8 位元。timer應為一個 Timer 物件,每次計時器觸發時便讀取一個取樣。計時器必須事先初始化,並以所需的取樣頻率運行。為了支援此函式先前的行為,
timer也可以是一個整數,用以指定取樣頻率(單位為 Hz)。在此情況下,Timer(6) 會被自動設定為以指定的頻率運行。使用 Timer 物件的範例(建議的方式)::
adc = pyb.ADC(pyb.Pin.board.P6) # create an ADC on pin P6 tim = pyb.Timer(6, freq=10) # create a timer running at 10Hz buf = bytearray(100) # buffer to hold the samples adc.read_timed(buf, tim) # sample 100 values, taking 10s
使用整數指定頻率的範例::
adc = pyb.ADC(pyb.Pin.board.P6) # create an ADC on pin P6 buf = bytearray(100) # buffer of 100 bytes adc.read_timed(buf, 10) # read 100 samples at 10Hz (10s total) for val in buf: print(val)
此函式不會配置任何堆積記憶體。它具有阻塞行為:在緩衝區填滿之前不會返回呼叫程式。
- static read_timed_multi(adcs: Tuple[ADC, ...], bufs: Tuple[bytearray | 'array.array', ...], timer: Timer) bool¶
從多個 ADC 擷取相對時序或相位資料。
依照 timer 物件設定的速率,將多個 ADC 的類比值讀入緩衝區。每次計時器觸發時,便依序快速地從每個 ADC 讀取一個取樣。
ADC 與緩衝區實例以元組(tuple)方式傳入,每個 ADC 都有一個關聯的緩衝區。所有緩衝區必須是相同的型別與長度,且緩衝區的數量必須等於 ADC 的數量。
緩衝區例如可以是
bytearray或array.array。ADC 數值具有 12 位元解析度,若緩衝區的元素大小為 16 位元或以上,則會直接存入緩衝區。若緩衝區只有 8 位元的元素(例如bytearray),則取樣解析度會降為 8 位元。timer 必須是一個 Timer 物件。計時器必須事先初始化,並以所需的取樣頻率運行。
STM32 OpenMV Cam 只在排針上提供一支具備 ADC 功能的接腳(
P6),因此在原廠硬體上,read_timed_multi只在搭配單一 ADC 時才有用。若要搭配多於一個 ADC 使用,請透過pyb.Pin的cpu參考來接上額外的類比輸入。讀取一個 ADC 的範例::
import array adc = pyb.ADC(pyb.Pin.board.P6) tim = pyb.Timer(8, freq=100) rx = array.array("H", (0 for i in range(100))) # Sample 100 values at 100Hz (takes one second). pyb.ADC.read_timed_multi((adc,), (rx,), tim) for val in rx: print(val)
此函式不會配置任何堆積記憶體。它具有阻塞行為:在緩衝區填滿之前不會返回呼叫程式。
若所有取樣都以正確的時序擷取完成,此函式會回傳
True。在高取樣率下,擷取一組取樣所花費的時間可能超過計時器週期。此時函式會回傳False,表示取樣間隔的精確度有所損失。在極端情況下,取樣可能會被遺漏。最大速率取決於多項因素,包括資料寬度與所讀取的 ADC 數量。在測試中,兩個 ADC 以 210kHz 的計時器速率取樣而未發生溢位。在 215kHz 時則開始遺漏取樣。對於三個 ADC,上限約為 140kHz,四個則約為 110kHz。在高取樣率下,於擷取期間停用中斷可降低偶發資料遺失的風險。