Parce que tout est en dur dans ton code, faut vraiment que t'apprennes à faire du code plus flexible. Par ex là si tu veux changer la résolution du PWM ben faut changer la moitié du code à la main au ieu d'avoir juste à changer le tableau et une constante contenant la longueur du tableau.
Pourquoi 13 cases et non pas 12 pour le tableau ? parce que là 13 est divisble par quedal donc pour avoir 120° de déphasage tu vas galérer... et accessoirement ton sinus est pas vraiment un sinus à cause de ça.
Si si, c'est compatible, bon évidement le tableau de 13 arrange pas les choses, en supposant que tu passes à un tableau de 12 c'est très simple, ça:
devient ça:
Et evidemment le triple tableau devient un tableau simple de 12 cases. Si tu veux opti un poil tu peux précalculer une seule fois (arrayLength / 3) et (2 * (arrayLength / 3)) avant loop() et tu les stockes dans deux constantes genre arrayLengthOneThird et arrayLengthTwoThird. Les modulos doivent être calculés à la volée vu qu'ils empêchent d'overflow donc les sors pas de la boucle.
Dans tous les cas pour être sûr que le déphasage soit de pile 120° il faut que la longueur du tableau soit un multiple de 3.
Accessoirement redéclarer les val_ph à chaque tour de boucle c'est moche et pas opti, tu devrais les déclarer en dehors de loop().
Enfin, tu devrais forcer les Pin...Ph complémentaires à 0 dans le if/else parce que là ils gardent juste la dernière valeur connue au changement de demi-alternance donc c'est moyen.
Concernant le timer vu que tu utilises analogueWrite ça simplifie 2-3 trucs (mais attention aux effets de bords de mélanger ton code avec le PWM de analogueWrite, t'as intérêt à vérifier à l'oscillo que le signal est correct, surtout si tu augmentes la fréquence parce qu'à un moment donné ça va aliaser...).
La valeur du timer est simplement liée à la longueur du tableau et la fréquence voulue et peut être calculée dès le départ avec un truc du genre: unsigned long timerDelay = (1000000 / freq) / (2 * arrayLength); avec byte freq = 50; pour 50Hz par ex. (nb: le timer est en µs).
Par ailleurs je remplacerais if (compteur == 13) par if (compteur >= 13) et vu que t'as censé avoir la constante tu devrais même utiliser if (compteur >= arrayLength). >= évite d'avoir le compteur qui par en cacahuète si jamais il saute le 13 (par ex à cause d'une erreur dans le code suite à une modif, ou même glitch de l'arduino, ça c'est déjà vu sur PC alors un arduino dans un milieu pollué d'IEM j'imagine pas...).
Pourquoi 13 cases et non pas 12 pour le tableau ? parce que là 13 est divisble par quedal donc pour avoir 120° de déphasage tu vas galérer... et accessoirement ton sinus est pas vraiment un sinus à cause de ça.
Si si, c'est compatible, bon évidement le tableau de 13 arrange pas les choses, en supposant que tu passes à un tableau de 12 c'est très simple, ça:
Code :
int val_ph1 = timing_1[0][compteur] * load_pwm;
int val_ph2 = timing_1[1][compteur] * load_pwm;
int val_ph3 = timing_1[2][compteur] * load_pwm;
devient ça:
Code :
byte arrayLength = 12;
Code :
int val_ph1 = timing_1[compteur] * load_pwm;
int val_ph2 = timing_1[(compteur + (arrayLength / 3)) % arrayLength] * load_pwm;
int val_ph3 = timing_1[(compteur + (2 * (arrayLength / 3))) % arrayLength] * load_pwm;
Et evidemment le triple tableau devient un tableau simple de 12 cases. Si tu veux opti un poil tu peux précalculer une seule fois (arrayLength / 3) et (2 * (arrayLength / 3)) avant loop() et tu les stockes dans deux constantes genre arrayLengthOneThird et arrayLengthTwoThird. Les modulos doivent être calculés à la volée vu qu'ils empêchent d'overflow donc les sors pas de la boucle.
Dans tous les cas pour être sûr que le déphasage soit de pile 120° il faut que la longueur du tableau soit un multiple de 3.
Accessoirement redéclarer les val_ph à chaque tour de boucle c'est moche et pas opti, tu devrais les déclarer en dehors de loop().
Enfin, tu devrais forcer les Pin...Ph complémentaires à 0 dans le if/else parce que là ils gardent juste la dernière valeur connue au changement de demi-alternance donc c'est moyen.
Concernant le timer vu que tu utilises analogueWrite ça simplifie 2-3 trucs (mais attention aux effets de bords de mélanger ton code avec le PWM de analogueWrite, t'as intérêt à vérifier à l'oscillo que le signal est correct, surtout si tu augmentes la fréquence parce qu'à un moment donné ça va aliaser...).
La valeur du timer est simplement liée à la longueur du tableau et la fréquence voulue et peut être calculée dès le départ avec un truc du genre: unsigned long timerDelay = (1000000 / freq) / (2 * arrayLength); avec byte freq = 50; pour 50Hz par ex. (nb: le timer est en µs).
Par ailleurs je remplacerais if (compteur == 13) par if (compteur >= 13) et vu que t'as censé avoir la constante tu devrais même utiliser if (compteur >= arrayLength). >= évite d'avoir le compteur qui par en cacahuète si jamais il saute le 13 (par ex à cause d'une erreur dans le code suite à une modif, ou même glitch de l'arduino, ça c'est déjà vu sur PC alors un arduino dans un milieu pollué d'IEM j'imagine pas...).