Voici une nouvelle version du programme qui n'utilise pas les routines PWM de l'Arduino.
En contrôlant les timings, je me suis rendu compte qu'en utilisant delayMicroseconds avec une variable comme argument, le délai obtenu était faux (considérablement allongé). Pour contourner ce bug, j'utilise delayMicroseconds avec un argument constant de 1 microseconde, mais l'instruction est utilisée à l'intérieur d'une boucle qui se répète le nombre de fois nécessaire pour obtenir le délai désiré.
Avec les valeurs présentées ci-dessus, on obtient une période du signal synthétisé de 20 millisecondes, donc une sinusoïde de fréquence 50 Hz.Code://période de la PWM en us int periode = 362; //duty cycle en pourcent. 50%=sinusoïde au niveau 0 int duty[]={50,58,67,75,82,88,93,97,99,100,99,97,93,88,82,75,67,58,50,42,33,25,18,12,7,3,1,0,1,3,7,12,18,25,33,42}; void setup() { pinMode(13, OUTPUT); } void loop() { for (int j=0; j<=35; j++){ //on détermine le temps au niveau haut int temps_on = periode * duty[j] / 100; int temps_off = periode - temps_on; digitalWrite(13, HIGH); for (int k=1; k<=temps_on; k++){ delayMicroseconds(1); } digitalWrite(13, LOW); for (int i=1; i<=temps_off; i++){ delayMicroseconds(1); } } delayMicroseconds(3); }
Pendant ces 20 millisecondes, le signal PWM présente 36 périodes, qui devraient donc être chacune de 555 microsecondes.
La variable int periode du début du programme devrait donc avoir une valeur de 555.... Si toutes les instructions du programme s'effectuaient instantanément! Mais ce n'est pas le cas!
Il faut donc empiriquement réduire la valeur de int periode pour arriver à une durée de la sinusoïde juste en-dessous de 20 000 microsecondes, puis ajouter les quelques microsecondes manquantes à la fin de la boucle loop.
J'ai mesuré les timings en software, avec la fonction micros(). Reste maintenant à voir ce que ça donne à l'oscilloscope. On n'est peut-être pas au bout de nos peines!
-----