27-09-2025, 05:46 PM
(27-09-2025, 04:50 PM)Ludovic35 a écrit : L'idée de raccourcir la période est intéressante.l idée etait surtout de repartir les ON
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)
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;
}