class ADC -- 類比數位轉換

用法::

import pyb

adc = pyb.ADC("P6")
val = adc.read()

若需同時存取每一個 ADC 通道,以及 MCU 內部的晶片溫度、VBATVREFINT 感測器,請參閱 pyb.ADCAll

建構函式

class pyb.ADC(pin: int | str | Pin)

建立一個與指定接腳關聯的 ADC 物件。這樣您便能讀取該接腳上的類比值。

方法

read() int

讀取類比接腳上的數值並回傳。回傳值會介於 0 與 4095 之間。

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 的數量。

緩衝區例如可以是 bytearrayarray.array。ADC 數值具有 12 位元解析度,若緩衝區的元素大小為 16 位元或以上,則會直接存入緩衝區。若緩衝區只有 8 位元的元素(例如 bytearray),則取樣解析度會降為 8 位元。

timer 必須是一個 Timer 物件。計時器必須事先初始化,並以所需的取樣頻率運行。

STM32 OpenMV Cam 只在排針上提供一支具備 ADC 功能的接腳(P6),因此在原廠硬體上,read_timed_multi 只在搭配單一 ADC 時才有用。若要搭配多於一個 ADC 使用,請透過 pyb.Pincpu 參考來接上額外的類比輸入。

讀取一個 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。在高取樣率下,於擷取期間停用中斷可降低偶發資料遺失的風險。