Comment corriger un asservissement numérique ?
Objectifs
- Mettre en oeuvre un correcteur PID numérique
Pré-requis
Correcteur PID
Conception du correcteur numérique
Implémentation sur Nucleo via MBED
Il sera pris ici l’exemple de l’asservissement d’un scanner pour laser, permettant d’asservir la position d’un laser sur une cible. Cette cible est réalisée à partir de 2 photodiodes.
La position du scanner est pilotée en tension. En fonction d’une tension continue, l’angle est modifié. Le temps de réponse du scanner est de l’ordre de 10 ms.
#include "mbed.h"
Ticker IntSurTimer;
AnalogIn entree(A0);
AnalogOut sortie(D13);
const double TE=0.000025; // Echantillonnage
const double TauI=0.0008; // Constante de temps d'intégration
const double TauD=0; // Constante de temps de dérivation
const double K=1; // Gain
double Rk,Ri,Rd ;
double calcul=0;
double yk=0;
double yi=0;
double yi_o=0;
double yd=0;
double x_o=0;
double PID(double x)
{
double y=0;
// Proportionnel
yk = x * Rk; //Rk=k*(TauD+TauI)/TauI;
// Integral
yi = yi_o + Ri * x; // Ri=k*(TE)/TauI)
if (yi > 0.5) { yi = 0.5;} // Pour "saturer" l'intégration
if (yi < -0.5) { yi = -0.5;}
yi_o = yi;
// Dérivé
yd = Rd * (x - x_o); //Rd=K*(TauD/TE)
x_o = x;
// Total
y = yk + yi + yd;
if (y>0.5) {y=0.5;} // Pour "saturer" la sortie
if (y<-0.5) {y=-0.5;}
return y;
}
void MiseAJour() { // Fonction lancée lors de l'interruption régulière
double meas;
meas = entree.read();
meas=0.5-meas; // Consigne nulle-> Signal d'erreur = -Mesure
calcul=PID(meas)+0.5; //Décalage autour de 2.5V pris en compte à
// l'entrée et à la sortie.
sortie.write(calcul);
}
int main() {
IntSurTimer.attach(&MiseAJour, TE);
Rk=K*(TauD+TauI)/TauI;
Ri=K*(TE/TauI);
Rd=K*(TauD/TE);
while(1);
}
| MInE | Prototyper | Prototyper avec Nucleo et MBED |