Savoir Implémenter un correcteur PID Numérique (Modèle du 2nd Ordre)
Savoir régler les paramètres de son correcteur
Savoir optimiser les performances de son correcteur
Arduino & Problème de la Saturation (Divergence)
Etc.
Fonctionnement
Le tuto a pour objectif d’implémenter et régler efficacement les paramètres d’un correcteur PID numérique réel. Contrairement à un PID théorique, le PID numérique dispose d’un filtre passe-bas en HF afin de limiter les perturbations. En revanche, la bande passante du filtre est directement liée à l’efficacité de l’effet dérivateur. Autrement dit, la stabilité du système (voir le tuto pour plus de détails).
Comment régler les paramètres du correcteur PID ?
Il existe plusieurs techniques de réglage des paramètres d’un correcteur PID, en particulier la méthode de Ziegler-nichols. Dans ce tuto on verra une astuce qui va vous permettre de régler les paramètres du correcteur facilement en se basant sur un modèle du second ordre du correcteur. En effet, le correcteur sera décrit par une équation du 2nd ordre muni du filtre en HF. Le coefficient d’amortissement du PID doit être supérieur ou égal à 1. Il agit sur la largeur de bande de fréquence dédiée à l’intégrateur ainsi le dérivateur (voir le tuto pour des détails).
En pratique, la pulsation de coupure du système physique Wn (ou sa bande passante) doit être connue d’avance afin d’en déduire les paramètres du réglage du correcteur PID. La réponse à un échelon en boucle ouverte peut être utilisée afin de mesurer Wn en se basant sur le temps de montée, le dépassement, la fréquence des oscillations, etc. Dans notre tuto la fréquence du système est fixée à 5Hz, zeta à 0.05.
La fonction PID()
La fonction PID() sert à implémentée le modèle numérique du correcteur PID. Elle prend en entrée la sortie du soustracteur (ou l’erreur epsilon(n)), le paramètre N est lié à la bande passante du filtre HF, la période d’échantillonnage ainsi les paramètres du correcteur PID : 1. La coefficient d’amortissement zêta du correcteur au voisinage de 1 (>=1), 2. La pulsation de coupure du correcteur (au voisinage du celui du système physique Wn) de préférence <Wn et 3. La contrastante k0 ou l’action proportionnelle du correcteur PID. En suite la fonction retourne la sortie du correcteur. Ci-dessous la définition de la fonction PID().
// Variables de l'entrée et la sortie double y_nn=0.0;
// Calcul de la nouvelle sortie y_nn=k*(b[0]*x_nn + b[1]*x_cc[0] + b[2]*x_cc[1]); y_nn=y_nn-(c[1]*y_cc[0] + c[2]*y_cc[1]); y_nn=y_nn/c[0];
// Mise à jour de la sortie y_cc[1]=y_cc[0]; y_cc[0]=y_nn;
// Mise à jour de la sortie x_cc[1]=x_cc[0]; x_cc[0]=x_nn;
// Renvoie du résultat return y_nn; }
Ci-dessous un exemple du test du correcteur PID d’un système oscillant.
Le programme Arduino
/* * Objectifs: * 1. Savoir Implémenter un correcteur PID Numérique (Modèle du 2nd Ordre) * 2. Savoir régler les paramètres de son correcteur * 3. Savoir optimiser les performances de son correcteur * 4. Arduino & Problème de la Saturation (Divergence) */
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 Correcteur y_corr[0]=eps_n[0]; // Système non Corrigé