classe DAC – conversione digitale-analogica

Il DAC produce tensioni analogiche comprese tra 0 V e 3,3 V su uno dei due canali DAC dell’STM32.

Su ogni OpenMV Cam basata su STM32 che espone pyb.DAC (M4 / M7 / H7 / H7 Plus / Pure Thermal) i canali sono cablati come segue:

Canale DAC

Pin header

Pin STM32

DAC(1)

(non sull’header)

PA4

DAC(2)

P6

PA5

L’OpenMV Cam N6 non dispone di una periferica DAC; pyb.DAC non è disponibile su quella scheda.

Esempio di utilizzo:

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

Per generare un’onda sinusoidale continua:

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)

Per generare un’onda sinusoidale continua con risoluzione a 12 bit:

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)

Costruttori

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

Costruisce un nuovo oggetto DAC.

port può essere un oggetto Pin, oppure un intero (1 o 2) che seleziona il canale DAC 1 o 2. Il pin fisico a cui ogni canale è instradato dipende dall’OpenMV Cam.

bits è un intero che specifica la risoluzione e può valere 8 o 12. Il valore massimo accettato da write() e write_timed() è (2**bits) - 1 (255 per 8 bit, 4095 per 12 bit).

Il parametro buffering seleziona il comportamento del buffer di uscita dell’amplificatore operazionale del DAC, il cui scopo è ridurre l’impedenza di uscita. Può essere None per selezionare il valore predefinito (buffering abilitato per DAC.noise(), DAC.triangle() e DAC.write_timed(), e disabilitato per DAC.write()), False per disabilitare completamente il buffering, oppure True per abilitare il buffering di uscita.

Quando il buffering è abilitato, il pin del DAC può pilotare carichi fino a 5KΩ. Altrimenti ha un’impedenza di uscita massima di 15KΩ: di conseguenza, per ottenere un’accuratezza dell’1% senza buffering, il carico applicato deve essere inferiore a 1,5MΩ. L’uso del buffer comporta una penalità in termini di accuratezza, specialmente in prossimità degli estremi del campo.

Metodi

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

Reinizializza il DAC. bits può essere 8 o 12. buffering può essere None, False o True; vedere il costruttore sopra per il significato di questo parametro.

deinit() None

De-inizializza il DAC rendendo il suo pin disponibile per altri usi.

noise(freq: int) None

Genera un segnale di rumore pseudo-casuale. Un nuovo campione casuale viene scritto sull’uscita del DAC alla frequenza indicata.

triangle(freq: int) None

Genera un’onda triangolare. Il valore sull’uscita del DAC cambia alla frequenza indicata e copre con una rampa l’intero campo a 12 bit (in salita e in discesa). Pertanto la frequenza dell’onda triangolare ripetuta stessa è 8192 volte inferiore.

write(value: int) None

Accesso diretto all’uscita del DAC. Il valore minimo è 0; il massimo è (2**bits) - 1, dove bits viene impostato alla creazione dell’oggetto DAC o tramite init().

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

Avvia un trasferimento a raffica dalla RAM al DAC usando un trasferimento DMA. I dati di ingresso sono trattati come un array di byte in modalità 8 bit, e come un array di half-word senza segno (typecode di array “H”) in modalità 12 bit.

freq può essere un intero che specifica la frequenza alla quale scrivere i campioni del DAC, usando Timer(6). Oppure può essere un oggetto Timer già inizializzato che viene usato per attivare il campione del DAC. I timer validi sono 2, 4, 5, 6, 7 e 8.

mode può essere DAC.NORMAL o DAC.CIRCULAR.

Esempio di utilizzo di entrambi i DAC contemporaneamente:

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)

Costanti

NORMAL: int

La modalità NORMAL esegue una singola trasmissione della forma d’onda contenuta nel buffer dei dati.

CIRCULAR: int

La modalità CIRCULAR trasmette la forma d’onda contenuta nel buffer dei dati e, ogni volta che raggiunge la fine, ritorna all’inizio del buffer, producendo un ciclo continuo fino a quando non viene chiamato deinit().