gyro fusion
Dependencies: GYRO_DISCO_L476VG mbed BSP_DISCO_L476VG COMPASS_DISCO_L476VG
main.cpp
- Committer:
- iinewbieii
- Date:
- 2021-06-10
- Revision:
- 5:a3a1c87ad660
- Parent:
- 0:5432bdf904f9
File content as of revision 5:a3a1c87ad660:
#include "mbed.h" #include "GYRO_DISCO_L476VG.h" #include "COMPASS_DISCO_L476VG.h" #define Te 0.01 #define r2d 57.2957795131 #define PI 3.14159265359 GYRO_DISCO_L476VG gyro; COMPASS_DISCO_L476VG compass; Serial pc(USBTX, USBRX); Ticker t1; volatile bool flag = 0 ; double coef_a[2]; double coef_g[2]; double xn[2]; double yn[2]; double sortie_a[2]; double sortie_g[2]; double angle_y_acc[2]; double angle_y_gyro[2]; float x,z; float derive; float offset; void coef_filtre(double,double ,double*); void filtre_PB(double *, double *, double *); void mesure(); int u; int main() { float GyroBuffer[3]; int16_t AccBuffer[3]; pc.baud(115200); t1.attach(&mesure,Te); coef_filtre(1.00,0.1,coef_a); coef_filtre(1/(2*PI*0.1),0.1,coef_g); for(int a = 0;a<=10000;a++){ gyro.GetXYZ(GyroBuffer); derive += GyroBuffer[1]/10000; } for(int a = 0;a<=1000;a++){ compass.AccGetXYZ(AccBuffer); x = AccBuffer[0]*0.061/1000; z = AccBuffer[2]*0.061/1000; offset += ((atan2((double)x,(double)z))*r2d)/1000; } while(1) { if(flag) { flag = 0; compass.AccGetXYZ(AccBuffer); gyro.GetXYZ(GyroBuffer); x = AccBuffer[0]*0.061/1000; z = AccBuffer[2]*0.061/1000; angle_y_gyro[0] = (GyroBuffer[1]-derive)/1000; angle_y_acc[0] = (atan2((double)x,(double)z))*r2d-offset; filtre_PB(angle_y_acc,sortie_a,coef_a); filtre_PB(angle_y_gyro,sortie_g,coef_g); if((u%10)==0) { pc.printf("$%lf %lf %lf;\n",sortie_g[0],sortie_a[0],sortie_a[0]+sortie_g[0]); } } } } void mesure() { flag = 1; u++; } void coef_filtre(double H0,double F0,double *coef) { coef[0] = (H0*Te)/( Te + (1/(PI*F0))); coef[1] = (Te -(1/(PI*F0)))/( Te + (1/(PI*F0))); } void filtre_PB(double *xn, double *yn, double *coef) { yn[0] = coef[0]*(xn[1]+xn[0])-coef[1]*yn[1]; yn[1] = yn[0]; xn[1] = xn[0]; }