class DAC – dijitalden analoğa dönüştürme

DAC, iki STM32 DAC kanalından birinde 0 V ile 3,3 V arasında analog gerilimler üretir.

pyb.DAC özelliğini sunan her STM32 OpenMV Cam (M4 / M7 / H7 / H7 Plus / Pure Thermal) üzerinde kanallar aşağıdaki gibi bağlanmıştır:

DAC kanalı

Başlık pini

STM32 pini

DAC(1)

(başlıkta değil)

PA4

DAC(2)

P6

PA5

OpenMV Cam N6 bir DAC çevre birimine sahip değildir; pyb.DAC o kartta kullanılamaz.

Örnek kullanım:

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

Sürekli bir sinüs dalgası üretmek için:

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)

12 bit çözünürlükte sürekli bir sinüs dalgası üretmek için:

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)

Yapıcılar

class pyb.DAC(port: int | Pin, bits: int = 8, *, buffering: bool | None = None)

Yeni bir DAC nesnesi oluşturur.

port bir Pin nesnesi olabilir ya da DAC kanalı 1 veya 2’yi seçen bir tam sayı (1 veya 2) olabilir. Her kanalın yönlendirildiği fiziksel pin OpenMV Cam’e bağlıdır.

bits çözünürlüğü belirten bir tam sayıdır ve 8 ya da 12 olabilir. write() ve write_timed() tarafından kabul edilen maksimum değer (2**bits) - 1 şeklindedir (8 bit için 255, 12 bit için 4095).

buffering parametresi, amacı çıkış empedansını azaltmak olan DAC işlemsel yükselteç çıkış arabelleğinin davranışını seçer. Varsayılanı seçmek için None olabilir (DAC.noise(), DAC.triangle() ve DAC.write_timed() için arabellekleme etkin, DAC.write() için devre dışı), arabelleklemeyi tamamen devre dışı bırakmak için False ya da çıkış arabelleklemesini etkinleştirmek için True olabilir.

Arabellekleme etkin olduğunda DAC pini 5KΩ’a kadar yükleri sürebilir. Aksi takdirde maksimum 15KΩ çıkış empedansına sahiptir: dolayısıyla arabellekleme olmadan %1 doğruluk elde etmek için uygulanan yükün 1.5MΩ’dan küçük olması gerekir. Arabelleğin kullanılması, özellikle aralığın uçlarına yakın yerlerde doğrulukta bir kayba yol açar.

Yöntemler

init(bits: int = 8, *, buffering: bool | None = None) None

DAC’ı yeniden başlatır. bits 8 veya 12 olabilir. buffering None, False veya True olabilir; bu parametrenin anlamı için yukarıdaki yapıcıya bakın.

deinit() None

DAC’ı kapatarak pinini başka kullanımlar için kullanılabilir hale getirir.

noise(freq: int) None

Sözde rastgele bir gürültü sinyali üretir. Verilen frekansta DAC çıkışına yeni bir rastgele örnek yazılır.

triangle(freq: int) None

Bir üçgen dalga üretir. DAC çıkışındaki değer verilen frekansta değişir ve tam 12 bitlik aralık boyunca (yukarı ve aşağı) rampalanır. Bu nedenle tekrarlanan üçgen dalganın kendi frekansı 8192 kat daha küçüktür.

write(value: int) None

DAC çıkışına doğrudan erişim. Minimum değer 0; maksimum değer (2**bits) - 1 şeklindedir; burada bits, DAC nesnesi oluşturulurken veya init() aracılığıyla ayarlanır.

write_timed(data: bytes | bytearray | 'array.array', freq: int | Timer, *, mode: int = DAC.NORMAL) None

Bir DMA aktarımı kullanarak RAM’den DAC’a bir patlama (burst) başlatır. Giriş verileri 8 bit modunda bir bayt dizisi, 12 bit modunda ise işaretsiz yarım sözcüklerden (dizi tip kodu ‘H’) oluşan bir dizi olarak işlenir.

freq, Timer(6) kullanılarak DAC örneklerinin yazılacağı frekansı belirten bir tam sayı olabilir. Ya da DAC örneğini tetiklemek için kullanılan, önceden başlatılmış bir Timer nesnesi olabilir. Geçerli zamanlayıcılar 2, 4, 5, 6, 7 ve 8’dir.

mode DAC.NORMAL veya DAC.CIRCULAR olabilir.

Her iki DAC’ı aynı anda kullanan örnek:

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)

Sabitler

NORMAL: int

NORMAL modu, veri arabelleğindeki dalga biçiminin tek bir aktarımını gerçekleştirir.

CIRCULAR: int

CIRCULAR modu, veri arabelleğindeki dalga biçimini aktarır ve her sona ulaştığında arabelleğin başına geri sarar; bu da deinit() çağrılana kadar sürekli bir döngü üretir.