class ADC – analog-till-digital-omvandling

Användning:

import pyb

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

Se pyb.ADCAll för samtidig åtkomst till alla ADC-kanaler plus MCU:ns interna sensorer för die-temperatur, VBAT och VREFINT.

Konstruktorer

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

Skapar ett ADC-objekt kopplat till det angivna stiftet. Detta gör att du sedan kan läsa analoga värden på det stiftet.

Metoder

read() int

Läser värdet på det analoga stiftet och returnerar det. Det returnerade värdet ligger mellan 0 och 4095.

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

Läser analoga värden in i buf med en hastighet som anges av timer-objektet.

buf kan till exempel vara en bytearray eller array.array. ADC-värdena har 12-bitars upplösning och lagras direkt i buf om dess elementstorlek är 16 bitar eller större. Om buf endast har 8-bitars element (t.ex. en bytearray) reduceras samplingsupplösningen till 8 bitar.

timer ska vara ett Timer-objekt, och en sampling läses varje gång timern utlöses. Timern måste redan vara initialiserad och köra med önskad samplingsfrekvens.

För att stödja det tidigare beteendet hos denna funktion kan timer även vara ett heltal som anger frekvensen (i Hz) att sampla med. I detta fall konfigureras Timer(6) automatiskt för att köra med den angivna frekvensen.

Exempel med ett Timer-objekt (föredragna sättet):

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

Exempel med ett heltal för frekvensen:

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)

Denna funktion allokerar inget heap-minne. Den har blockerande beteende: den återvänder inte till det anropande programmet förrän bufferten är full.

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

Extraherar relativ tidsdata eller fasdata från flera ADC:er.

Läser analoga värden från flera ADC:er in i buffertar med en hastighet som anges av timer-objektet. Varje gång timern utlöses läses en sampling snabbt från varje ADC i tur och ordning.

ADC- och buffertinstanser skickas in i tupler där varje ADC har en tillhörande buffert. Alla buffertar måste vara av samma typ och längd och antalet buffertar måste vara lika med antalet ADC:er.

Buffertar kan till exempel vara bytearray eller array.array. ADC-värdena har 12-bitars upplösning och lagras direkt i bufferten om dess elementstorlek är 16 bitar eller större. Om buffertarna endast har 8-bitars element (t.ex. en bytearray) reduceras samplingsupplösningen till 8 bitar.

timer måste vara ett Timer-objekt. Timern måste redan vara initialiserad och köra med önskad samplingsfrekvens.

STM32 OpenMV Cam-modellerna exponerar endast ett ADC-kapabelt header-stift (P6), så på standardhårdvara är read_timed_multi endast användbar med en enda ADC. Koppla ytterligare analoga ingångar via pyb.Pin cpu-referenser för att använda den med fler än en ADC.

Exempel som läser en 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)

Denna funktion allokerar inget heap-minne. Den har blockerande beteende: den återvänder inte till det anropande programmet förrän buffertarna är fulla.

Funktionen returnerar True om alla samplingar förvärvades med korrekt tidsstyrning. Vid höga samplingshastigheter kan den tid det tar att förvärva en uppsättning samplingar överskrida timerperioden. I detta fall returnerar funktionen False, vilket indikerar en precisionsförlust i samplingsintervallet. I extrema fall kan samplingar missas.

Den maximala hastigheten beror på faktorer som databredd och antalet ADC:er som läses. Vid testning samplades två ADC:er med en timerhastighet på 210kHz utan överskridning. Samplingar missades vid 215kHz. För tre ADC:er ligger gränsen runt 140kHz, och för fyra runt 110kHz. Vid höga samplingshastigheter kan inaktivering av avbrott under tiden minska risken för sporadisk dataförlust.