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_timed(buf: bytearray | 'array.array', timer: Timer | int) int¶
Čte analogové hodnoty do
bufrychlostí nastavenou objektemtimer.bufmůže být například bytearray nebo array.array. Hodnoty ADC mají 12bitové rozlišení a ukládají se přímo dobuf, pokud je velikost jeho prvků 16 bitů nebo více. Pokud mábufpouze 8bitové prvky (např. bytearray), pak se rozlišení vzorku sníží na 8 bitů.timerby 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
timertaké 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
bytearrayneboarray.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 jeread_timed_multiužitečný pouze s jedním ADC. Pro použití s více než jedním ADC zapojte další analogové vstupy přes referencecpuobjektupyb.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.