klasa DAC – digitalno-analogna pretvorba

DAC izlaže analogne napone između 0 V i 3,3 V na jednom od dva STM32 DAC kanala.

Na svakoj STM32 OpenMV Cam kameri koja izlaže pyb.DAC (M4 / M7 / H7 / H7 Plus / Pure Thermal) kanali su ožičeni na sljedeći način:

DAC kanal

Pin zaglavlja

STM32 pin

DAC(1)

(nije na zaglavlju)

PA4

DAC(2)

P6

PA5

OpenMV Cam N6 nema DAC periferiju; pyb.DAC nije dostupan na toj ploči.

Primjer upotrebe:

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

Za izlaz kontinuiranog sinusnog vala:

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)

Za izlaz kontinuiranog sinusnog vala u 12-bitnoj razlučivosti:

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)

Konstruktori

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

Stvara novi DAC objekt.

port može biti Pin objekt ili cijeli broj (1 ili 2) koji odabire DAC kanal 1 ili 2. Fizički pin na koji je svaki kanal usmjeren ovisi o OpenMV Cam kameri.

bits je cijeli broj koji određuje razlučivost i može biti 8 ili 12. Najveća vrijednost koju prihvaćaju write() i write_timed() jest (2**bits) - 1 (255 za 8-bitnu, 4095 za 12-bitnu).

Parametar buffering odabire ponašanje izlaznog međuspremnika DAC operacijskog pojačala, čija je svrha smanjiti izlaznu impedanciju. Može biti None za odabir zadane vrijednosti (međuspremnik omogućen za DAC.noise(), DAC.triangle() i DAC.write_timed(), a onemogućen za DAC.write()), False za potpuno onemogućavanje međuspremnika ili True za omogućavanje izlaznog međuspremnika.

Kada je međuspremnik omogućen, DAC pin može pokretati terete do 5KΩ. U suprotnom ima izlaznu impedanciju od najviše 15KΩ: posljedično, za postizanje točnosti od 1% bez međuspremnika potrebno je da primijenjeni teret bude manji od 1,5MΩ. Upotreba međuspremnika unosi gubitak u točnosti, osobito blizu krajeva raspona.

Metode

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

Ponovno inicijalizira DAC. bits može biti 8 ili 12. buffering može biti None, False ili True; vidi prethodni konstruktor za značenje ovog parametra.

deinit() None

De-inicijalizira DAC čineći njegov pin dostupnim za druge namjene.

noise(freq: int) None

Generira pseudoslučajni šumni signal. Novi slučajni uzorak zapisuje se na DAC izlaz na zadanoj frekvenciji.

triangle(freq: int) None

Generira trokutasti val. Vrijednost na DAC izlazu mijenja se na zadanoj frekvenciji i prolazi punim 12-bitnim rasponom (gore i dolje). Stoga je frekvencija samog ponavljajućeg trokutastog vala 8192 puta manja.

write(value: int) None

Izravni pristup DAC izlazu. Najmanja vrijednost je 0; najveća je (2**bits) - 1, gdje se bits postavlja pri stvaranju DAC objekta ili putem init().

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

Pokreće rafal iz RAM-a u DAC pomoću DMA prijenosa. Ulazni podaci tretiraju se kao polje bajtova u 8-bitnom načinu rada te kao polje nepredznačenih poluriječi (kod tipa polja ‘H’) u 12-bitnom načinu rada.

freq može biti cijeli broj koji određuje frekvenciju na kojoj se zapisuju DAC uzorci, koristeći Timer(6). Ili može biti već inicijaliziran Timer objekt koji se koristi za okidanje DAC uzorka. Valjani mjerači vremena su 2, 4, 5, 6, 7 i 8.

mode može biti DAC.NORMAL ili DAC.CIRCULAR.

Primjer upotrebe oba DAC-a istovremeno:

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)

Konstante

NORMAL: int

Način rada NORMAL izvodi jedan prijenos valnog oblika iz međuspremnika podataka.

CIRCULAR: int

Način rada CIRCULAR prenosi valni oblik iz međuspremnika podataka i vraća se na početak međuspremnika svaki put kad dosegne kraj, stvarajući kontinuiranu petlju dok se ne pozove deinit().