class DAC – digitaali-analogiamuunnos

DAC tuottaa analogiajännitteitä välillä 0 V ja 3,3 V toisessa STM32:n kahdesta DAC-kanavasta.

Jokaisessa STM32-pohjaisessa OpenMV Cam -kamerassa, joka tarjoaa pyb.DAC-luokan (M4 / M7 / H7 / H7 Plus / Pure Thermal), kanavat on kytketty seuraavasti:

DAC-kanava

Liitinnasta

STM32-nasta

DAC(1)

(ei liittimessä)

PA4

DAC(2)

P6

PA5

OpenMV Cam N6 -kamerassa ei ole DAC-oheislaitetta; pyb.DAC ei ole käytettävissä tässä laudassa.

Esimerkkikäyttö:

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

Jatkuvan siniaallon tuottamiseksi:

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)

Jatkuvan siniaallon tuottamiseksi 12-bittisellä resoluutiolla:

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)

Konstruktorit

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

Luo uusi DAC-objekti.

port voi olla Pin-objekti tai kokonaisluku (1 tai 2), joka valitsee DAC-kanavan 1 tai 2. Fyysinen nasta, johon kukin kanava on reititetty, riippuu OpenMV Cam -kamerasta.

bits on kokonaisluku, joka määrittää resoluution, ja se voi olla 8 tai 12. Suurin arvo, jonka write() ja write_timed() hyväksyvät, on (2**bits) - 1 (255 8-bittisellä, 4095 12-bittisellä).

buffering-parametri valitsee DAC:n operaatiovahvistimen ulostulopuskurin toiminnan, jonka tarkoituksena on pienentää ulostuloimpedanssia. Se voi olla None, joka valitsee oletuksen (puskurointi käytössä metodeille DAC.noise(), DAC.triangle() ja DAC.write_timed(), ja pois käytöstä metodille DAC.write()), False, joka poistaa puskuroinnin kokonaan käytöstä, tai True, joka ottaa ulostulopuskuroinnin käyttöön.

Kun puskurointi on käytössä, DAC-nasta voi ohjata kuormia aina 5 kΩ:iin asti. Muutoin sen ulostuloimpedanssi on enintään 15 kΩ: tämän vuoksi 1 %:n tarkkuuden saavuttaminen ilman puskurointia edellyttää, että käytetty kuorma on alle 1,5 MΩ. Puskurin käyttö aiheuttaa tarkkuuden heikkenemisen, erityisesti alueen ääripäissä.

Metodit

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

Alusta DAC uudelleen. bits voi olla 8 tai 12. buffering voi olla None, False tai True; katso tämän parametrin merkitys yllä olevasta konstruktorista.

deinit() None

Poista DAC käytöstä, jolloin sen nasta vapautuu muuhun käyttöön.

noise(freq: int) None

Tuota pseudosatunnainen kohinasignaali. DAC:n ulostuloon kirjoitetaan uusi satunnainen näyte annetulla taajuudella.

triangle(freq: int) None

Tuota kolmioaalto. DAC:n ulostulon arvo muuttuu annetulla taajuudella ja kulkee läpi koko 12-bittisen alueen (ylös ja alas). Tästä syystä itse toistuvan kolmioaallon taajuus on 8192 kertaa pienempi.

write(value: int) None

Suora pääsy DAC:n ulostuloon. Pienin arvo on 0; suurin on (2**bits) - 1, jossa bits asetetaan DAC-objektia luotaessa tai metodilla init().

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

Käynnistää RAM-muistista DAC:hen suuntautuvan purskeen DMA-siirtoa käyttäen. Syötedataa käsitellään tavutaulukkona 8-bittisessä tilassa ja etumerkittömien puolisanojen taulukkona (taulukon tyyppikoodi ’H’) 12-bittisessä tilassa.

freq voi olla kokonaisluku, joka määrittää taajuuden, jolla DAC-näytteet kirjoitetaan käyttäen Timer(6):tta. Tai se voi olla jo alustettu Timer-objekti, jota käytetään DAC-näytteen laukaisemiseen. Kelvolliset ajastimet ovat 2, 4, 5, 6, 7 ja 8.

mode voi olla DAC.NORMAL tai DAC.CIRCULAR.

Esimerkki, jossa molempia DAC:eja käytetään samanaikaisesti:

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)

Vakiot

NORMAL: int

NORMAL-tila tekee yhden datapuskurissa olevan aaltomuodon lähetyksen.

CIRCULAR: int

CIRCULAR-tila lähettää datapuskurissa olevan aaltomuodon ja palaa puskurin alkuun joka kerta, kun se saavuttaa lopun, tuottaen jatkuvan silmukan, kunnes deinit() kutsutaan.