6-Asservissement Moteur
6-Asservissement Moteur
6-Asservissement Moteur
Asservissement moteur CC
Table des matières
1. Introduction......................................................................................................................................2
2. Les interruptions logicielles.............................................................................................................2
3. Acquisition des impulsions de la roue codeuse................................................................................2
4. Commande et alimentation du moteur.............................................................................................3
5. Échantillonnage................................................................................................................................4
6. Asservissement.................................................................................................................................4
6.1. Asservissement en vitesse.........................................................................................................5
6.2. Asservissement en position.......................................................................................................7
7. Matériel utilisé................................................................................................................................10
Lorsqu'un moteur entraîne un robot pour qu'il se déplace d'une certaine distance, l'organe de
commande va envoyer une consigne pendant une certaine durée, sans savoir si le moteur aura
réellement effectué ce qu'on lui a demandé.
L'asservissement consiste à vérifier ce que le moteur a réellement effectué et à corriger si nécessaire
(en augmentant sa commande, pour rattraper le retard par exemple).
6-asservissement_moteur.odt 1
Classe de terminale SI
1. Introduction
Le moteur DC fonctionne quand on lui envoie un courant. Le rotor tourne plus ou moins vite selon
celui-ci, puis s’arrête dès lors qu’il n’est plus alimenté. Cependant, on ne connaît ni la distance
angulaire parcourue, ni la vitesse de rotation. Aussi, si l’on veut réaliser un asservissement en
vitesse ou en position, il faut transformer la consigne pour envoyer un courant pendant le temps
nécessaire pour atteindre l’objectif. Il faut pouvoir mesurer ce qu’il se passe pendant que le moteur
est en marche, calculer une position ou une vitesse, en déduire une erreur, puis la corriger pour
atteindre la consigne de sortie. Il faut donc se servir de codeurs incrémentaux, acquérir les données,
faire les calculs et commander le moteur en même temps.
6-asservissement_moteur.odt 2
Classe de terminale SI
Tirer des informations du codeur incrémental revient à créer une fonction compteur. On enregistre
une valeur que l’on vient incrémenter ou décrémenter selon l’ordre des impulsions de la quadrature.
Remarque : il est possible de connaître la vitesse de rotation à l’aide d’un seul capteur. Mais le fait
d’utiliser deux capteurs permet de plus d’en déterminer le sens.
L293D
6-asservissement_moteur.odt 3
Classe de terminale SI
montage
5. Échantillonnage
L’échantillonnage est une technique utilisée pour le traitement du signal et permet de dire à
l’Arduino de faire des calculs tous les intervalles donnés afin de ne pas saturer la puce de calculs
inutiles. Ainsi, au lieu de faire des mesures continues et de ralentir le microprocesseur, celui-ci
effectuera ses calculs par exemple toutes les 50ms.
Ainsi, toutes les 50ms, l’Arduino refera les calculs et nous dira si oui ou non on s’est éloigné de la
consigne d’entrée. Cela permettra alors de corriger la sortie.
#include <SimpleTimer.h>
SimpleTimer timer;
unsigned int time = 0;
const int frequence_echantillonnage = 20;
void setup()
{
// toutes les 100ms, on appelle la fonction "asservissement"
timer.setInterval(1000/frequence_echantillonnage, asservissement);
}
La carteArduino met en mémoire les impulsions de la roue codeuse en continu dans les
interruptions, mais ne procédera à l’asservissement que toutes les 50ms.
6. Asservissement
L'asservissement est réalisé à l'aide un correcteur PID (à effets proportionnel, intégral, et dérivé).
Cet asservissement peut être modélisé par la formule ci-dessous, où V est la consigne (en Tr/s) à
envoyer au moteur, et Ki, Kd, Kp des coefficients à modifier à la main jusqu’à trouver les
coefficients les plus satisfaisants :
6-asservissement_moteur.odt 4
Classe de terminale SI
6-asservissement_moteur.odt 5
Classe de terminale SI
#include <SimpleTimer.h>
//consigne en tour/s
const float consigne_moteur = 2; // Consigne nombre de tours de roue par seconde
/* Routine d'initialisation */
void setup()
{
Serial.begin(115200); // Initialisation port COM
pinMode(pinPower, OUTPUT); // Sorties commande moteur
pinMode( pinInput1, OUTPUT );
pinMode( pinInput2, OUTPUT );
/* Fonction principale */
void loop()
{
timer.run(); //on fait tourner l'horloge
delay(10);
}
6-asservissement_moteur.odt 6
Classe de terminale SI
void asservissement()
{
// Calcul de l'erreur
int frequence_codeuse = frequence_echantillonnage * tick_codeuse; //100*tick_codeuse
float vit_roue_tour_sec = (float)frequence_codeuse / (float)tick_par_tour_codeuse /
(float)rapport_reducteur; //(100*tick_codeuse)/32/19
float erreur = consigne_moteur - vit_roue_tour_sec; // pour le proportionnel
somme_erreur += erreur; // pour l'intégrateur
float delta_erreur = erreur - erreur_precedente; // pour le dérivateur
erreur_precedente = erreur;
// P : calcul de la commande
vitMoteur = kp*erreur + ki*somme_erreur + kd*delta_erreur; //somme des trois erreurs
TournerDroite (vitMoteur);
// DEBUG
Serial.print(vit_roue_tour_sec, 8); // affiche à gauche la vitesse et à droite
l'erreur
Serial.print(" : ");
Serial.print(erreur, 4);
Serial.print(" : ");
Serial.print(vitMoteur);
Serial.println();
}
6-asservissement_moteur.odt 7
Classe de terminale SI
#include <SimpleTimer.h>
//init echantillonage
unsigned int time = 0;
const int frequence_echantillonnage = 20;
//init compteur :
int encoder0Pos = 0; //position de départ=0
int lastReportedPos = 0;
boolean A_set = false;
boolean B_set = false;
//consigne
const double target_cm = 48;
double target_deg = 68.8 * target_cm;
int target_ticks; //plus simple d'asservir en ticks car ce sera toujours un nombre entier
/* Routine d'initialisation */
void setup()
{
6-asservissement_moteur.odt 8
Classe de terminale SI
/* Fonction principale */
void loop()
{
timer.run(); //on fait tourner l'horloge
}
//---- Cette fonction est appelée toutes les 20ms pour calcul du correcteur PID
void asservissement()
{
time += 20; // pratique pour graphes excel après affichage sur le moniteur
Tourner (vitMoteur);
6-asservissement_moteur.odt 9
Classe de terminale SI
analogWrite(pinPower, rapportCyclique);
}
7. Matériel utilisé
Liste du matériel :
• carte Arduino
• pont en H L293D
• moteur à courant continu 12V (de rapport de réduction 1/19) équipe d’une roue codeuse
• pile de 9V pour alimenter le moteur
Correspondances entre couleurs et rôles des différents câbles du moteur CC :
6-asservissement_moteur.odt 10
Classe de terminale SI
6-asservissement_moteur.odt 11