třída ADC – analogově-digitální převod

Použití:

import pyb

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

Viz pyb.ADCAll pro současný přístup ke všem kanálům ADC a navíc k interním senzorům teploty čipu, VBAT a VREFINT MCU.

Konstruktory

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

Vytvoří objekt ADC přidružený k danému pinu. To vám následně umožní číst analogové hodnoty na tomto pinu.

Metody

read() int

Přečte hodnotu na analogovém pinu a vrátí ji. Vrácená hodnota bude mezi 0 a 4095.

read_timed(buf: bytearray | 'array.array', timer: Timer | int) int

Čte analogové hodnoty do buf rychlostí nastavenou objektem timer.

buf může být například bytearray nebo array.array. Hodnoty ADC mají 12bitové rozlišení a ukládají se přímo do buf, pokud je velikost jeho prvků 16 bitů nebo více. Pokud má buf pouze 8bitové prvky (např. bytearray), pak se rozlišení vzorku sníží na 8 bitů.

timer by měl být objekt Timer a vzorek se přečte při každém spuštění časovače. Časovač musí být již inicializován a běžet na požadované vzorkovací frekvenci.

Pro podporu předchozího chování této funkce může být timer také celé číslo, které určuje frekvenci (v Hz), na které se má vzorkovat. V tomto případě bude Timer(6) automaticky nakonfigurován tak, aby běžel na zadané frekvenci.

Příklad s použitím objektu Timer (preferovaný způsob):

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

Příklad s použitím celého čísla pro frekvenci:

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)

Tato funkce nealokuje žádnou paměť na haldě. Má blokující chování: nevrátí se do volajícího programu, dokud není buffer plný.

static read_timed_multi(adcs: Tuple[ADC, ...], bufs: Tuple[bytearray | 'array.array', ...], timer: Timer) bool

Získá relativní časové nebo fázové údaje z více ADC.

Čte analogové hodnoty z více ADC do bufferů rychlostí nastavenou objektem timer. Při každém spuštění časovače je rychle přečten vzorek postupně z každého ADC.

Instance ADC a bufferu se předávají v n-ticích, přičemž každý ADC má přidružený buffer. Všechny buffery musí být stejného typu a délky a počet bufferů musí být roven počtu ADC.

Buffery mohou být například bytearray nebo array.array. Hodnoty ADC mají 12bitové rozlišení a ukládají se přímo do bufferu, pokud je velikost jeho prvků 16 bitů nebo více. Pokud mají buffery pouze 8bitové prvky (např. bytearray), pak se rozlišení vzorku sníží na 8 bitů.

timer musí být objekt Timer. Časovač musí být již inicializován a běžet na požadované vzorkovací frekvenci.

Kamery STM32 OpenMV Cam vystavují pouze jeden pin hlavičky schopný ADC (P6), takže na základním hardwaru je read_timed_multi užitečný pouze s jedním ADC. Pro použití s více než jedním ADC zapojte další analogové vstupy přes reference cpu objektu pyb.Pin.

Příklad čtení jednoho 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)

Tato funkce nealokuje žádnou paměť na haldě. Má blokující chování: nevrátí se do volajícího programu, dokud nejsou buffery plné.

Funkce vrátí True, pokud byly všechny vzorky získány se správným časováním. Při vysokých vzorkovacích frekvencích může čas potřebný k získání sady vzorků překročit periodu časovače. V takovém případě funkce vrátí False, což indikuje ztrátu přesnosti v intervalu vzorkování. V extrémních případech mohou být vzorky vynechány.

Maximální rychlost závisí na faktorech včetně šířky dat a počtu čtených ADC. Při testování byly dva ADC vzorkovány na frekvenci časovače 210 kHz bez přetečení. Vzorky byly vynechány při 215 kHz. Pro tři ADC je limit kolem 140 kHz a pro čtyři kolem 110 kHz. Při vysokých vzorkovacích frekvencích může zakázání přerušení po dobu trvání snížit riziko sporadické ztráty dat.