Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Multisinus le paradoxe
#1
Avec un SSR en multisinus j’ ai diminué la précision du multi sinus pour augmenter la précision de la régulation et ….. ça marche.

Pour rappel le multisinus F1ATB consiste à calculer des couples T et N pour chaque pourcentage de sortie du régulateur.
Pour avoir une précision théorique de +- 0.5% André a fixé dans son code Tmax = 100 et Tmin à 20.  Ce qui donne des périodes total de 200 à 1000ms.
Par exemple pour une sortie régulateur à 25% cela donne un couple N/T de 6/24 ce qui se traduit par 6 ON suivi de 18 OFF donc une période de 240ms
Ce qui est 24 fois plus qu en mode découpe de sinus….
Et surtout les ON sont tous en début de trame ce qui fausse beaucoup la mesure du Shelly. 

La modification que j ai implémenté part sur TMax = 50 et Tmin = 5 
Donc une période total de 50 à 500 ms et surtout je répartis les ON sur toutes la période ce qui fait une moyenne plus lisse pour une mesure Shelly bien plus précise
Par exemple pour la même sortie 25 % cela me donne 2/8 donc une période de 80 ms( au lieu de 240 pour F1ATB) répartis comme suivant
10001000
Cela donne une période beaucoup plus courte ( donc réactif) et une moyenne lissée sur 4 demi sinusoïde ( au lieu de 12)

En image cela donne les résultats suivants


Avant 
   

Après
   
Répondre
#2
Valable avec une mesure shelly (assez lent) ou toutes les types de mesure ?
Répondre
#3
Pour tout type de mesure mais uniquement pour le multi sinus
Répondre
#4
L'idée de raccourcir la période est intéressante.
Est-ce que le Tmax à 50 dégrade l'erreur sur certaines valeurs de % (il était < 0.4% avant)?
Le fait d'avoir plus de transitions, cela dégrade-t-il le résultat? (les SSR ayant un zéro cross, l'erreur au démarrage va arriver plus souvent; + un effet de glissement si ce n'est pas synchrone)
Répondre
#5
(27-09-2025, 04:50 PM)Ludovic35 a écrit : L'idée de raccourcir la période est intéressante.
Est-ce que le Tmax à 50 dégrade l'erreur sur certaines valeurs de % (il était < 0.4% avant)?
Le fait d'avoir plus de transitions, cela dégrade-t-il le résultat? (les SSR ayant un zéro cross, l'erreur au démarrage va arriver plus souvent; + un effet de glissement si ce n'est pas synchrone)
l idée etait surtout de repartir les ON
oui le TMAX degrade l'erreur , mais le regulateur recupere rapidement cette erreur... c est le paradoxe, l erreur est plus grande mais comme la boucle reagit plus vite, c est plus rapidement corrigé, donc l'erreur de façon globale à moins d'impact. 
L'erreur de demarrage arrive sans doute plus souvent mais encire une fois sur deux ou 3 trames de 50ms cela ne se voit pas sur les courbes, et dans la pratique on ne reste pas longtemps au meme pourcentage, donc le glissement possible est naturellement effacé. Je n'ai pas encore fait toutes simulations pour vous montrer les différents scenarii possible , mais mes courbes de puissance parlent d elles mêmes. J'ai eu la flemme de faire le test en 3 étapes
- Etape 1 :  on ne change pas la période, mais on repartit les ON
- Etape 2 : On change la période sans répartir
- ETape 3 : On réduit la périude et on réparti.

Pour les habitués de l Arduino , les modifs de codes sont les suivantes ( difficile de vous donner les num de lignes car je suis parti depuis ma propre version derivée de la 15.08 d André

pour la période ca si situe autour des lignes 730  
Code :
//lbe VALEUR D ORIGINE for (int I = 0; I < 101; I++) {
  for (int I = 0; I < 101; I++) {
    tabPulseSinusTotal[I] = 3;
    tabPulseSinusOn[I] = 0;
    target = float(I) / 100.0;
    //lbe VALEUR D ORIGINE for (int T = 20; T < 101; T++) {
    for (int T = 3; T < 51; T++) { //Réduit la précision , augmente la réactivité
      for (int N = 1; N <= T; N++) {
        if (T % 2 == 1 || N % 2 == 0) {  // Valeurs impaires du total ou pulses pairs pour éviter courant continu
          vrai = float(N) / float(T);
          erreur = abs(vrai - target);
          if (erreur < 0.003) {
            tabPulseSinusTotal[I] = T;
            tabPulseSinusOn[I] = N;
            // lbe valeur origine N = 101;
            // lbe valeur origineT = 101;
            N = 51;
            T = 51;
          }
        }
      }
    }
  }


pour la repartiton c est autour des lignes 640 
Code :
      default:              // Multi Sinus ou Train de sinus
        //if (Gpio[i] > 0) {  //Gpio valide
        //  if (PulseComptage[i] < PulseOn[i]) {
        //    digitalWrite(Gpio[i], OutOn[i]);
        //  } else {
        //    digitalWrite(Gpio[i], OutOff[i]);  //Stop
        //  }
        //  PulseComptage[i] = PulseComptage[i] + 1;
        //  if (PulseComptage[i] >= PulseTotal[i]) {
        //    PulseComptage[i] = 0;
        //  }
        //}
        // lbe REPARTITION DES ON
        if (Gpio[i] > 0 && PulseTotal[i] > 0) {
  // Répartition uniforme des ON dans la trame complète
  // Exemple : PulseOn = 4, PulseTotal = 10 -> ON sur les index 0,2,5,7
  int on_count = PulseOn[i];
  int total = PulseTotal[i];
  int pos = PulseComptage[i];

  // Répartition uniforme avec espacement : version simple sans tableau
  if ((pos * on_count) % total < on_count) {
    digitalWrite(Gpio[i], OutOn[i]);
  } else {
    digitalWrite(Gpio[i], OutOff[i]);  //Stop
  }

  PulseComptage[i]++;
  if (PulseComptage[i] >= total) {
    PulseComptage[i] = 0;
  }
Répondre


Atteindre :


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