Klasse ADC – Analog-Digital-Wandlung¶
Verwendung:
import pyb
adc = pyb.ADC("P6")
val = adc.read()
Siehe pyb.ADCAll für den gleichzeitigen Zugriff auf jeden ADC-Kanal sowie auf die internen Sensoren des MCU für die Chiptemperatur, VBAT und VREFINT.
Konstruktoren¶
- class pyb.ADC(pin: int | str | Pin)¶
Erzeugt ein ADC-Objekt, das dem angegebenen Pin zugeordnet ist. Dadurch können Sie anschließend analoge Werte an diesem Pin auslesen.
Methoden¶
- read() int¶
Liest den Wert am analogen Pin und gibt ihn zurück. Der zurückgegebene Wert liegt zwischen 0 und 4095.
- read_timed(buf: bytearray | 'array.array', timer: Timer | int) int¶
Liest analoge Werte mit einer durch das
timer-Objekt festgelegten Rate inbufein.bufkann beispielsweise ein bytearray oder array.array sein. Die ADC-Werte haben eine 12-Bit-Auflösung und werden direkt inbufgespeichert, wenn dessen Elementgröße 16 Bit oder mehr beträgt. Wennbufnur 8-Bit-Elemente hat (z. B. ein bytearray), wird die Abtastauflösung auf 8 Bit reduziert.timersollte ein Timer-Objekt sein, und bei jedem Auslösen des Timers wird eine Probe gelesen. Der Timer muss bereits initialisiert sein und mit der gewünschten Abtastfrequenz laufen.Um das frühere Verhalten dieser Funktion zu unterstützen, kann
timerauch eine Ganzzahl sein, die die Frequenz (in Hz) angibt, mit der abgetastet werden soll. In diesem Fall wird Timer(6) automatisch so konfiguriert, dass er mit der angegebenen Frequenz läuft.Beispiel mit einem Timer-Objekt (bevorzugte Vorgehensweise):
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
Beispiel mit einer Ganzzahl für die Frequenz:
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)
Diese Funktion belegt keinen Heap-Speicher. Sie weist ein blockierendes Verhalten auf: Sie kehrt erst dann zum aufrufenden Programm zurück, wenn der Puffer voll ist.
- static read_timed_multi(adcs: Tuple[ADC, ...], bufs: Tuple[bytearray | 'array.array', ...], timer: Timer) bool¶
Extrahiert relative Timing- oder Phasendaten aus mehreren ADCs.
Liest analoge Werte aus mehreren ADCs mit einer durch das timer-Objekt festgelegten Rate in Puffer ein. Bei jedem Auslösen des Timers wird nacheinander schnell eine Probe von jedem ADC gelesen.
ADC- und Puffer-Instanzen werden in Tupeln übergeben, wobei jedem ADC ein zugehöriger Puffer zugeordnet ist. Alle Puffer müssen vom selben Typ und derselben Länge sein, und die Anzahl der Puffer muss der Anzahl der ADCs entsprechen.
Puffer können beispielsweise
bytearrayoderarray.arraysein. Die ADC-Werte haben eine 12-Bit-Auflösung und werden direkt in den Puffer gespeichert, wenn dessen Elementgröße 16 Bit oder mehr beträgt. Wenn Puffer nur 8-Bit-Elemente haben (z. B. einbytearray), wird die Abtastauflösung auf 8 Bit reduziert.timer muss ein Timer-Objekt sein. Der Timer muss bereits initialisiert sein und mit der gewünschten Abtastfrequenz laufen.
Die STM32 OpenMV Cams stellen nur einen ADC-fähigen Header-Pin (
P6) bereit, sodassread_timed_multiauf der Standard-Hardware nur mit einem einzigen ADC nützlich ist. Verdrahten Sie zusätzliche analoge Eingänge überpyb.Pin-cpu-Referenzen, um es mit mehr als einem ADC zu verwenden.Beispiel zum Auslesen eines 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)
Diese Funktion belegt keinen Heap-Speicher. Sie weist ein blockierendes Verhalten auf: Sie kehrt erst dann zum aufrufenden Programm zurück, wenn die Puffer voll sind.
Die Funktion gibt
Truezurück, wenn alle Proben mit korrektem Timing erfasst wurden. Bei hohen Abtastraten kann die zum Erfassen eines Probensatzes benötigte Zeit die Timer-Periode überschreiten. In diesem Fall gibt die FunktionFalsezurück, was auf einen Verlust an Präzision im Abtastintervall hinweist. In Extremfällen können Proben verloren gehen.Die maximale Rate hängt von Faktoren wie der Datenbreite und der Anzahl der gelesenen ADCs ab. In Tests wurden zwei ADCs mit einer Timer-Rate von 210 kHz ohne Überlauf abgetastet. Bei 215 kHz gingen Proben verloren. Für drei ADCs liegt die Grenze bei etwa 140 kHz und für vier bei etwa 110 kHz. Bei hohen Abtastraten kann das Deaktivieren von Interrupts für die Dauer das Risiko sporadischer Datenverluste verringern.