class ADC – analoog-naar-digitaalconversie¶
Gebruik:
import pyb
adc = pyb.ADC("P6")
val = adc.read()
Zie pyb.ADCAll voor gelijktijdige toegang tot elk ADC-kanaal plus de interne die-temperatuur, VBAT en VREFINT sensoren van de MCU.
Constructors¶
- class pyb.ADC(pin: int | str | Pin)¶
Maak een ADC-object aan dat is gekoppeld aan de opgegeven pin. Hiermee kun je vervolgens analoge waarden op die pin uitlezen.
Methoden¶
- read() int¶
Lees de waarde op de analoge pin uit en geef deze terug. De teruggegeven waarde ligt tussen 0 en 4095.
- read_timed(buf: bytearray | 'array.array', timer: Timer | int) int¶
Lees analoge waarden in
bufmet een snelheid die door hettimer-object wordt bepaald.bufkan bijvoorbeeld een bytearray of array.array zijn. De ADC-waarden hebben een 12-bits resolutie en worden direct inbufopgeslagen als de elementgrootte 16 bits of meer is. Alsbufalleen 8-bits elementen heeft (bijv. een bytearray), wordt de samplresolutie teruggebracht tot 8 bits.timermoet een Timer-object zijn, en er wordt telkens een sample gelezen wanneer de timer activeert. De timer moet al geïnitialiseerd zijn en draaien op de gewenste samplefrequentie.Om eerder gedrag van deze functie te ondersteunen, kan
timerook een geheel getal zijn dat de frequentie (in Hz) aangeeft waarop gesampeld moet worden. In dat geval wordt Timer(6) automatisch geconfigureerd om op de opgegeven frequentie te draaien.Voorbeeld met een Timer-object (aanbevolen manier):
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
Voorbeeld met een geheel getal voor de frequentie:
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)
Deze functie reserveert geen heap-geheugen. Ze heeft blokkerend gedrag: ze keert pas terug naar het aanroepende programma wanneer de buffer vol is.
- static read_timed_multi(adcs: Tuple[ADC, ...], bufs: Tuple[bytearray | 'array.array', ...], timer: Timer) bool¶
Haal relatieve timing- of fasegegevens uit meerdere ADC’s.
Leest analoge waarden uit meerdere ADC’s in buffers met een snelheid die door het timer-object wordt bepaald. Telkens wanneer de timer activeert, wordt er snel achter elkaar een sample gelezen uit elke ADC.
ADC- en buffer-instanties worden doorgegeven als tuples, waarbij elke ADC een bijbehorende buffer heeft. Alle buffers moeten van hetzelfde type en dezelfde lengte zijn en het aantal buffers moet gelijk zijn aan het aantal ADC’s.
Buffers kunnen bijvoorbeeld
bytearrayofarray.arrayzijn. De ADC-waarden hebben een 12-bits resolutie en worden direct in de buffer opgeslagen als de elementgrootte 16 bits of meer is. Als de buffers alleen 8-bits elementen hebben (bijv. eenbytearray), wordt de samplresolutie teruggebracht tot 8 bits.timer moet een Timer-object zijn. De timer moet al geïnitialiseerd zijn en draaien op de gewenste samplefrequentie.
De STM32 OpenMV Cams stellen slechts één ADC-geschikte headerpin (
P6) beschikbaar, dus op standaardhardware isread_timed_multialleen nuttig met één enkele ADC. Sluit extra analoge ingangen aan viapyb.Pincpu-referenties om de functie met meer dan één ADC te gebruiken.Voorbeeld waarbij één ADC wordt gelezen:
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)
Deze functie reserveert geen heap-geheugen. Ze heeft blokkerend gedrag: ze keert pas terug naar het aanroepende programma wanneer de buffers vol zijn.
De functie geeft
Trueterug als alle samples met de juiste timing zijn verkregen. Bij hoge samplesnelheden kan de tijd die nodig is om een reeks samples te verkrijgen de timerperiode overschrijden. In dat geval geeft de functieFalseterug, wat duidt op een verlies aan precisie in het sample-interval. In extreme gevallen kunnen samples worden gemist.De maximale snelheid hangt af van factoren zoals de databreedte en het aantal ADC’s dat wordt gelezen. Tijdens tests werden twee ADC’s gesampeld op een timersnelheid van 210kHz zonder overloop. Bij 215kHz werden samples gemist. Voor drie ADC’s ligt de grens rond 140kHz, en voor vier rond 110kHz. Bij hoge samplesnelheden kan het uitschakelen van interrupts gedurende de meting het risico op sporadisch dataverlies verminderen.