DAC osztály – digitális-analóg átalakítás

A DAC 0 V és 3,3 V közötti analóg feszültségeket állít elő a két STM32 DAC csatorna egyikén.

Minden olyan STM32-alapú OpenMV Cam esetében, amely elérhetővé teszi a pyb.DAC osztályt (M4 / M7 / H7 / H7 Plus / Pure Thermal), a csatornák bekötése a következő:

DAC csatorna

Tűsoros láb

STM32 láb

DAC(1)

(nem a tűsoron)

PA4

DAC(2)

P6

PA5

Az OpenMV Cam N6 nem rendelkezik DAC perifériával; a pyb.DAC ezen a kártyán nem elérhető.

Példa a használatra:

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

Folyamatos szinuszhullám előállításához:

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)

Folyamatos szinuszhullám előállításához 12 bites felbontással:

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)

Konstruktorok

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

Új DAC objektum létrehozása.

A port lehet egy Pin objektum, vagy egy egész szám (1 vagy 2), amely az 1-es vagy 2-es DAC csatornát választja ki. Az, hogy az egyes csatornák melyik fizikai lábra vannak vezetve, az OpenMV Cam típusától függ.

A bits egy egész szám, amely a felbontást adja meg, és értéke 8 vagy 12 lehet. A write() és write_timed() által elfogadott legnagyobb érték (2**bits) - 1 (255 a 8 bites, 4095 a 12 bites esetben).

A buffering paraméter a DAC műveleti erősítő kimeneti pufferének viselkedését választja ki, amelynek célja a kimeneti impedancia csökkentése. Lehet None az alapértelmezett kiválasztásához (a pufferelés engedélyezve van a DAC.noise(), DAC.triangle() és DAC.write_timed() esetén, és letiltva a DAC.write() esetén), False a pufferelés teljes letiltásához, vagy True a kimeneti pufferelés engedélyezéséhez.

Ha a pufferelés engedélyezve van, a DAC láb akár 5 KΩ-ig terhelhető. Ellenkező esetben a kimeneti impedanciája legfeljebb 15 KΩ: ennek következtében pufferelés nélkül az 1%-os pontosság eléréséhez az alkalmazott terhelésnek 1,5 MΩ-nál kisebbnek kell lennie. A puffer használata pontosságbeli veszteséggel jár, különösen a tartomány szélső értékeinek közelében.

Metódusok

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

A DAC újrainicializálása. A bits értéke 8 vagy 12 lehet. A buffering értéke None, False vagy True lehet; e paraméter jelentéséről lásd a fenti konstruktort.

deinit() None

A DAC deinicializálása, amellyel a lába más célokra is elérhetővé válik.

noise(freq: int) None

Pszeudo-véletlenszerű zajjel előállítása. Az adott frekvencián új véletlenszerű minta kerül a DAC kimenetére.

triangle(freq: int) None

Háromszögjel előállítása. A DAC kimenetén lévő érték az adott frekvencián változik, és végigfut a teljes 12 bites tartományon (fel és le). Ezért az ismétlődő háromszögjel saját frekvenciája 8192-szer kisebb.

write(value: int) None

Közvetlen hozzáférés a DAC kimenetéhez. A legkisebb érték 0; a legnagyobb (2**bits) - 1, ahol a bits a DAC objektum létrehozásakor vagy az init() segítségével van beállítva.

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

RAM-ból DAC-ba történő sorozatos átvitelt indít DMA-átvitel használatával. A bemeneti adatokat a rendszer 8 bites módban bájttömbként, 12 bites módban előjel nélküli félszavak tömbjeként (a tömb típuskódja «H») kezeli.

A freq lehet egy egész szám, amely megadja, milyen frekvencián kell a DAC mintákat kiírni, a Timer(6) használatával. Vagy lehet egy már inicializált Timer objektum, amely a DAC minták elindítására szolgál. Az érvényes időzítők a 2, 4, 5, 6, 7 és 8.

A mode lehet DAC.NORMAL vagy DAC.CIRCULAR.

Példa mindkét DAC egyidejű használatára:

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)

Konstansok

NORMAL: int

A NORMAL mód az adatpufferben lévő hullámformát egyetlen alkalommal továbbítja.

CIRCULAR: int

A CIRCULAR mód az adatpufferben lévő hullámformát továbbítja, és minden alkalommal, amikor a puffer végére ér, visszaugrik a puffer elejére, folyamatos hurkot hozva létre, amíg a deinit() meghívásra nem kerül.