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

DAC(1)

(pas sur l’embase)

PA4

DAC(2)

P6

PA5

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.

port peut être un objet Pin, ou un entier (1 ou 2) sélectionnant le canal DAC 1 ou 2. La broche physique vers laquelle chaque canal est routé dépend de l’OpenMV Cam.

bits est un entier spécifiant la résolution, et peut valoir 8 ou 12. La valeur maximale acceptée par write() et write_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 None pour sélectionner la valeur par défaut (tampon activé pour DAC.noise(), DAC.triangle() et DAC.write_timed(), et désactivé pour DAC.write()), False pour désactiver complètement le tampon, ou True pour 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, False ou True ; voir le constructeur ci-dessus pour la signification de ce paramètre.

deinit() None

Désinitialise le DAC, rendant sa broche disponible pour d’autres usages.

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ù bits est défini lors de la création de l’objet DAC ou via init().

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.

freq peut ê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.

mode peut valoir DAC.NORMAL ou DAC.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

NORMAL: int

Le mode NORMAL effectue une transmission unique de la forme d’onde présente dans le tampon de données.

CIRCULAR: int

Le mode CIRCULAR transmet la forme d’onde présente dans le tampon de données et revient au début du tampon chaque fois qu’il atteint la fin, produisant une boucle continue jusqu’à ce que deinit() soit appelée.