Après avoir travaillé sur l 'optimisation du multi sinus qui a aboutit au mode demi-sinus ,je me suis pencher sur le mode découpe sinus qui est certe beaucoup plus performant mais qui presente un defaut 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 envoeyr 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 ou 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
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
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 envoeyr 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 ou 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

