class DAC – Digital-Analog-Wandlung

Der DAC gibt analoge Spannungen zwischen 0 V und 3,3 V auf einem von zwei STM32-DAC-Kanälen aus.

Auf jeder STM32-OpenMV-Cam, die pyb.DAC bereitstellt (M4 / M7 / H7 / H7 Plus / Pure Thermal), sind die Kanäle wie folgt verdrahtet:

DAC-Kanal

Header-Pin

STM32-Pin

DAC(1)

(nicht am Header)

PA4

DAC(2)

P6

PA5

Die OpenMV Cam N6 besitzt kein DAC-Peripheriegerät; pyb.DAC ist auf dieser Platine nicht verfügbar.

Anwendungsbeispiel:

from pyb import DAC

dac = DAC(1)            # create DAC channel 1
dac.write(128)          # write a value to the DAC (approximately 1.65 V)

dac = DAC(1, bits=12)   # use 12-bit resolution
dac.write(4095)         # output maximum value, 3.3 V

Zur Ausgabe einer kontinuierlichen Sinuswelle:

import math
from pyb import DAC

# create a buffer containing a sine-wave
buf = bytearray(100)
for i in range(len(buf)):
    buf[i] = 128 + int(127 * math.sin(2 * math.pi * i / len(buf)))

# output the sine-wave at 400Hz
dac = DAC(1)
dac.write_timed(buf, 400 * len(buf), mode=DAC.CIRCULAR)

Zur Ausgabe einer kontinuierlichen Sinuswelle mit 12-Bit-Auflösung:

import math
from array import array
from pyb import DAC

# 128-sample sine wave, half-word samples centred at 2048 (12-bit mid).
N = 128
buf = array("H", (
    2048 + int(2047 * math.sin(2 * math.pi * i / N))
    for i in range(N)
))

# Output the sine wave at 400Hz.
dac = DAC(1, bits=12)
dac.write_timed(buf, 400 * len(buf), mode=DAC.CIRCULAR)

Konstruktoren

class pyb.DAC(port: int | Pin, bits: int = 8, *, buffering: bool | None = None)

Erstellt ein neues DAC-Objekt.

port kann ein Pin-Objekt oder eine Ganzzahl (1 oder 2) sein, die DAC-Kanal 1 oder 2 auswählt. Der physische Pin, auf den jeder Kanal geführt wird, hängt von der OpenMV Cam ab.

bits ist eine Ganzzahl, die die Auflösung angibt, und kann 8 oder 12 sein. Der maximale Wert, der von write() und write_timed() akzeptiert wird, ist (2**bits) - 1 (255 bei 8 Bit, 4095 bei 12 Bit).

Der Parameter buffering wählt das Verhalten des Ausgangspuffers des DAC-Operationsverstärkers aus, dessen Zweck es ist, die Ausgangsimpedanz zu verringern. Er kann None sein, um die Standardeinstellung zu wählen (Pufferung aktiviert für DAC.noise(), DAC.triangle() und DAC.write_timed(), deaktiviert für DAC.write()), False, um die Pufferung vollständig zu deaktivieren, oder True, um die Ausgangspufferung zu aktivieren.

Wenn die Pufferung aktiviert ist, kann der DAC-Pin Lasten bis hinunter zu 5 KΩ treiben. Andernfalls hat er eine Ausgangsimpedanz von maximal 15 KΩ: Um folglich eine Genauigkeit von 1 % ohne Pufferung zu erreichen, muss die angelegte Last kleiner als 1,5 MΩ sein. Die Verwendung des Puffers geht mit einer Einbuße bei der Genauigkeit einher, insbesondere nahe den Bereichsenden.

Methoden

init(bits: int = 8, *, buffering: bool | None = None) None

Initialisiert den DAC neu. bits kann 8 oder 12 sein. buffering kann None, False oder True sein; siehe den obigen Konstruktor für die Bedeutung dieses Parameters.

deinit() None

Deinitialisiert den DAC und macht seinen Pin für andere Verwendungen verfügbar.

noise(freq: int) None

Erzeugt ein pseudozufälliges Rauschsignal. Mit der angegebenen Frequenz wird ein neuer Zufallswert an den DAC-Ausgang geschrieben.

triangle(freq: int) None

Erzeugt eine Dreieckswelle. Der Wert am DAC-Ausgang ändert sich mit der angegebenen Frequenz und durchläuft den gesamten 12-Bit-Bereich (auf und ab). Daher ist die Frequenz der sich wiederholenden Dreieckswelle selbst um den Faktor 8192 kleiner.

write(value: int) None

Direkter Zugriff auf den DAC-Ausgang. Der minimale Wert ist 0; der maximale ist (2**bits) - 1, wobei bits beim Erstellen des DAC-Objekts oder über init() festgelegt wird.

write_timed(data: bytes | bytearray | 'array.array', freq: int | Timer, *, mode: int = DAC.NORMAL) None

Startet eine Übertragung von RAM zum DAC mittels eines DMA-Transfers. Die Eingabedaten werden im 8-Bit-Modus als Array von Bytes und im 12-Bit-Modus als Array von vorzeichenlosen Halbwörtern (Array-Typcode ‚H‘) behandelt.

freq kann eine Ganzzahl sein, die die Frequenz angibt, mit der die DAC-Samples geschrieben werden, unter Verwendung von Timer(6). Oder es kann ein bereits initialisiertes Timer-Objekt sein, das zum Auslösen des DAC-Samples verwendet wird. Gültige Timer sind 2, 4, 5, 6, 7 und 8.

mode kann DAC.NORMAL oder DAC.CIRCULAR sein.

Beispiel mit der gleichzeitigen Verwendung beider DACs:

dac1 = DAC(1)
dac2 = DAC(2)
dac1.write_timed(buf1, pyb.Timer(6, freq=100), mode=DAC.CIRCULAR)
dac2.write_timed(buf2, pyb.Timer(7, freq=200), mode=DAC.CIRCULAR)

Konstanten

NORMAL: int

Der Modus NORMAL führt eine einzelne Übertragung der Wellenform im Datenpuffer durch.

CIRCULAR: int

Der Modus CIRCULAR überträgt die Wellenform im Datenpuffer und springt jedes Mal, wenn er das Ende erreicht, zurück zum Anfang des Puffers, wodurch eine kontinuierliche Schleife erzeugt wird, bis deinit() aufgerufen wird.