classe DAC – conversion numérique-analogique¶
Le DAC produit des tensions analogiques entre 0 V et 3,3 V sur l’un des deux canaux DAC du STM32.
Sur chaque OpenMV Cam à base de STM32 qui expose pyb.DAC (M4 / M7 / H7 / H7 Plus / Pure Thermal), les canaux sont câblés comme suit :
Canal DAC |
Broche d’embase |
Broche STM32 |
|---|---|---|
|
(pas sur l’embase) |
|
|
|
|
L’OpenMV Cam N6 ne dispose pas de périphérique DAC ; pyb.DAC n’est pas disponible sur cette carte.
Exemple d’utilisation
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
Pour produire une onde sinusoïdale continue
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)
Pour produire une onde sinusoïdale continue avec une résolution de 12 bits
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)
Constructeurs¶
- class pyb.DAC(port: int | Pin, bits: int = 8, *, buffering: bool | None = None)¶
Construit un nouvel objet DAC.
portpeut être un objetPin, ou un entier (1ou2) sélectionnant le canal DAC 1 ou 2. La broche physique vers laquelle chaque canal est routé dépend de l’OpenMV Cam.bitsest un entier spécifiant la résolution, et peut valoir 8 ou 12. La valeur maximale acceptée parwrite()etwrite_timed()est(2**bits) - 1(255 pour 8 bits, 4095 pour 12 bits).Le paramètre buffering sélectionne le comportement du tampon de sortie de l’amplificateur opérationnel du DAC, dont le but est de réduire l’impédance de sortie. Il peut valoir
Nonepour sélectionner la valeur par défaut (tampon activé pourDAC.noise(),DAC.triangle()etDAC.write_timed(), et désactivé pourDAC.write()),Falsepour désactiver complètement le tampon, ouTruepour activer le tampon de sortie.Lorsque le tampon est activé, la broche du DAC peut piloter des charges jusqu’à 5 KΩ. Sinon, elle présente une impédance de sortie de 15 KΩ au maximum : par conséquent, pour atteindre une précision de 1 % sans tampon, la charge appliquée doit être inférieure à 1,5 MΩ. L’utilisation du tampon entraîne une perte de précision, en particulier près des extrémités de la plage.
Méthodes¶
- init(bits: int = 8, *, buffering: bool | None = None) None¶
Réinitialise le DAC. bits peut valoir 8 ou 12. buffering peut valoir
None,FalseouTrue; voir le constructeur ci-dessus pour la signification de ce paramètre.
- noise(freq: int) None¶
Génère un signal de bruit pseudo-aléatoire. Un nouvel échantillon aléatoire est écrit sur la sortie du DAC à la fréquence donnée.
- triangle(freq: int) None¶
Génère une onde triangulaire. La valeur sur la sortie du DAC change à la fréquence donnée et parcourt en rampe toute la plage de 12 bits (montée et descente). Par conséquent, la fréquence de l’onde triangulaire répétitive elle-même est 8192 fois plus petite.
- write(value: int) None¶
Accès direct à la sortie du DAC. La valeur minimale est
0; la valeur maximale est(2**bits) - 1, oùbitsest défini lors de la création de l’objet DAC ou viainit().
- write_timed(data: bytes | bytearray | 'array.array', freq: int | Timer, *, mode: int = DAC.NORMAL) None¶
Lance une rafale de transfert de la RAM vers le DAC à l’aide d’un transfert DMA. Les données d’entrée sont traitées comme un tableau d’octets en mode 8 bits, et comme un tableau de demi-mots non signés (code de type de tableau “H”) en mode 12 bits.
freqpeut être un entier spécifiant la fréquence à laquelle écrire les échantillons du DAC, en utilisant Timer(6). Ou il peut s’agir d’un objet Timer déjà initialisé qui est utilisé pour déclencher l’échantillon du DAC. Les minuteurs valides sont 2, 4, 5, 6, 7 et 8.modepeut valoirDAC.NORMALouDAC.CIRCULAR.Exemple utilisant les deux DAC en même temps
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)
Constantes¶