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
bufcu o rată stabilită de obiectultimer.bufpoate fi, de exemplu, un bytearray sau un array.array. Valorile ADC au rezoluție de 12 biți și sunt stocate direct înbufdacă dimensiunea elementelor sale este de 16 biți sau mai mare. Dacăbufare doar elemente pe 8 biți (de exemplu un bytearray), atunci rezoluția eșantionului va fi redusă la 8 biți.timertrebuie 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,
timerpoate 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,
bytearraysauarray.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 unbytearray), 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 standardread_timed_multieste util doar cu un singur ADC. Conectați intrări analogice suplimentare prin referințepyb.Pincpupentru 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ă
Truedacă 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.