Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Lineariser la sortie Triac en mode découpe Sinus (Sujet clos temporairement)
#21
Merci Laurent53 pour cette optimisation.
Répondre

#22
(24-03-2026, 09:18 AM)Mike a écrit : Par curiosité j'ai tracé les courbes du polynôme de Lolo et de x - sin(x) afin de comparer.
Voici le résultat obtenu.



Attached FilesThumbnail(s)
[Image: attachment.php?thumbnail=5538]   

oui mais moi c etait pour x varie entre  0 et 2*PI essaye la meme chose avec la correction que j ai dit au premier poste    avec cette fonction ->   x + 16*sin(2*PI* x/100)    

ca c est la theorie sinon le code est simple pas de sinus a calculer ou calcul complexe  juste 2 a 3 lignes de codes pour la correction PID
Répondre

#23
Ta théorie ne tient pas debout. Au lieu de palabrer sors nous les lignes de codes pour linéariser ça sera plus utile
Le code est si facile ça devrait aller vite, je ne comprends pas pourquoi André ne l a pas déjà fait


   
On est encore très loin.
Répondre

#24
(24-03-2026, 10:28 PM)Lolo69 a écrit : Ta théorie ne tient pas debout. Au lieu de palabrer sors nous les lignes de codes pour linéariser ça sera plus utile
Le code est si facile ça devrait aller vite, je ne comprends pas pourquoi André ne l a pas déjà fait



On est encore très loin.

c est pas ma théorie .c est juste des maths j ai pas sorti cette equation comme ca .
j ai juste simplifier 100/2*pi  qui vaut 15.9.....  a 16 car le pid   c est en nombre entier.
pour le code  dans 16*sin(2*PI* x/100)    on a 4 symetries faut juste faire un tableau de 25 int8 avec les valeurs de correction . et additionner ou soustraire la valeur du tableau au pid.
Répondre

#25
Ton approche est très intéressante car digne d un programmeur hors pair qui maîtrise la discretisation 
 j y avait pensé, mais je ne trouve pas ça « élégant » ça veut dire faire des interpolations linéaires entre 2 points avec des cassures aux jointures.
En terme de précision ok ça passe  , en temps processeur c est pas mieux et il faut encore remplir des tables et donc un peu de RAM.  J ai horreur de ça ;-)
Ça veut dire aussi linearisation après être passé en Int là aussi ça crée des pulses sur le PID ( donc du filtrage donc du retard de phase) et perte de continuité dans la commande. La méthode polynôme permet indirectement de passer à une régulation derrière la virgule … pour une ouverture calculée et affichée à 5 le polynôme est capable d ajuster le retard entre 4,5 et 5,49 réel

Chacun son point de vue je trouve plus simple de rajouter une ligne pour un polynôme

J ai hâte de pouvoir comparer le résultat des 2 approches, en attendant bon routage à tous.

PS: J'ai remis à jour la modif de code dans les pages précédentes pour prendre en compte les remarques eclairées de Mike et Laurent53, merci à eux
Répondre

#26
Bravo Lolo69 et Mike pour cette linéarisation de la courbe puissance triac = f (pourcentage).

La méthode employée (polynôme) est certainement la plus rapide.

Cela va améliorer le comportement de la boucle d'asservissement qui devient linéaire, ce qui n'était pas le cas avec la découpe sinus par le triac.

De plus il devient plus agréable de constater la linéarité entre le pourcentage et la puissance comme cela est le cas dans les modes demi-sinus, multi-sinus et train de sinus.
1 ESP32 V16.02 Modifié pour 2 modules JSY-194-MT (affichage puissances onduleurs)
Ballon 1800W 
1 onduleur SOLAX Hybride 7.5 G4, PV 5025Wc,  4 Batteries de 3 kWh 
1 onduleur SOLAX X1-BOOST 5000 G4, PV 3400Wc en conf micro-grid
1 ESP32 + Aduino UNO + carte "Pedro home made" pour charge VE

Répondre

#27
(25-03-2026, 08:14 AM)Lolo69 a écrit :  ça veut dire faire des interpolations linéaires entre 2 points avec des cassures aux jointures.
En terme de précision ok ça passe  , en temps processeur c est pas mieux et il faut encore remplir des tables et donc un peu de RAM.  J ai horreur de ça ;-)
Ça veut dire aussi linearisation après être passé en Int là aussi ça crée des pulses sur le PID ( donc du filtrage donc du retard de phase) et perte de continuité dans la commande. 

j ai pas tous compris. je fait pas t  interpolations ???
pour ce qui est de remplir la table c est une fois au démarrage de l Esp comme on fait pour le mode Multi-sinus qui rempli  2 tableaux de 100 int8  , que l on peux utiliser 1 seul suffit donc aucune memoire supplémentaire supplémentaire.

pour ce qui est de la vitesse juste lire la correction dans tableau ca prend c est 2 cyles horloges,  pour ton polynôme pas compté mais chatgpt dit 80 a 100 cyles faudra vérifié en reel le temps.

Par contre, c'est Retard[i]  qui est un int — c'est l'arrondi de RetardF :
Retard[i] = round(RetardF[i]);
Et c'est cet entier Retard[i] qui pilote le timer du triac dans onTimer() :
Donc la précision du calcul en float est perdue à la conversion en entier. Le PID travaille finement en interne (les décimales permettent une accumulation progressive de l'intégrale), mais la commande réelle du triac n'a que 100 pas de résolution.

oui le test tranchera
Répondre

#28
Et non dommage que tu sois aussi obstiné ça te rend aveugle .

Je rend aussi hommage à Mr Bresenham grand mathématicien et informaticien dont les travaux m’inspirent beaucoup



Réfléchis un peu à la précison et tu réviseras ce que c est qu un regulateur PID et que justement c est l accumulation interne qui déstabilise toutes la boucle . La commande ayant effectivement que 100 pas il ne faut pas les gaspiller avant …



Bref j’ attend ton code avec impatience pour comparer les courbes mais je suis serein , meme si je m’en fout je connais déjà le résultat.
En attendant mon esp32 passe 56 cycles pour calculer le polynôme avec des cycles max sur les 2 cœurs à 50ms.

Comme le cache est bien chaud pas de latence pour aller lire un tableau en dram.
Admettons 100 cycles ça fait jamais que 400nanoS sur des cycles PID à 200ms ça laisse de la marge
Tes tableaux lisent des indexes en float ?
Répondre

#29
En attendant la méthode de 59Jag, vous pouvez donc tester la méthode Polynôme qui fonctionne parfaitement chez moi sans engendrer aucun reset ESP depuis 1 semaine

Pour cela il suffit d'inserer les quelques lignes de code ci-dessous dans le fichier Solar_routeur_v17_06 , entre la ligne 1746 et 1748  (RetardF[i] = constrain(RetardF[i], 0.0, 100.0)

Code :
        //LBE Linearisation mode decoupe sinus uniquement faire un if mode decoupe sinus plus tard
        // LBE Linearisation polynôme 7ème degré
      if (Actif[i]==MODE_DECOUPE_ONOFF) {//Linearisation uniquement pour le mode découpe de sinus
            float puissance_pid = 100.0f - RetardF[i];  // Sortie PID en puissance (0-100%)
            //Polynome degré 7
            // Merci Mike pour l'Optimisation methode Horner pour réduire les multiplications Estimations 90ns
            // Merci Laurent53 pour le forcage en float poue eviter les calculs inutiles et gourmand en double

            float puissance_corrigee =
            (((((((
              1.77247643e-10f * puissance_pid
            - 6.20366752e-08f) * puissance_pid
            + 8.72516510e-06f) * puissance_pid
            - 6.30374389e-04f) * puissance_pid
            + 2.48566569e-02f) * puissance_pid
            - 5.26588432e-01f) * puissance_pid
            + 6.06926288e+00f) * puissance_pid
            );
           
            RetardF[i] = 100.0f - puissance_corrigee;
      }    
        //fin linearisation


Pour expliquer un peu mieux comment cela fonctionne , avec l'image ci dessous prenons un exemple avec 
Sortie PID = 20%
à 20 % de sortie si on ne linearise pas on va donc aller sur la courbe bleue, donc 5 % de puissance. , c est à dire un ratio de 20/5 = 4 à ce point de fonctionnenement
le probleme est que passe à 40% sur la courbe bleue on a 30% c est à dire un ratio de 40/30= 1.33 ce qui est très différent du point de fonctionnement précédent, donc le PID ne sait pas comment agir, et le reglage PID bon a un point sera mauvais à l'autre , entrainant une mauvaise performance

Avec la linearisation , on va aller sur la courbe violette ( Polynome simplfié ou la courbe Verte calcul par regression de Newton) 
à 20% de sortie PID la courbe violette donne 5
à 5 la courbe violette donne 20
Donc 20 donne 20 Yessss c est lineaire ( ratio 20/20 =1) 
Si vous faites l exercice à PID=40 % vous arriverez aussi 40% donne 40 Yessssss  c est lineaire ( ratio 40/40 =1)  et ca c est très bon pour regler le PID de façon très réactive sans partir en osclliation ( je vous laisse voir les messages au début de cette discussion pour voir les résultats)

   

Pour aller plus loin, l'interet du polynome par rapport à une table de correspondance c 'est que c est un calcul continu, sans arrondi
Exemple si PID OUT=10.5 % le polynome va piloter le triac à 28 % ( la valeur idéale) la où une table oscillerait en permanence entre 27 et 29 generant du flickering
Répondre



Atteindre :


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

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