desp koval / Mbed 2 deprecated Mecatro_Filtre

Dependencies:   mbed MPU6050 mbed-rtos McatroAntoineAndrii

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers mecafiltre.cpp Source File

mecafiltre.cpp

00001 #include "mbed.h"
00002 #include "rtos.h"
00003 #include "MPU6050.h"
00004 #include "FastPWM.h"
00005 
00006 //******************************************************************************************
00007 //                              déclaration des objets                                      
00008 //******************************************************************************************
00009 
00010 Serial pc(USBTX, USBRX,115200);
00011 Serial hc(D1, D0,115200);
00012 DigitalOut led(LED1);
00013 MPU6050 module(D4, D5);
00014 AnalogIn tensBat(A4);  
00015 
00016 //******************************************************************************************
00017 //                        initialisation des broche PWM en sortie                           
00018 //******************************************************************************************
00019 PwmOut PWMGP(D11);  // moteur gauche
00020 PwmOut PWMGM(D12); // moteur gauche
00021 PwmOut PWMDP(D10);  // moteur Droit
00022 PwmOut PWMDM(D9);  // moteur Droit
00023 
00024 // valeur de Te
00025 float tems = 10;
00026 
00027 //******************************************************************************************\
00028 //        variable necessaire à la mesure de la position angulaire du gyropode              \
00029 //******************************************************************************************/
00030 
00031 float accelero[3]= {0};
00032 float gyro[3] = {0};
00033 float tauFC = 0.285;        // constante de temps en secondes du filtre passe bas du filtre complémentaire
00034 float aFC, bFC;         // les coefficient du filter passe bas du filtre complémentaire
00035 float angleATG,angleNF, angleGyropodeF,omegarGyropode, angleGyropodeFp;
00036 float angleOffset = 0.07;
00037 
00038 //******************************************************************************************\
00039 //                   variable correcteur dérivé et proportionelle                           \
00040 //******************************************************************************************/
00041 
00042 float K=3.8, alpha,alphaR;  // correcteur et consigne
00043 float KD=0.06 ;//correcteur dérivé
00044 
00045 //******************************************************************************************\
00046 //                       Variable asservi de vitesse                                        \
00047 //******************************************************************************************/
00048 
00049 float PBv,Pbfc, Tfv=0.345; //coeff passe bas asserv vitesse
00050 float Err,PCsAng=0,PCsAngF;  // erreur de vitesse
00051 float alphaCons = 0; // initialisation à 0 de la consigne
00052 float Kv=2.23; // initialisation du ceoff propotionelle dérivé
00053 float alphaF, alphaP; // angle alpha Filtrée et précédent pour filtre récursif
00054 float Kdv=0.035;
00055 float Edrrp;
00056 float deriv ;
00057 char receptionHC;
00058 
00059 int nbInc=0;
00060 volatile int flagInterupt=0;
00061 
00062 void reception(char ch)
00063 {
00064     static  int i=0;                // indice du dernier caratère recu
00065     static  char chaine[10];        // chaine de stockage des caratères recus
00066     char commande[3];               // chaine contenant la commande
00067     char valeur[6];                 // chaine contenant la valeur
00068 
00069     if ((ch==13) or (ch==10)) {
00070 
00071         chaine[i]='\0';
00072 
00073         // séparation de la commande et de la valeur
00074         strcpy(commande, strtok(chaine, " "));
00075         strcpy(valeur,  strtok(NULL, " "));
00076 
00077 
00078         if (strcmp( commande, "TFC" ) == 0) { // commande modification de constante du filtre
00079             tauFC =  atof(valeur);
00080             aFC=(float)1/(1+tauFC/(tems/1000));
00081             bFC=tauFC/(tems/1000);
00082         }
00083         if (strcmp( commande, "K" ) == 0) { // commande modification du correcteur proportionelle
00084             K =  atof(valeur);
00085         }
00086 
00087         if (strcmp( commande, "KD" ) == 0) { // commande modification du correcteur Dérivé
00088             KD =  atof(valeur);
00089         }
00090         if (strcmp( commande, "Kv" ) == 0) { // commande modification du correcteur de vitesse
00091             Kv =  atof(valeur);
00092         }
00093         if (strcmp( commande, "Tfv" ) == 0) { // commande modification de constante du filtre
00094             Tfv =  atof(valeur);
00095             PBv = (float)1/(1+Tfv/(tems/1000));
00096             Pbfc=Tfv/(tems/1000);
00097         }
00098         if (strcmp( commande, "Kdv" ) == 0) { // commande modification de constante du filtre
00099             Kdv= atof(valeur);
00100         }
00101 
00102         // reinitialisation de l indice de chaine
00103         i = 0;
00104 
00105     } else {
00106         chaine[i]=ch;
00107         i++;
00108     }
00109 }
00110 
00111 void interupt()
00112 {   
00113     nbInc++;
00114 
00115 //lecture des données de l'accéléro et du gyro
00116     module.getAccelero(accelero);
00117     module.getGyro(gyro);
00118 
00119 //******************************************************************************************\
00120 //                      Mesure des positions angulaire                                      \
00121 //******************************************************************************************/
00122 
00123     angleATG = -atan2(accelero[1],accelero[0]); // angle du gyropode calcule par la tengente
00124     omegarGyropode = gyro[2];
00125     angleNF = (angleATG + tauFC * omegarGyropode)-angleOffset;  // Angle non filtré
00126     angleGyropodeF = aFC*( angleNF + bFC * angleGyropodeFp); //   Angle filtré
00127     angleGyropodeFp = angleGyropodeF; // memorisation des valeurs précedante pour les filtres recursifs de l'angle gyropode
00128 
00129 
00130 
00131 
00132 //******************************************************************************************\
00133 //                        Asservissement de vitesse                                         \
00134 //******************************************************************************************/
00135    
00136     Err= alphaCons -  alphaF; // calcule de l'erreur
00137     PCsAng = -Kv*Err ;   // calcul de l'angle de consigne avec err de vitesse
00138     deriv  =((Err - Edrrp)/(tems/1000)); // calcule de la dérivé afin de stabiliser
00139     PCsAngF =  PCsAng  + Kdv* deriv;  // calcul de l'angle Filtre avec action dériver sur entrée
00140     Edrrp = Err; // Valeur précédente de l'erreur
00141 
00142 
00143 // calcul de la grandeur de commande
00144     alpha = K*(PCsAngF- angleGyropodeF )- KD*(omegarGyropode); // calcul de la sortie prop dérivé
00145 
00146 
00147 //Mise en place de la saturation
00148     if (alpha>0.5) alpha=0.5;
00149     if (alpha<-0.5) alpha=-0.5;
00150 
00151 
00152 //******************************************************************************************\
00153 //                        filtre récursif angle                                             \
00154 //******************************************************************************************/
00155 
00156     alphaF = PBv*(alpha + Pbfc * alphaP ) ;// calcul filtre récursif
00157     alphaP=alphaF; // valeurs précédente de l'angle alpha filtré
00158 
00159 
00160 //******************************************************************************************\
00161 //                        correction couple résistant                                       \
00162 /******************************************************************************************/
00163  
00164     if (alpha>0) alphaR=alpha+0.15;
00165     if (alpha<0) alphaR=alpha-0.15;
00166 
00167 
00168 //******************************************************************************************\
00169 //                        Sortie PWM moteur                                                 \
00170 //******************************************************************************************/
00171     PWMGP.write(0.5-alphaR);
00172     PWMGM.write(0.5+alphaR);
00173     PWMDP.write(0.5-alphaR);
00174     PWMDM.write(0.5+alphaR);
00175 
00176     flagInterupt=1;
00177 }
00178 
00179 RtosTimer timer(mbed::callback(interupt),osTimerPeriodic);
00180 
00181 int main(){
00182 
00183 //******************************************************************************************\
00184 //                        initialisation des période PWM                                    \
00185 //******************************************************************************************/    
00186     PWMDM.period_us(50);
00187     PWMDP.period_us(50);
00188     PWMGM.period_us(50);
00189     PWMGP.period_us(50);
00190 
00191 // initialisation et test de connection du MPU6050
00192     int test;
00193     while ((test = module.testConnection())!=0x98) {
00194         pc.printf("not connected to mpu %02X\n\r", test);
00195         wait(1);
00196     }
00197     pc.printf("connected to mpu %02X\n\r", test);
00198       
00199 //changement du l'echelle du module
00200     module.setGyroRange(MPU6050_GYRO_RANGE_2000);
00201     module.setAcceleroRange(MPU6050_ACCELERO_RANGE_2G);
00202 
00203 
00204 //******************************************************************************************\
00205 //                      calcul des coefficients des filtres                                 \
00206 //******************************************************************************************/
00207 
00208     aFC=(float)1/(1+tauFC/(tems/1000)); // coeff correcteur dérivé premier 
00209     bFC=tauFC/(tems/1000);
00210     PBv = (float)1/(1+Tfv/(tems/1000)); // Coeff coorrecteur dérivé 
00211     Pbfc=Tfv/(tems/1000);
00212 
00213 //******************************************************************************************\
00214 //       initialisation de la la tache periodique du noyau multitache                       \
00215 //******************************************************************************************/
00216 
00217     timer.start(tems);
00218 
00219     while(1) {
00220         
00221 //******************************************************************************************\
00222 //                      Contrôle du gyropode via le bluetooth                               \
00223 //******************************************************************************************/
00224 
00225     if (hc.readable()!=0) {
00226             receptionHC=hc.getc();
00227             
00228             if(receptionHC=='A'){
00229                 pc.printf("Avancer");
00230                 alphaCons=0.11;
00231                 }
00232             if(receptionHC=='R'){
00233                 pc.printf("Reculer");
00234                 alphaCons=-0.11;
00235                 }   
00236             else if (receptionHC=='S'){
00237                 pc.printf("Stable");
00238                 alphaCons=0;
00239                     PWMGP.write(0.5-alphaR);
00240                     PWMGM.write(0.5+alphaR);
00241                     PWMDP.write(0.5-alphaR);
00242                     PWMDM.write(0.5+alphaR);
00243                 }
00244             else if (receptionHC=='D'){
00245                 pc.printf("Droite");
00246                 PWMGP.write(0.5+alphaR+0.15);
00247                 PWMGM.write(0.5-alphaR-0.15);
00248                 PWMDP.write(0.5-alphaR-0.15);
00249                 PWMDM.write(0.5+alphaR+0.15);
00250                 }
00251             else if (receptionHC=='G'){
00252                 pc.printf("Gauche");
00253                 PWMGP.write(0.5-alphaR-0.15);
00254                 PWMGM.write(0.5+alphaR+0.15);
00255                 PWMDP.write(0.5+alphaR+0.15);
00256                 PWMDM.write(0.5-alphaR-0.15);
00257                 }
00258             }
00259 
00260         if (pc.readable()!=0) {
00261             reception(pc.getc());
00262         }
00263         if (flagInterupt==1) {
00264  //       codeurs.read(g,d);}
00265             pc.printf("%d %d %6.3f %6.3f \r\n",0,0,0,tensBat.read());
00266             flagInterupt=0;
00267     
00268         }
00269     }
00270 }
00271 
00272 
00273 
00274 
00275