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 in buf ein.

buf kann beispielsweise ein bytearray oder array.array sein. Die ADC-Werte haben eine 12-Bit-Auflösung und werden direkt in buf gespeichert, wenn dessen Elementgröße 16 Bit oder mehr beträgt. Wenn buf nur 8-Bit-Elemente hat (z. B. ein bytearray), wird die Abtastauflösung auf 8 Bit reduziert.

timer sollte 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 timer auch 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 bytearray oder array.array sein. 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. ein bytearray), 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, sodass read_timed_multi auf der Standard-Hardware nur mit einem einzigen ADC nützlich ist. Verdrahten Sie zusätzliche analoge Eingänge über pyb.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 True zurü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 Funktion False zurü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.