class DAC -- konversi digital ke analog¶
DAC mengeluarkan tegangan analog antara 0 V dan 3,3 V pada salah satu dari dua saluran DAC STM32.
Pada setiap STM32 OpenMV Cam yang mengekspos pyb.DAC (M4 / M7 / H7 / H7 Plus / Pure Thermal) saluran-salurannya terhubung sebagai berikut:
Saluran DAC |
Pin header |
Pin STM32 |
|---|---|---|
|
(tidak pada header) |
|
|
|
|
OpenMV Cam N6 tidak memiliki periferal DAC; pyb.DAC tidak tersedia pada board tersebut.
Contoh penggunaan:
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
Untuk menghasilkan gelombang sinus terus-menerus:
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)
Untuk menghasilkan gelombang sinus terus-menerus dengan resolusi 12-bit:
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)
Konstruktor¶
- class pyb.DAC(port: int | Pin, bits: int = 8, *, buffering: bool | None = None)¶
Buat objek DAC baru.
portdapat berupa objekPin, atau bilangan bulat (1atau2) yang memilih saluran DAC 1 atau 2. Pin fisik yang dirutekan ke setiap saluran bergantung pada OpenMV Cam.bitsadalah bilangan bulat yang menentukan resolusi, dan dapat bernilai 8 atau 12. Nilai maksimum yang diterima olehwrite()danwrite_timed()adalah(2**bits) - 1(255 untuk 8-bit, 4095 untuk 12-bit).Parameter buffering memilih perilaku buffer output op-amp DAC, yang bertujuan mengurangi impedansi output. Nilainya dapat berupa
Noneuntuk memilih default (buffering diaktifkan untukDAC.noise(),DAC.triangle()danDAC.write_timed(), dan dinonaktifkan untukDAC.write()),Falseuntuk menonaktifkan buffering sepenuhnya, atauTrueuntuk mengaktifkan buffer output.Ketika buffering diaktifkan, pin DAC dapat menggerakkan beban hingga 5KΩ. Sebaliknya, impedansi outputnya maksimal 15KΩ: oleh karena itu, untuk mencapai akurasi 1% tanpa buffering, beban yang diterapkan harus kurang dari 1,5MΩ. Penggunaan buffer menimbulkan penalti pada akurasi, terutama di dekat batas-batas rentang.
Metode¶
- init(bits: int = 8, *, buffering: bool | None = None) None¶
Inisialisasi ulang DAC. bits dapat bernilai 8 atau 12. buffering dapat berupa
None,FalseatauTrue; lihat konstruktor di atas untuk arti parameter ini.
- noise(freq: int) None¶
Hasilkan sinyal noise pseudo-acak. Sampel acak baru ditulis ke output DAC pada frekuensi yang diberikan.
- triangle(freq: int) None¶
Hasilkan gelombang segitiga. Nilai pada output DAC berubah pada frekuensi yang diberikan dan merampa melalui rentang penuh 12-bit (naik dan turun). Oleh karena itu frekuensi gelombang segitiga yang berulang itu sendiri 8192 kali lebih kecil.
- write(value: int) None¶
Akses langsung ke output DAC. Nilai minimum adalah
0; nilai maksimum adalah(2**bits) - 1, di manabitsditetapkan saat membuat objek DAC atau melaluiinit().
- write_timed(data: bytes | bytearray | 'array.array', freq: int | Timer, *, mode: int = DAC.NORMAL) None¶
Memulai burst RAM ke DAC menggunakan transfer DMA. Data input diperlakukan sebagai array byte dalam mode 8-bit, dan array half-word unsigned (typecode array 'H') dalam mode 12-bit.
freqdapat berupa bilangan bulat yang menentukan frekuensi penulisan sampel DAC, menggunakan Timer(6). Atau dapat berupa objek Timer yang sudah diinisialisasi yang digunakan untuk memicu sampel DAC. Timer yang valid adalah 2, 4, 5, 6, 7 dan 8.modedapat berupaDAC.NORMALatauDAC.CIRCULAR.Contoh penggunaan kedua DAC secara bersamaan:
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)
Konstanta¶