Utilisation des canaux DAC
publication: 22 avril 2022 / mis à jour 23 avril 2022
Appel à collaboration
Vous développez des montages, simples ou complexes avec ESP32 et ESP32forth.
Partagez-les ici sur ce site.
ESP32forth ne pourra se développer qu'avec la collaboration active de toutes les bonnes volontés.
Vos montages peuvent aider d'autres développeurs.
Les montages des autres développeurs peuvent vous aider.
Pour proposer un article ou un montage, cliquez ici
Les canaux DAC
Les cartes ESP32 disposent de deux sorties GPIO pouvant être utilisées comme canaux DAC.
Un canal DAC convertit une valeur numérique en une tension analogique. Les sorties GPIO sont en tout ou rien. En clair, quand vous activez une sortie GPIO numérique, la tension de sortie de cette sortie passe de 0 Volts à 3,3 Volts sans passer par une autre tension.
Un canal DAC permet de faire varier la tension d'une sortie GPIO, dans une plage de 256 valeurs comprises entre 0 et 3,3 Volts.
Les deux sorties GPIO pouvant être contrôlées par les canaux DAC sont les sorties GPIO25 et GPIO26:
25 constant PIN_DAC1 26 constant PIN_DAC2
Pour un premier test de ces canaux DAC, voici comment brancher deux LEDs aux sorties GPIO25 et GPIO26:
Sélectionner la tension de sortie DAC
Pour régler la broche GPIO25 à une valeur de 1 Volt:
\ for example: set GPIO25 to 1 Volt PIN_DAC1 77 dacWrite \ 77 * 3,3 / 255 = 1.
Ici, c'est la valeur 77 qu'il faut utiliser pour générer une tension de 1 Volt
en sortie de GPIO25 via le canal DAC.
La formule à appliquer est: x * 3,3 / 255
La valeur de x
est dans l'intervalle 0..255.
Pour calculer cette valeur x à partir d'une tension donnée, il est possible d'effectuer un traitement sans utilier les opérateurs réels. Par exemple, pour générer une tension de 2.65 Volts:
265 2550 * 3300 / \ leave 204 on stack
Ici, la tension à génerer, c'est à dire 2.65 Volts a été multipliée par 100 avant de calculer la valeur du paramètre à injecter dans le canal DAC.
Voici une définition qui prend la tension exprimée en réel et restituant la valeur du paramètre à envoyer au canal DAC:
\ r must be in interval 0..3.3 \ leave n in interval 0..255 : VtoN ( r -- n ) 100e F* F>S 2550 * 3300 / ; 2.65e VtoN . \ display 204
Choix de la tension de sortie
En résumé, la tension de sortie est choisie exclusivement en injectant le paramètre n dans l'intervalle 0..255. En sortie, le canal DAC génère une tension comprise entre 0 et 3,3 Volt. Il n'est pas possible de générer des tensions différentes, sauf:
- atténuer la tension de sortie par résistances pour générer des tensions plus faibles;
- augmenter la tension de sortie par amplificateur pour générer des tensions plus importantes.
Les variations de tension en sortie de canal DAC ne sont pas lissées. Une variation d'une unité du paramètre injecté dans le canal DAC va modifier la tension de sortie d'un pas de 0.0129 Volts. Si vous devez utiliser des variations de tension beaucoup plus précises, il faudra utiliser un convertisseur DAC externe.
: VtoDAC ( pin volt -- ) VtoN dacWrite ; PIN_DAC1 2.65e VtoDAC \ set DAC 1 to 2.65 Volts \ volt in interval 0..3.3 : vDAC1 ( volt -- ) VtoN PIN_DAC1 swap dacWrite ; 2.8e vDAC1
A partir de là, voyons comment générer un signal non continu. Ici, on va générer un signal de forme triangulaire:
\ triangular signal generation : triangularSignal ( --) 256 for aft 10 ms PIN_DAC1 r@ dacWrite then next ; : SignalLoop ( -- ) begin triangularSignal key? until ;
Au lancement de SignalLoop
, on génère un signal triangulaire
que l'on peut voir à l'oscilloscope:
Chaque pas du signal triangulaire est temporisé avec un délai de 10 millisecondes. On a donc un signal très lent.
La génération de signaux complexes fera l'objet d'un autre article.
Legal: site web personnel sans commerce / personal site without seling