clasa ADC – conversie analog-digitală

Utilizare:

import pyb

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

Consultați pyb.ADCAll pentru acces simultan la fiecare canal ADC, precum și la senzorii interni ai MCU pentru temperatura siliciului, VBAT și VREFINT.

Constructori

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

Creează un obiect ADC asociat pinului dat. Acest lucru vă permite apoi să citiți valori analogice de pe acel pin.

Metode

read() int

Citește valoarea de pe pinul analogic și o returnează. Valoarea returnată va fi cuprinsă între 0 și 4095.

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

Citește valori analogice în buf cu o rată stabilită de obiectul timer.

buf poate fi, de exemplu, un bytearray sau un array.array. Valorile ADC au rezoluție de 12 biți și sunt stocate direct în buf dacă dimensiunea elementelor sale este de 16 biți sau mai mare. Dacă buf are doar elemente pe 8 biți (de exemplu un bytearray), atunci rezoluția eșantionului va fi redusă la 8 biți.

timer trebuie să fie un obiect Timer, iar un eșantion este citit de fiecare dată când temporizatorul se declanșează. Temporizatorul trebuie să fie deja inițializat și să ruleze la frecvența de eșantionare dorită.

Pentru a păstra comportamentul anterior al acestei funcții, timer poate fi și un număr întreg care specifică frecvența (în Hz) la care se eșantionează. În acest caz, Timer(6) va fi configurat automat să ruleze la frecvența dată.

Exemplu folosind un obiect Timer (modalitatea preferată):

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

Exemplu folosind un număr întreg pentru frecvență:

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)

Această funcție nu alocă memorie heap. Are un comportament de blocare: nu revine la programul apelant până când tamponul (buffer) nu este plin.

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

Extrage date relative de sincronizare sau de fază de la mai multe ADC-uri.

Citește valori analogice de la mai multe ADC-uri în tampoane (buffer) cu o rată stabilită de obiectul timer. De fiecare dată când temporizatorul se declanșează, se citește rapid câte un eșantion din fiecare ADC pe rând.

Instanțele ADC și de tampon (buffer) sunt transmise în tupluri, fiecare ADC având un tampon asociat. Toate tampoanele trebuie să fie de același tip și de aceeași lungime, iar numărul de tampoane trebuie să fie egal cu numărul de ADC-uri.

Tampoanele (buffer) pot fi, de exemplu, bytearray sau array.array. Valorile ADC au rezoluție de 12 biți și sunt stocate direct în tampon dacă dimensiunea elementelor sale este de 16 biți sau mai mare. Dacă tampoanele au doar elemente pe 8 biți (de exemplu un bytearray), atunci rezoluția eșantionului va fi redusă la 8 biți.

timer trebuie să fie un obiect Timer. Temporizatorul trebuie să fie deja inițializat și să ruleze la frecvența de eșantionare dorită.

Camerele STM32 OpenMV Cam expun un singur pin de antet capabil de ADC (P6), așa că pe hardware-ul standard read_timed_multi este util doar cu un singur ADC. Conectați intrări analogice suplimentare prin referințe pyb.Pin cpu pentru a-l folosi cu mai mult de un ADC.

Exemplu de citire a unui singur 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)

Această funcție nu alocă memorie heap. Are un comportament de blocare: nu revine la programul apelant până când tampoanele (buffer) nu sunt pline.

Funcția returnează True dacă toate eșantioanele au fost achiziționate cu sincronizare corectă. La rate ridicate de eșantionare, timpul necesar pentru achiziționarea unui set de eșantioane poate depăși perioada temporizatorului. În acest caz, funcția returnează False, indicând o pierdere de precizie în intervalul de eșantionare. În cazuri extreme, unele eșantioane pot fi omise.

Rata maximă depinde de factori precum lățimea datelor și numărul de ADC-uri care sunt citite. În teste, două ADC-uri au fost eșantionate la o rată a temporizatorului de 210kHz fără supraîncărcare. Eșantioane au fost omise la 215kHz. Pentru trei ADC-uri limita este în jur de 140kHz, iar pentru patru este în jur de 110kHz. La rate ridicate de eșantionare, dezactivarea întreruperilor pe durata respectivă poate reduce riscul de pierdere sporadică a datelor.