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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Production d'un signal en dent de scie | |
sur la broche GPIO 25 de l'ESP32. | |
Plus d'infos: | |
https://electroniqueamateur.blogspot.com/2019/09/esp32-production-dun-signal-analogique.html | |
*/ | |
void setup() { | |
} | |
void loop() { | |
for (int i = 0; i < 255; i = i + 1) { | |
dacWrite(25, i); // 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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Sur la broche GPIO 25 de l'ESP32, production | |
d'un sinus dont l'amplitude et la fréquence sont | |
contrôlés par des potentiomètres | |
Plus d'infos: | |
https://electroniqueamateur.blogspot.com/2019/09/esp32-production-dun-signal-analogique.html | |
*/ | |
const int potAmplitude = 33; // potentiomètre à GPIO 33 pour régler l'amplitude | |
const int potFrequence = 32; // potentiomètre à GPIO 32 pour régler la fréquence | |
unsigned long dernierTemps; | |
int intervalle; //nombre de microsecondes entre deux changements de valeurs consécutifs | |
int compteur = 0; | |
void setup() { | |
dernierTemps = micros(); | |
} | |
void loop() { | |
unsigned long nouveauTemps = micros(); | |
intervalle = analogRead(potFrequence) / 20; | |
if ((nouveauTemps - dernierTemps) >= intervalle) { | |
dacWrite(25, 128 + analogRead(potAmplitude) / 32 * sin(2 * PI * compteur / 255.0)); | |
compteur++; | |
if (compteur == 256) { | |
compteur = 0; | |
} | |
dernierTemps = nouveauTemps; | |
} | |
} |
Yves Pelletier (Twitter, Facebook)
Le réglage de la fréquence ne fonctionne pas. Et comme il n'y a pas grands chose en explication ... dommage :(
RépondreSupprimerPotFrequence, 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 :
RépondreSupprimer"
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;
}
}
"
PotFrequence est plutôt le nom du potentiomètre qui permet de contrôler la fréquence.
Supprimersuper!!!
RépondreSupprimer