Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Lineariser la sortie Triac en mode découpe Sinus
#1
Après avoir travaillé sur l 'optimisation du multi sinus qui a aboutit au mode demi-sinus ,je me suis penché sur le mode découpe sinus qui est certe beaucoup plus performant mais qui présente un défaut majeur assez simple à corriger

LINEARISATION de la sortie PID 


Rappel du fonctionnement découpe sinus :
   
Pour rappel rapide la découpe sinus consiste à ouvrir le triac avec plus ou moins de retard dans la sinusoide pour envoyer plus ou moins d'energie
Comme l'image ci-dessus le montre , la problematique est que pour la meme ecart d'ouverture ( 1ms) l'energie n'est pas du tout la meme selon l'endroit où on se trouve dans la sinusoide.
Si je résume la puissance envoyée à la resistance n'est pas proportionnelle à la sortie du PID.
La puissance envoyée au CE en fonction de la sortie PID ressemble à cette courbe
   
On voit qu au debut et fin  de courbe il faut beaucoup varier la sortie pour faire varier un peu la puissance, 
Dans le cadre du routeur c est très ennuyeux au debut d'ouverture quand vous commencez à avoir du surplus.
Le probleme reel est que l'algorithme PID étant lineaire , celui ci est perdu et les reglages bon pour le milieu d'ouverture sera très mauvais pour le debut de courbes ce qui rend ce PID assez instable à moins d'accepter un gros compromis tout mou.

La solution ( uniquement pour la decoupe sinus, les autres modes ne sont pas impactés)
La solution consiste à intercaler une courbe "opposée" à la courbe précédente entre la sortie PID et la commande triac
La courbe idéale qu'il faudrait envoyer est la courbe rouge ci-dessous, 
   
Mais comme cette courbe idéale n'est pas calculable par une inversion mathematique , on va calculer un polynome qui se rapproche beaucoup de cet idéal, ce polynome est la courbe bleu clair que l on voit.
J'ai choisi un polynome de degré 7 ce qui plus que très suffisant pour obtenir une excellente précision
Le pôlynome ressemble à y= ax7+bx6+cx5+...gx, pour trouver a, b , c g j ai résolu avec l aide de gemini un systeme de 7 equations 7 inconnues ce qui donne le polynome suivant

Code :
        float puissance_corrigee = 0.000000000177247643 * puissance_pid * puissance_pid * puissance_pid * puissance_pid * puissance_pid * puissance_pid * puissance_pid
                                - 0.000000062036675220 * puissance_pid * puissance_pid * puissance_pid * puissance_pid * puissance_pid * puissance_pid
                                + 0.000008725165104459 * puissance_pid * puissance_pid * puissance_pid * puissance_pid * puissance_pid
                                - 0.000630374389285345 * puissance_pid * puissance_pid * puissance_pid * puissance_pid
                                + 0.024856656854278056 * puissance_pid * puissance_pid * puissance_pid
                                - 0.526588431700366510 * puissance_pid * puissance_pid
                                + 6.069262878077352319 * puissance_pid;

[color=#4e5b61][font=Consolas, 'Courier New', monospace]        [color=#d35400]RetardF[/color][i] = [color=#005c5f]100.0[/color] - puissance_corrigee;[/font][/color]

il suffit ensuite d integrer ces 2 lignes entre
 float puissance_pid = 100.0 - RetardF[i];  // Sortie PID en puissance (0-100%)
et 
 RetardF[i] = constrain(RetardF[i], 0.0, 100.0);
avec un bon vieux if Actif[i]) = MODE_DECOUPE_ONOFF

Je vous montrerai les résultats sur mes courbes quand j'aurais eu de grandes variations de prod et consommation., mais du coup le PID se regle très très facilement
Effets positifs indirects, la sortie étant plus stable on a un bruit constant à 50 hz donc le scintillement des ampoules leds est moins perceptible car à 50 hz l'oeil ne voit rien. Pour le bruit mecanique des resistances ca s entend toujours car le bruit 50hz est audible
Répondre

#2
Salut Lolo,
Je regarderai plus en détail plus tard mais juste une petite remarque sur le calcul suivant de puissance_corrigee
Code :
float puissance_corrigee = 0.000000000177247643 * puissance_pid * puissance_pid * puissance_pid * puissance_pid * puissance_pid * puissance_pid * puissance_pid
                                - 0.000000062036675220 * puissance_pid * puissance_pid * puissance_pid * puissance_pid * puissance_pid * puissance_pid
                                + 0.000008725165104459 * puissance_pid * puissance_pid * puissance_pid * puissance_pid * puissance_pid
                                - 0.000630374389285345 * puissance_pid * puissance_pid * puissance_pid * puissance_pid
                                + 0.024856656854278056 * puissance_pid * puissance_pid * puissance_pid
                                - 0.526588431700366510 * puissance_pid * puissance_pid
                                + 6.069262878077352319 * puissance_pid;

Pour optimiser un peu et limiter le nombre de multiplication on peut effectuer le même calcul en utilisant la méthode de Horner:
Code :
float puissance_corrigee = (((((((0.000000000177247643 * puissance_pid - 0.000000062036675220) * puissance_pid + 0.000008725165104459) * puissance_pid - 0.000630374389285345) * puissance_pid + 0.024856656854278056) * puissance_pid - 0.526588431700366510) * puissance_pid + 6.069262878077352319) * puissance_pid);

Cela ne fait plus que 7 produits contre 28 auparavant.
Répondre

#3
Oui c est une méthode plus élégante qui a un nom d ailleurs ;-)
Je trouvais plus facile à lire les « puissances » que le nombre de parenthèse d Horner, mais bien sûr le processeur travaille moins ;-)
Répondre

#4
(Il y a 8 heures)Lolo69 a écrit : Oui c est une méthode plus élégante qui a un nom d ailleurs ;-)

Oui c'est la méthode de Horner, je l'ai cité dans mon message, je voudrais pas être accusé de plagiat Wink
Répondre

#5
(Il y a 8 heures)Mike a écrit :
(Il y a 8 heures)Lolo69 a écrit : Oui c est une méthode plus élégante qui a un nom d ailleurs ;-)

Oui c'est la méthode de Horner, je l'ai cité dans mon message, je voudrais pas être accusé de plagiat Wink

Arf pas vu , en plus ça me faisait penser à Yvette ;-)
Répondre

#6
Resultats en image
   

le gros interêt complementaire c est que je pourrais vous faire d'autre copie d'écran avec 2 fois moins de surplus, que les courbes seraient identiques, les parametres PID fonctionnent quelque soit le point de fonctionnement
Répondre

#7
interressant..
autant les modifs du pid me paraissaient surfaites, autant cette analyse est pertinente et logique, car elle part effectivement d'un pb réel (non linéarité du courant vs la consigne) et lui apporte une solution (à laquelle je n'ai rien compris), mais qui apporte un résultat cohérent: on adapte la non-linéarité de la sortie à la valeur de consigne.
Répondre



Atteindre :


Utilisateur(s) parcourant ce sujet :
2 visiteur(s)

Moteur MyBB, © 2002-2026 Melroy van den Berg.