Filtre complémentaire

Dependencies:   FastPWM MPU6050 Gyro_Accelerometre mbed

Revision:
2:41e642ed448d
Parent:
1:aca3c4b9fcfe
--- a/Gyro_Accelerometre_XYZ.cpp	Tue Mar 06 14:31:22 2018 +0000
+++ b/Gyro_Accelerometre_XYZ.cpp	Fri Mar 09 08:31:26 2018 +0000
@@ -6,46 +6,61 @@
 DigitalOut myled(LED1);
 
 //****************Init Hardware*****************
-Serial pc(USBTX, USBRX); // Initialisation de pc tx, rx -> hyperterminal
+Serial pc(USBTX, USBRX,115200); // Initialisation de pc tx, rx -> hyperterminal
 Serial Bluetooth(PA_9, PA_10); // Initialisation Bluetooth (D1 et D0)
 MPU6050 mpu6050(D4, D5); // Initialisation accéléromètre/ liaison I2C (SDA,SCL)
-FastPWM motG1 (D9); //Initialisation PWM
+//Initialisation des 4 PWM
+FastPWM motG1 (D9);
 FastPWM motG2 (D10);
 FastPWM motD1 (D11);
 FastPWM motD2 (D12);
 
-//****************Init constantes*****************
-bool test_accelero;// tester la connextion accéléro
-float accelero[3]; // init tableau xyz accéléro
-float gyro[3]; // init tableau xyz gyro
-int Te=1000; // période d'échantillonnage en ms
-int flag_affichage=0; // drapeau pour l'affichage des valeurs de l'accéléromètre en dehors de la fonction gyro_thread
+//****************Constante********************
+int Te=5; // période d'échantillonnage en ms
 
 
-void gyro_thread() //fct timer
-{
-    // **********Test connexion accelerometre********
-    test_accelero = mpu6050.testConnection();
-    if (test_accelero ==1) {
-        pc.printf("test accelero ok\r\n");
-    } else {
-        pc.printf("test accelero non ok\r\n");
-    }//fin if test connexion accelerometre
+bool test_accelero;// tester la connextion accéléro
+
+//******Init variables acquisition accelero-gyro**************
+float accelero[3]; // init tableau xyz accéléro
+float gyro[3]; // init tableau xyz gyro
+
+//****************Init constantes acquisition teta *****************
+float TauFC=1.0/15; // tau du filtre complémentaire
+float AFC= 1.0/(1+1000*TauFC/Te);  // coefficient du filtre complémentaire *1000-> TauFC en s
+float BFC=(1000.0*TauFC/Te)/(1+1000*TauFC/Te); // coefficient du filtre complémentaire
+
+//************Init variables acquisition teta*********************
+float teta_accelero; // téta acceleromètre en entrée
+float teta_final; // valeur du téta final
+float teta_final_p; // valeur du téta final précédant
 
 
+int flag_affichage=0; // drapeau pour l'affichage des valeurs de l'accéléromètre en dehors de la fonction gyro_thread
+
+//*******************fonction timer***************
+void gyro_thread() 
+{
     //***************Lecture des données de l'inclinaison de l'accelerometre************
     mpu6050.getAccelero(accelero); //donne l'acceleration en m/s2
     mpu6050.getGyro(gyro);
-    
+
+    //*************Calcul du téta de l'accéléromètre************
+    teta_accelero=atan2(accelero[1],accelero[2]);
+    teta_final=AFC*(teta_accelero+gyro[0]*TauFC)+BFC*teta_final_p;
+    teta_final_p=teta_final;
+
+
+//*************************Variation des moteurs en fonction de l'angle téta final************************
     motG1.period_us(50);
-    motG1.write(0.5+0.05*accelero[0]); //moteur gauche marche avant
+    motG1.write(0.5+0.4/1.5*teta_final); //moteur gauche marche avant
     motG2.period_us(50);
-    motG2.write(0.5-0.05*accelero[0]); //moteur gauche marche arrière
+    motG2.write(0.5-0.4/1.5*teta_final); //moteur gauche marche arrière
     motD1.period_us(50);
-    motD1.write(0.5+0.05*accelero[0]); //moteur droit marche avant
+    motD1.write(0.5+0.4/1.5*teta_final); //moteur droit marche avant
     motD2.period_us(50);
-    motD2.write(0.5-0.05*accelero[0]); //moteur droit marche arrière
-    
+    motD2.write(0.5-0.4/1.5*teta_final); //moteur droit marche arrière
+
     flag_affichage=1;// activation du drapeau
 
 }
@@ -55,13 +70,22 @@
 
 int main()
 {
-    timer.start(Te); // en ms   RtosTimer timer executé sur les secondes
+    //***************Test connection accelero******************
+    test_accelero = mpu6050.testConnection();
+    if (test_accelero ==1) {
+        pc.printf("test accelero ok\r\n");
+    } else {
+        pc.printf("test accelero non ok\r\n");
+        while(1);// arrête le programme
+    }
+
+    timer.start(Te); // en ms   objet RtosTimer timer executé sur les secondes
 
     while(1) {
 
         if(flag_affichage==1) {
-            pc.printf("Xaccelero = %lf ; Yaccelero = %lf ; Zaccelero = %lf \r\n",accelero[0],accelero[1],accelero[2]);
-            pc.printf("Xgyro = %lf ; Ygyro = %lf ; Zgyro = %lf \r\n",gyro[0],gyro[1],gyro[2]);
+            //    pc.printf("Xaccelero = %lf ; Yaccelero = %lf ; Zaccelero = %lf \r\n",accelero[0],accelero[1],accelero[2]);
+            pc.printf("%lf %lf \r\n",teta_accelero,teta_final);
             flag_affichage=0;
         }// fin if flag_affichage