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 |
|---|---|---|
|
(non sull’header) |
|
|
|
|
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.
portpuò essere un oggettoPin, oppure un intero (1o2) 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 dawrite()ewrite_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
Noneper selezionare il valore predefinito (buffering abilitato perDAC.noise(),DAC.triangle()eDAC.write_timed(), e disabilitato perDAC.write()),Falseper disabilitare completamente il buffering, oppureTrueper 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,FalseoTrue; vedere il costruttore sopra per il significato di questo parametro.
- 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, dovebitsviene impostato alla creazione dell’oggetto DAC o tramiteinit().
- 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.
freqpuò 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.modepuò essereDAC.NORMALoDAC.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¶