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
(23-03-2026, 01:45 PM)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
(23-03-2026, 01:51 PM)Mike a écrit :
(23-03-2026, 01:45 PM)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

#8
La puissance envoyée au CE en fonction de la sortie PID ressemble à cette courbe
[Image: attachment.php?thumbnail=5524]   

rien qu en voyant le graphique on peux voir  une sinusoide le long de l axe y=x. donc la courbe sortie PID est de la forme y=x-sin(x) donc pour corriger faux juste rajouter sin(x) pour avoir y=x pas besoin de calcul complexe .
Répondre

#9
(24-03-2026, 08:05 AM)du 59jag a écrit : La puissance envoyée au CE en fonction de la sortie PID ressemble à cette courbe
[Image: attachment.php?thumbnail=5524]   

rien qu en voyant le graphique on peux voir  une sinusoide le long de l axe y=x. donc la courbe sortie PID est de la forme y=x-sin(x) donc pour corriger faux juste rajouter sin(x) pour avoir y=x pas besoin de calcul complexe .
Je ne vois pas une sinusoïde… c est normal ce n est pas une sinusoïde !;-) ça y ressemble vaguement au début et à la fin et encore car d après le tout premier graphe de la sinusoïde tu comprends qu il s agit d une intégrale d une fonction sinusoïdale dont le résultat n est pas 100% trigonométrique ;-)

Sauf si mon prof d électrotechnique des années 80 se trompait, la fonction exacte doit être celle ci
   


Un polynôme est loin d un calcul complexe  8 multiplications avec la méthode Horner citée par Michy.

Mais bon si tu arrives à inverser la fonction (alpha =f(p))  je suis preneur , mais honnêtement à part faire un calcul itératif ( bien plus gourmand qu une multiplication ) je ne pense pas que ce soit mathématiquement possible car alpha apparaît à la fois dans un terme algébrique et dans un terme sinus .
En tout cas même en écrivant le code comme un sagouin mon esp reste serein pour faire ses 32 multiplications , j ignore comment un processeur calcule un sinus mais cela prend sûrement plus de ressources que 8 produits (40 cycle cpu)
Après quelques recherches pour calculer un sinus , la libraire C++ utilise un …… polynôme ! ( 300 cycle cpu mini)

Je complèterai mon explication pour clarifier l utilisation de ce graphe ( et en mettant 325vcrete plutôt qu idiotement la valeur efficace)
Après perso , je partage simplement, si ça vous est utile tant mieux , sinon c est pas grave mon algo me donne entière satisfaction , je suis passé de 95 % d autoconsommation avec l algo du RMS à plus de 99 % y compris les jours de forte alternance soleil /nuage

On peut encore aller chercher quelques watt en decoupe sinus , en prenant en compte l avance de la détection du zc, mais surtout en restant en float plutôt sur de passer en INT pour avoir des pas de réglages < au 1%
Répondre

#10
Salut Lolo69,
Bravo pour tes investigations sur le sujet PID...
Il est vrai qu'actuellement avec pas mal de pics brutaux coté prod solaire d'un coté puis de la conso aussi en séquence hachée, j'ai tendance à injecter pas mal (1.6 KW hier :-( ) et on est en tempo rouge ...
Penses tu qu'André puisse intégrer cela dans une future version du routeur ?
L'idéal serait d'avoir un assistant pour peaufiner ses propres réglages ou une marche à suivre accessible en ligne.
Qu'en penses tu ?
Config : 3 routeurs F1ATB en V17.15 - 2 routeurs fixes en mode Triacs + 1 routeur mobile polyvalent en mode : Triac+SSR + 1 afficheur distant ESP32-S3
PV : (8*425W + Onduleur SunGrow 3KW) + (2 *500w + MO Hoymiles HMS-1000W-2T)
Supervision & Domotique : F1atb + Home Assistant / Shelly & MQTT
Répondre



Atteindre :


Utilisateur(s) parcourant ce sujet :
59jag, 1 visiteur(s)

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