Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Stop Intégrale : acceleration de la reponse
#1
Après avoir conduit au mode “demi-reset” avec la réduction du cycle et de la répartition des ON sur la sortie, on va pouvoir maintenant s attarder sur la partie algorithme du régulateur du routeur.
Le routeur d André est basé sur un régulateur Proportionnel Intégral Dérivée en ayant conservé que la partie Intégrale pour s affranchir des problèmes de période d échantillonnage et de pas de réglages.
Cette technique fonctionne plutôt bien et est bien adaptée mais ne permet pas des réactions rapides en cas de nuages qui passent ou de consommateurs électriques qui démarrent ou s arrêtent.

Plusieurs discussions sur le forum ont été écrites pour tenter d améliorer cet algorithme en introduisant de la proportionnelle, de la dérivée du feed forward mais aucune peut aboutir d un point de vue mathématique en raison du retard et de la fréquence d échantillonnage de la mesure trop faible pour ne pas faire rentrer le régulateur en auto oscillation.

Il n’y a donc rien à faire ? 
He bien si …

Avant de vous expliquer le principe de l amélioration proposée je vais m attarder sur le principal inconvénient de l action intégrale pure.

On considère error comme l écart entre la mesure (de puissance totale) et la consigne ( seuil PW dans langage du routeur F1atb)

Tant que l erreur est positive l intégrale va augmenter son signal . Le signal continue d augmenter même si l erreur redescend. On est donc obligé d attendre de dépasser la consigne dans l autre sens pour réduire le signal. Cela provoque donc des autoscillations pour arriver à la stabilisation. Pour minimiser cet effet on est obligé d appliquer une réactivité relativement faible.

Le principe de la modification sera de surveiller le signe de la dérivée filtrée de l erreur. Si le changement de signe de cette erreur filtrée et dérivée est confirmé sur plusieurs échantillons, alors on met l intégration en pause car cela signifie que la bonne valeur de sortie est atteinte et donc inutile d aller plus loin et d attendre que la mesure repasse de l autre côté de la consigne.

Voila le décor est planté et l aperçu des programmes modifiés et résultat sur les courbes arriveront ici prochainement
Répondre

#2
On arrive a du concret
je vous notera les lignes exactes où inserer ce nouveau code
Code :
// === Variables persistantes (à placer en haut du fichier) ===
static float e_f_prev = 0;
static float dot_prev = 0;
static bool integratorEnabled = true;

// Paramètres ajustables
const float tau = 0.3;     // constante de filtre (s)
const float Ts = 0.1;      // période d’échantillonnage (s)
const float alpha = Ts / (tau + Ts);
const float Dthres = 5.0;  // seuil sur dérivée (unités d'erreur/s)
const int N_confirm = 2;   // nombre d’échantillons de confirmation
static int confirmCounter = 0;


// === Dans la fonction de régulation ===

  float error = (Puissance - SeuilPw);
  error = (abs(error) < 50) ? error / 4.0 : error;

  // --- Filtrage exponentiel de l’erreur ---
  float e_f = e_f_prev + alpha * (error - e_f_prev);

  // --- Dérivée lissée ---
  float dot = (e_f - e_f_prev) / Ts;

  // --- Détection robuste du changement de signe de la dérivée ---
  bool signChange = (dot * dot_prev < 0) && (fabs(dot) > Dthres);

  if (signChange) {
    // Confirmer sur plusieurs échantillons pour éviter les rebonds dus au bruit
    confirmCounter++;
  } else {
    if (confirmCounter > 0) confirmCounter--;
  }

  // Si la pente a vraiment changé de signe → on stoppe l’intégration
  if (confirmCounter >= N_confirm) {
    integratorEnabled = false;
  }

  // Si la dérivée revient dans le même signe que l’erreur → on redémarre
  if ((dot * error) > 0 && fabs(dot) > Dthres) {
    integratorEnabled = true;
    confirmCounter = 0;
  }

  // --- INTÉGRATION ---
  if (integratorEnabled) {
    if (Puissance < SeuilPw && ReacCACSI > 1)
      GainBoucle *= GainCACSI;

    RetardF[i] += error * GainBoucle / 10000.0;
  }

  // --- Saturations ---
  if (RetardF[i] < 100 - MaxTriacPw) RetardF[i] = 100 - MaxTriacPw;
  if (ITmode < 0 && i == 0) RetardF[i] = 100;
  if (RetardF[i] < 0) RetardF[i] = 0;
  if (RetardF[i] > 100) RetardF[i] = 100;

  // --- Mémorisation ---
  e_f_prev = e_f;
  dot_prev = dot;
}

Le fonctionnement
On gèle l’intégration dès que la dérivée change de signe (et dépasse le seuil Dthres).

L’intégrateur reste arrêté tant que la dérivée reste de signe opposé à celui de l’erreur (c’est-à-dire : le système est en train de revenir vers la consigne).

Dès que la dérivée reprend le même signe que l’erreur (donc que l’erreur repart dans le "mauvais" sens), l’intégration reprend automatiquement.

confirmCounter permet de filtrer les changements de signe rapides dus au bruit.

les tests d'aujourd'hui montrent une nette amélioration lors des passages nuageux /soleil mais comme c etait plutot pas de soleil, je n'ai pas pu prendre beaucoup de courbes qui montrent le progrès, je vous les posterai quand la méteo sera plus coopérative
Répondre

#3
Bonjour, je suis disponible pour des tests si besoin de bêta testeurs
Mon installation actuelle : pv 2600wc, rms 15.11 avec 3 ssr (CE 2000w, CE 2700w, marche forcée), UxI2 (jsy-mk-194g), et un rms nomade sur bain d'huile
Ici soleil et nuages actuellement, juste assez pour un ce et pour test avec fluctuations importantes
Répondre

#4
OK de mon coté c est ok je vous donnerai les liens et instructions dans un message privé.
Répondre



Atteindre :


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

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