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 |
|---|---|---|
|
(nicht am Header) |
|
|
|
|
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.
portkann einPin-Objekt oder eine Ganzzahl (1oder2) 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.bitsist eine Ganzzahl, die die Auflösung angibt, und kann 8 oder 12 sein. Der maximale Wert, der vonwrite()undwrite_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
Nonesein, um die Standardeinstellung zu wählen (Pufferung aktiviert fürDAC.noise(),DAC.triangle()undDAC.write_timed(), deaktiviert fürDAC.write()),False, um die Pufferung vollständig zu deaktivieren, oderTrue, 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,FalseoderTruesein; siehe den obigen Konstruktor für die Bedeutung dieses Parameters.
- 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, wobeibitsbeim Erstellen des DAC-Objekts oder überinit()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.
freqkann 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.modekannDAC.NORMALoderDAC.CIRCULARsein.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¶