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.