klasa ADC – analogno-digitalna pretvorba

Uporaba:

import pyb

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

Pogledajte pyb.ADCAll za istovremeni pristup svakom ADC kanalu te internim senzorima MCU-a za temperaturu čipa, VBAT i VREFINT.

Konstruktori

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

Stvara ADC objekt povezan sa zadanim pinom. To vam omogućuje čitanje analognih vrijednosti na tom pinu.

Metode

read() int

Čita vrijednost na analognom pinu i vraća je. Vraćena vrijednost bit će između 0 i 4095.

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

Čita analogne vrijednosti u buf brzinom koju određuje objekt timer.

buf može biti, na primjer, bytearray ili array.array. ADC vrijednosti imaju 12-bitnu razlučivost i pohranjuju se izravno u buf ako je veličina njegovih elemenata 16 bita ili više. Ako buf ima samo 8-bitne elemente (npr. bytearray), tada će razlučivost uzorka biti smanjena na 8 bita.

timer bi trebao biti Timer objekt, a uzorak se čita svaki put kada se mjerač vremena okine. Mjerač vremena mora već biti inicijaliziran i raditi na željenoj frekvenciji uzorkovanja.

Radi podrške prethodnom ponašanju ove funkcije, timer može biti i cijeli broj koji određuje frekvenciju (u Hz) na kojoj se uzorkuje. U tom slučaju Timer(6) bit će automatski konfiguriran za rad na zadanoj frekvenciji.

Primjer uporabe Timer objekta (preferirani način):

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

Primjer uporabe cijelog broja za frekvenciju:

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)

Ova funkcija ne alocira nikakvu heap memoriju. Ima blokirajuće ponašanje: ne vraća se pozivajućem programu dok međuspremnik nije pun.

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

Izvlači relativne vremenske podatke ili podatke o fazi iz više ADC-ova.

Čita analogne vrijednosti iz više ADC-ova u međuspremnike brzinom koju određuje objekt timer. Svaki put kada se mjerač vremena okine, uzorak se brzo očita iz svakog ADC-a redom.

Instance ADC-a i međuspremnika prosljeđuju se u n-torkama, pri čemu svaki ADC ima pridruženi međuspremnik. Svi međuspremnici moraju biti istog tipa i duljine, a broj međuspremnika mora biti jednak broju ADC-ova.

Međuspremnici mogu biti, na primjer, bytearray ili array.array. ADC vrijednosti imaju 12-bitnu razlučivost i pohranjuju se izravno u međuspremnik ako je veličina njegovih elemenata 16 bita ili više. Ako međuspremnici imaju samo 8-bitne elemente (npr. bytearray), tada će razlučivost uzorka biti smanjena na 8 bita.

timer mora biti Timer objekt. Mjerač vremena mora već biti inicijaliziran i raditi na željenoj frekvenciji uzorkovanja.

STM32 OpenMV Cam kamere izlažu samo jedan pin zaglavlja sposoban za ADC (P6), pa je na standardnom hardveru read_timed_multi koristan samo s jednim ADC-om. Spojite dodatne analogne ulaze putem pyb.Pin cpu referenci kako biste ga koristili s više od jednog ADC-a.

Primjer čitanja jednog ADC-a:

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)

Ova funkcija ne alocira nikakvu heap memoriju. Ima blokirajuće ponašanje: ne vraća se pozivajućem programu dok međuspremnici nisu puni.

Funkcija vraća True ako su svi uzorci prikupljeni s ispravnim vremenskim usklađenjem. Pri visokim brzinama uzorkovanja vrijeme potrebno za prikupljanje skupa uzoraka može premašiti period mjerača vremena. U tom slučaju funkcija vraća False, što označava gubitak preciznosti u intervalu uzorkovanja. U ekstremnim slučajevima uzorci mogu biti propušteni.

Maksimalna brzina ovisi o čimbenicima uključujući širinu podataka i broj ADC-ova koji se čitaju. U testiranju su dva ADC-a uzorkovana brzinom mjerača vremena od 210 kHz bez prekoračenja. Uzorci su propušteni na 215 kHz. Za tri ADC-a granica je oko 140 kHz, a za četiri oko 110 kHz. Pri visokim brzinama uzorkovanja onemogućavanje prekida za vrijeme trajanja može smanjiti rizik od sporadičnog gubitka podataka.