klasa DAC – konwersja cyfrowo-analogowa¶
DAC wytwarza napięcia analogowe z zakresu od 0 V do 3,3 V na jednym z dwóch kanałów DAC układu STM32.
W każdej kamerze OpenMV Cam opartej na STM32, która udostępnia pyb.DAC (M4 / M7 / H7 / H7 Plus / Pure Thermal), kanały są podłączone w następujący sposób:
Kanał DAC |
Pin złącza |
Pin STM32 |
|---|---|---|
|
(niedostępny na złączu) |
|
|
|
|
OpenMV Cam N6 nie posiada urządzenia peryferyjnego DAC; pyb.DAC jest na tej płytce niedostępne.
Przykład użycia:
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
Aby wytworzyć ciągłą falę sinusoidalną:
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)
Aby wytworzyć ciągłą falę sinusoidalną z rozdzielczością 12-bitową:
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)
Konstruktory¶
- class pyb.DAC(port: int | Pin, bits: int = 8, *, buffering: bool | None = None)¶
Tworzy nowy obiekt DAC.
portmoże być obiektemPinalbo liczbą całkowitą (1lub2) wybierającą kanał DAC 1 lub 2. Fizyczny pin, do którego prowadzony jest dany kanał, zależy od modelu OpenMV Cam.bitsto liczba całkowita określająca rozdzielczość; może wynosić 8 lub 12. Maksymalna wartość akceptowana przezwrite()iwrite_timed()to(2**bits) - 1(255 dla 8 bitów, 4095 dla 12 bitów).Parametr buffering wybiera zachowanie wzmacniacza operacyjnego na wyjściu DAC, którego zadaniem jest zmniejszenie impedancji wyjściowej. Może przyjmować wartość
None, aby wybrać domyślne ustawienie (buforowanie włączone dlaDAC.noise(),DAC.triangle()iDAC.write_timed(), a wyłączone dlaDAC.write()),False, aby całkowicie wyłączyć buforowanie, lubTrue, aby włączyć buforowanie wyjścia.Gdy buforowanie jest włączone, pin DAC może zasilać obciążenia o wartości aż do 5 KΩ. W przeciwnym razie impedancja wyjściowa wynosi maksymalnie 15 KΩ: w konsekwencji, aby uzyskać dokładność 1% bez buforowania, przyłożone obciążenie musi być mniejsze niż 1,5 MΩ. Użycie bufora wiąże się z pogorszeniem dokładności, zwłaszcza w pobliżu skrajów zakresu.
Metody¶
- init(bits: int = 8, *, buffering: bool | None = None) None¶
Ponownie inicjalizuje DAC. bits może wynosić 8 lub 12. buffering może przyjmować wartość
None,FalselubTrue; znaczenie tego parametru opisano w konstruktorze powyżej.
- noise(freq: int) None¶
Generuje pseudolosowy sygnał szumu. Nowa losowa próbka jest zapisywana na wyjściu DAC z zadaną częstotliwością.
- triangle(freq: int) None¶
Generuje falę trójkątną. Wartość na wyjściu DAC zmienia się z zadaną częstotliwością i narasta przez cały zakres 12-bitowy (w górę i w dół). Dlatego częstotliwość samej powtarzającej się fali trójkątnej jest 8192 razy mniejsza.
- write(value: int) None¶
Bezpośredni dostęp do wyjścia DAC. Wartość minimalna to
0; maksymalna to(2**bits) - 1, gdziebitsustawiane jest podczas tworzenia obiektu DAC lub przezinit().
- write_timed(data: bytes | bytearray | 'array.array', freq: int | Timer, *, mode: int = DAC.NORMAL) None¶
Inicjuje transfer porcji danych z pamięci RAM do DAC za pomocą DMA. Dane wejściowe traktowane są jako tablica bajtów w trybie 8-bitowym oraz jako tablica półsłów bez znaku (kod typu tablicy «H») w trybie 12-bitowym.
freqmoże być liczbą całkowitą określającą częstotliwość, z jaką zapisywane są próbki DAC, przy użyciu Timer(6). Może też być już zainicjalizowanym obiektem Timer, który służy do wyzwalania próbki DAC. Prawidłowe liczniki to 2, 4, 5, 6, 7 i 8.modemoże przyjmować wartośćDAC.NORMALlubDAC.CIRCULAR.Przykład jednoczesnego użycia obu układów DAC:
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)
Stałe¶