Autres articles / Other articles

Utilisation des canaux DAC

publication: 22 avril 2022 / mis à jour 23 avril 2022

Read this page in english

 

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:

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