třída DAC – digitálně-analogový převod

DAC vydává analogové napětí mezi 0 V a 3,3 V na jednom ze dvou DAC kanálů STM32.

Na každém STM32 OpenMV Cam, který poskytuje pyb.DAC (M4 / M7 / H7 / H7 Plus / Pure Thermal), jsou kanály zapojeny následovně:

DAC kanál

Pin na konektoru

Pin STM32

DAC(1)

(není na konektoru)

PA4

DAC(2)

P6

PA5

OpenMV Cam N6 nemá periferii DAC; pyb.DAC na této desce není k dispozici.

Příklad použití:

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

Pro výstup spojité sinusovky:

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)

Pro výstup spojité sinusovky s 12bitovým rozlišením:

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)

Konstruktory

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

Vytvoří nový objekt DAC.

port může být objekt Pin nebo celé číslo (1 nebo 2), které vybírá DAC kanál 1 nebo 2. Fyzický pin, na který je každý kanál vyveden, závisí na konkrétní OpenMV Cam.

bits je celé číslo udávající rozlišení a může být 8 nebo 12. Maximální hodnota přijímaná metodami write() a write_timed() je (2**bits) - 1 (255 pro 8 bitů, 4095 pro 12 bitů).

Parametr buffering vybírá chování výstupního bufferu operačního zesilovače DAC, jehož účelem je snížit výstupní impedanci. Může být None pro výběr výchozího nastavení (buffering povolen pro DAC.noise(), DAC.triangle() a DAC.write_timed(), zakázán pro DAC.write()), False pro úplné zakázání bufferingu, nebo True pro povolení výstupního bufferingu.

Když je buffering povolen, může pin DAC budit zátěž až do 5KΩ. Jinak má maximální výstupní impedanci 15KΩ: pro dosažení přesnosti 1 % bez bufferingu je tedy nutné, aby připojená zátěž byla menší než 1,5MΩ. Použití bufferu s sebou nese zhoršení přesnosti, zejména blízko krajních hodnot rozsahu.

Metody

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

Znovu inicializuje DAC. bits může být 8 nebo 12. buffering může být None, False nebo True; význam tohoto parametru viz konstruktor výše.

deinit() None

Deinicializuje DAC a uvolní jeho pin pro jiné použití.

noise(freq: int) None

Generuje pseudonáhodný šumový signál. Na výstup DAC se zadanou frekvencí zapisuje nový náhodný vzorek.

triangle(freq: int) None

Generuje trojúhelníkový průběh. Hodnota na výstupu DAC se mění se zadanou frekvencí a probíhá celým 12bitovým rozsahem (nahoru a dolů). Frekvence samotného opakujícího se trojúhelníkového průběhu je proto 8192krát menší.

write(value: int) None

Přímý přístup k výstupu DAC. Minimální hodnota je 0; maximální je (2**bits) - 1, kde bits se nastavuje při vytváření objektu DAC nebo přes init().

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

Zahájí dávkový přenos z RAM do DAC pomocí DMA. Vstupní data jsou v 8bitovém režimu považována za pole bytů a ve 12bitovém režimu za pole bezznaménkových půlslov (typový kód pole ‚H‘).

freq může být celé číslo udávající frekvenci, se kterou se zapisují vzorky DAC, s použitím Timer(6). Nebo to může být již inicializovaný objekt Timer, který se použije ke spouštění vzorků DAC. Platné časovače jsou 2, 4, 5, 6, 7 a 8.

mode může být DAC.NORMAL nebo DAC.CIRCULAR.

Příklad použití obou DAC současně:

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)

Konstanty

NORMAL: int

Režim NORMAL provede jednorázové vyslání průběhu z datového bufferu.

CIRCULAR: int

Režim CIRCULAR vysílá průběh z datového bufferu a po dosažení konce se pokaždé vrátí na začátek bufferu, čímž vytváří spojitou smyčku, dokud není zavolána metoda deinit().