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

DAC(1)

(tidak pada header)

PA4

DAC(2)

P6

PA5

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.

port dapat berupa objek Pin, atau bilangan bulat (1 atau 2) yang memilih saluran DAC 1 atau 2. Pin fisik yang dirutekan ke setiap saluran bergantung pada OpenMV Cam.

bits adalah bilangan bulat yang menentukan resolusi, dan dapat bernilai 8 atau 12. Nilai maksimum yang diterima oleh write() dan write_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 None untuk memilih default (buffering diaktifkan untuk DAC.noise(), DAC.triangle() dan DAC.write_timed(), dan dinonaktifkan untuk DAC.write()), False untuk menonaktifkan buffering sepenuhnya, atau True untuk 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, False atau True; lihat konstruktor di atas untuk arti parameter ini.

deinit() None

De-inisialisasi DAC sehingga pin-nya tersedia untuk penggunaan lain.

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 mana bits ditetapkan saat membuat objek DAC atau melalui init().

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.

freq dapat 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.

mode dapat berupa DAC.NORMAL atau DAC.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

NORMAL: int

Mode NORMAL melakukan transmisi tunggal gelombang dalam buffer data.

CIRCULAR: int

Mode CIRCULAR mentransmisikan gelombang dalam buffer data dan kembali ke awal buffer setiap kali mencapai akhir, menghasilkan loop berkelanjutan hingga deinit() dipanggil.