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 buf met een snelheid die door het timer-object wordt bepaald.

buf kan bijvoorbeeld een bytearray of array.array zijn. De ADC-waarden hebben een 12-bits resolutie en worden direct in buf opgeslagen als de elementgrootte 16 bits of meer is. Als buf alleen 8-bits elementen heeft (bijv. een bytearray), wordt de samplresolutie teruggebracht tot 8 bits.

timer moet 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 timer ook 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 bytearray of array.array zijn. 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. een bytearray), 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 is read_timed_multi alleen nuttig met één enkele ADC. Sluit extra analoge ingangen aan via pyb.Pin cpu-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 True terug 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 functie False terug, 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.