Académique Documents
Professionnel Documents
Culture Documents
Objectifs
1. Savoir implémenter une boucle d’asservissement traditionnelle
2. Savoir les limites du correcteur proportionnel (P)
3. Savoir implémenter la fonction de saturation et son utilité
4. Savoir optimiser le correcteur P
Applications
1. Asservissement de la vitesse
2. Systèmes de régulation automatique
3. Convertisseurs AC/DC, DC/AC, DC/DC, etc. Asservis
4. Asservissement de la température, humidité, etc.
5. Et, d’autres applications !
Principe de fonctionnement
Arduino
Consigne
+
A0 Passe-Bas
Filtre - 9PWM
+ K Charge
(si PWM)
La fonction getMean()
La fonction getMean() permet de renvoyer la valeur moyenne actuelle du signal PWM. Elle
prend en entrée la tension PWM actuelle, le tableau des anciennes valeurs moyennes, puis
elle revoie la valeur moyenne récente. Elle contient l’indice d’incrémentation des éléments
du tableau au format static : Pour chaque appel, l’indice s’incrémente d’un pas égal à 1. Ci-
dessous la définition de la fonction.
// Retour de la VM
return VMFiltre;
}
La fonction Satur()
La fonction Satur() permet de garantir le non-débordement de la commande. Elle assure que
la valeur de la commande soit comprise entre [-Vmax, Vmax]. Elle est basée sur la fonction
mathématique tangente hyperbolique modifiée tanh() (voir le tutoriel pour plus de détails).
La fonction sert à générer une commande « soft » et convergente grâce aux propriétés
limites de la tanh() . Elle joue également le rôle de stabilisation de la commande en cas d’une
mauvaise manœuvre des paramètres du correcteur ou du système. La fonction Satur() prend
en entrée la commande, la valeur maximale Vmax, puis elle retourne la commande écrêtée.
Ci-dessous la définition de la fonction.
vout=vmax*tanh(vin/(vmax+Eps));
// Ou bien
/*
x=vin/(vmax+Eps); // tanh(x)=(1.0-exp(-2.0*x))/(1.0+exp(-2.0*x));
vout=vmax*(1.0-exp(-2.0*x))/(1.0+exp(-2.0*x));
*/
return vout;
}
Programme complet
#define Out 9 // Sortie PWM
#define In A0 // Entrée analogique
#define OutTOR 2 // Sortie TOR
#define Consigne 3.5 // Tension de la consigne
#define K 5.0 // Action Proportionnelle
#define NMoy 150 // Moyenne glissante
#define TCycMicroS 20000 // Délai de la boucle en µS
float v_fil=0.0;
float v_fil_old=0.0;
bool LoopCyc=false;
float somme =0.0;
float vin_volat=0.0;
float valMoy[NMoy];
int Vin_A0=0;
int I=0;
float OutPWM=0.0;
float Cmd=0.0;
float Erreur_t=0.0;
void setup()
{
// Pinout
pinMode(Out, OUTPUT);
pinMode(OutTOR, OUTPUT);
// Init PWM
analogWrite(Out, 0);
// Affichage
Serial.begin(250000);
}
void loop()
{
// 1. Lecture de l'entrée A0
vin_volat=(float)analogRead(A0)*5.0/1023.0;
//3.3 Saturation
OutPWM=Satur(Cmd, 255.0); // [-255, 255]
Serial.print(Consigne); Serial.print(",");
Serial.print(v_fil); Serial.print(",");
//Serial.println(Cmd*5.0/255.0);
Serial.println(OutPWM*5.0/255.0);
/*
LoopCyc=!LoopCyc;
digitalWrite(OutTOR, LoopCyc);
*/
}
vout=vmax*tanh(vin/(vmax+Eps));
// Ou bien
/*
x=vin/(vmax+Eps); // tanh(x)=(1.0-exp(-2.0*x))/(1.0+exp(-2.0*x));
vout=vmax*(1.0-exp(-2.0*x))/(1.0+exp(-2.0*x));
*/
return vout;
}
// Retour de la VM
return VMFiltre;
}
Autres correcteurs.
Click to rate this post!
[Total: 1 Average: 5]
Nous Soutenir