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
bufmed en hastighet som anges avtimer-objektet.bufkan till exempel vara en bytearray eller array.array. ADC-värdena har 12-bitars upplösning och lagras direkt ibufom dess elementstorlek är 16 bitar eller större. Ombufendast har 8-bitars element (t.ex. en bytearray) reduceras samplingsupplösningen till 8 bitar.timerska 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
bytearrayellerarray.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. enbytearray) 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 ärread_timed_multiendast användbar med en enda ADC. Koppla ytterligare analoga ingångar viapyb.Pincpu-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
Trueom 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 funktionenFalse, 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.