lundi 2 septembre 2019

ESP32: production d'un signal analogique

L'ESP32 comporte deux convertisseurs numérique / analogique (DAC) à 8 bits, ce qui permet de produire un véritable signal analogique, c'est à dire une tension pouvant prendre n'importe quelle valeur située entre 0 et 3,3 V (à ne pas confondre avec un signal modulé en largeur impulsion, PWM, que nous avons également traité dans un récent billet).


Broches GPIO

Deux broches peuvent servir de sortie analogique: GPIO 25 et GPIO 26.

La fonction dacWrite()

Si vous programmez l'ESP32 avec l'IDE Arduino, vous pouvez facilement contrôler la tension des sorties analogiques au moyen de la fonction dacWrite().

Cette fonction prend deux paramètres en argument: le numéro de la broche GPIO que vous désirez contrôler (25 ou 26) et une valeur située entre 0 et 255 qui représente la tension désirée (0 pour 0 volt, et 255 pour 3,3 volts).

Par exemple, pour régler la broche GPIO 25 à une valeur de 1 volt, vous écrivez: "dacWrite(25, 77);" puisque 77 * 3,3 / 255 = 1.

Sketch minimaliste

Le sketch ci-dessous présente le strict minimum pour produire un signal analogique périodique. Résultat: un signal en dent de scie.


Amplitude et fréquences contrôlables par potentiomètre

Voici un deuxième sketch un tout petit peu plus ambitieux: cette fois, nous produisons un signal sinusoïdal dont l'amplitude et la fréquence peuvent être modifiées grâce à deux potentiomètres.






Yves Pelletier   (TwitterFacebook)


3 commentaires:

  1. Le réglage de la fréquence ne fonctionne pas. Et comme il n'y a pas grands chose en explication ... dommage :(

    RépondreSupprimer
  2. PotFrequence, ce n'est pas la fréquence mais le temps d'échantillonnage. Pour la frequence : sin ( w * t), w = 2 * pi / T. Moi j'ai fait ça pour le moment :
    "
    double periode = 1 * 1000.0/2.5;

    const int pinSortie = 26;

    void output(uint8_t value);
    void setup() {
    Serial.begin(115200);
    dernierTemps = micros();
    }

    void loop() {
    unsigned long nouveauTemps = micros();

    if ((nouveauTemps - dernierTemps) >= intervalle) {
    output(127.5 + 127.5 * sin(2 * PI * compteur / periode));
    compteur++;
    if (compteur > 1000) {
    compteur = 0;
    }
    dernierTemps = nouveauTemps;
    }
    }
    "

    RépondreSupprimer
    Réponses
    1. PotFrequence est plutôt le nom du potentiomètre qui permet de contrôler la fréquence.

      Supprimer