Le tuto est dédié à l’implémentation du modèle numérique du correcteur PI décrit par la fonction de transfert C(p)=k1 + k2/p. On aborde aussi le réglage des paramètres k1 et k2 ainsi la réponse indicielle et à une rampe du système en BF (voir le tuto pour plus des détails).
la fonction CorrPI()
La fonction CorrPI() est dédiée à l’implémentation du correcteur PI. Elle prend en entrée les paramètres du correcteur k1,k2 ainsi l’échantillon actuel de l’erreur eps(n) puis elle retourne le signal de la commande c(n) (voir le tuto pour plus des détails).
double CorrPI(double x_nn, double *xpi, double *ypi, double kp, double ki, double T) { // Variables de l'entrée et la sortie double y_nn=0.0;
// Calcul de la nouvelle sortie y_nn=ypi[1] + kp*x_nn + (2.0*T*ki)*xpi[0] -kp*xpi[1]; //y(n)=y(n-2)+ k1*x(n) + 2*T*k2*x(n-1) - k1*x(n-2)
// Mise à jour de la sortie ypi[1]=ypi[0]; ypi[0]=y_nn;
// Mise à jour de l'entrée xpi[1]=xpi[0]; xpi[0]=x_nn;
// Renvoie du résultat return y_nn; }
Le programme complet
/* * 1. Correction d'un système du 2nd ordre en BF * 2. Implémentation du correcteur: * Modèle Analogique: C(p)= k1 + k2/p * Modèle numérique: y(n)=y(n-2)+ k1[ x(n) - x(n-2)] +2*T*k2*x(n-1) * =y(n-2)+ k1*x(n) + 2*T*k2*x(n-1) - k1*x(n-2) * 3. Analyse du correcteur PI * 4. Précision/ Stabilité/ Rapidité du correcteur PI * 5. La réponse à un échelon d'un système du 2nd ordre * 6. Etc. *
double x_nn=0.0; // Consigne (entrée) double y_n[2]; // "0" Non corrigé, "1": Corrigé double eps_n[2]; // Erreur double y_capt[2]; // Sortie du capteur double y_corr[2]; // Sortie du correcteur
// Variables internes des systèmes double x1[2], y1[3]; // Système Non Corrigé double x2[2], y2[3]; // Système Corrigé
// Variables internes du correcteur double x_c[2], y_c[2];
// Paramètres de l'échelon unsigned long c=0; // Compteur (période) bool Step=false;
void setup() { // Port série de la réponse du système Serial.begin(19200); }
void loop() { // 1. La consigne (l'entrée) x(n) pour les deux systèmes c++; c=c%c_step; if(!c) { Step=!Step; c=0; } x_nn=A_step*(double)Step; // Réponse à un échelon x(n)=cte //x_nn=(double)c; // Réponse à une rampe x(n)=n
// 2. Sortie du capteur: Retour unitaire y_capt[0]=y_n[0]; y_capt[1]=y_n[1];
// 3. Soustracteur: Calcul de l'erreur eps(n) eps_n[0]=x_nn-y_capt[0]; eps_n[1]=x_nn-y_capt[1];
// 4.1 Sans Correcteur y_corr[0]=eps_n[0]; // Système non Corrigé
2 réponses sur « Asservissement | Arduino #12: le Correcteur Proportionnel Intégral (PI) – Implémentation »
hi
Hello!