Prendre conscience des problèmes qui sont liés à l’instabilité d’un système, saturation, divergence, etc.
Savoir les caractéristiques de la fonction de saturation, la tangente hyperbolique
Savoir adapter la fonction tangente hyperbolique aux valeurs crêtes de son correcteur
Etc.
Importance de la tangente hyperbolique
La tengente hyperbolique est une fonction de saturation par excellence. Elle est caractérisée par son allure linaire lorsque x tant vers 0 (petits signaux), et converge vers [-1, 1] lorsque l’amplitude du signal converge vers l’infini.
Comment adapter les valeurs crêtes de son correcteur ?
Le tuto aborde le problème lié à la divergence de la commande du correcteur d’une part, et la saturation d’une variable par la carte Arduino. Il est primordial de limiter la dynamique de sa commande durant l’implémentation d’un correcteur PID numérique. La tangente hyperbolique est une fonction rapide et efficace dédiée à cet effet contrairement à l’instruction IF (longue et non linaire). De plus la tangente hyperbolique dispose des caractéristiques linéaires et adoucit le signal durant les transitions (voir le tuto Matlab). Ci-dessous un extrait du code de l’adaptation des niveaux : [-1, 1] vers [-Vmax, Vmax].
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é