clasa DAC – conversie digital-analogică¶
DAC-ul generează tensiuni analogice între 0 V și 3,3 V pe unul dintre cele două canale DAC ale STM32.
Pe fiecare OpenMV Cam bazat pe STM32 care expune pyb.DAC (M4 / M7 / H7 / H7 Plus / Pure Thermal), canalele sunt conectate astfel:
Canal DAC |
Pin header |
Pin STM32 |
|---|---|---|
|
(nu este pe header) |
|
|
|
|
OpenMV Cam N6 nu are un periferic DAC; pyb.DAC nu este disponibil pe această placă.
Exemplu de utilizare:
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
Pentru a genera o undă sinusoidală continuă:
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)
Pentru a genera o undă sinusoidală continuă la rezoluție de 12 biți:
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)
Constructori¶
- class pyb.DAC(port: int | Pin, bits: int = 8, *, buffering: bool | None = None)¶
Construiește un nou obiect DAC.
portpoate fi un obiectPinsau un întreg (1sau2) care selectează canalul DAC 1 sau 2. Pinul fizic la care este direcționat fiecare canal depinde de OpenMV Cam.bitseste un întreg care specifică rezoluția și poate fi 8 sau 12. Valoarea maximă acceptată dewrite()șiwrite_timed()este(2**bits) - 1(255 pentru 8 biți, 4095 pentru 12 biți).Parametrul buffering selectează comportamentul tamponului (buffer) de ieșire al amplificatorului operațional al DAC-ului, al cărui scop este reducerea impedanței de ieșire. Poate fi
Nonepentru a selecta valoarea implicită (tamponare activată pentruDAC.noise(),DAC.triangle()șiDAC.write_timed(), și dezactivată pentruDAC.write()),Falsepentru a dezactiva complet tamponarea sauTruepentru a activa tamponarea ieșirii.Când tamponarea este activată, pinul DAC poate alimenta sarcini de până la 5KΩ. În caz contrar, are o impedanță de ieșire de maximum 15KΩ: în consecință, pentru a obține o precizie de 1% fără tamponare, sarcina aplicată trebuie să fie mai mică de 1,5MΩ. Utilizarea tamponului implică o penalizare a preciziei, în special în apropierea extremelor intervalului.
Metode¶
- init(bits: int = 8, *, buffering: bool | None = None) None¶
Reinițializează DAC-ul. bits poate fi 8 sau 12. buffering poate fi
None,FalsesauTrue; vezi constructorul de mai sus pentru semnificația acestui parametru.
- noise(freq: int) None¶
Generează un semnal de zgomot pseudo-aleatoriu. La frecvența dată se scrie un nou eșantion aleatoriu la ieșirea DAC-ului.
- triangle(freq: int) None¶
Generează o undă triunghiulară. Valoarea de la ieșirea DAC-ului se modifică la frecvența dată și parcurge în rampă întregul interval de 12 biți (în sus și în jos). Prin urmare, frecvența undei triunghiulare repetate în sine este de 8192 de ori mai mică.
- write(value: int) None¶
Acces direct la ieșirea DAC-ului. Valoarea minimă este
0; maximul este(2**bits) - 1, undebitseste setat la crearea obiectului DAC sau prininit().
- write_timed(data: bytes | bytearray | 'array.array', freq: int | Timer, *, mode: int = DAC.NORMAL) None¶
Inițiază un transfer în rafală din RAM către DAC folosind un transfer DMA. Datele de intrare sunt tratate ca un tablou de octeți în modul pe 8 biți și ca un tablou de jumătăți de cuvânt fără semn (codul de tip al tabloului «H») în modul pe 12 biți.
freqpoate fi un întreg care specifică frecvența la care se scriu eșantioanele DAC, folosind Timer(6). Sau poate fi un obiect Timer deja inițializat, care este folosit pentru a declanșa eșantionul DAC. Temporizatoarele valide sunt 2, 4, 5, 6, 7 și 8.modepoate fiDAC.NORMALsauDAC.CIRCULAR.Exemplu folosind ambele DAC-uri în același timp:
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)
Constante¶