kalman filter using L3GD20 and MMA7361. But this program has about 0.5s delay

Dependencies:   L3GD20 MMA7361 mbed

main.cpp

Committer:
hirokimineshita
Date:
2016-09-28
Revision:
0:e60a2d5cccc2

File content as of revision 0:e60a2d5cccc2:

#include "mbed.h"
#include "l3gd20.h"
#include "mma7361.h"
#include "kalman.h"
#include "binary.h"

l3gd20 a;
mma7361 b;
Kalman c;
DigitalOut myled(LED1);
Serial pc(USBTX,USBRX);
DigitalIn myb (USER_BUTTON);
Timer t;

int main() {
    int us,d1,d2;
    myled=1;
    while(1) {
        if(myb==0){
            break;
        }
    }
    
    myled=0;
    wait(1);
    while(a.conect());
    pc.printf("success\n\r");
    a.s_write_8(CTRL_REG1,b0001111);
    a.s_write_8(CTRL_REG5,b0000000);
    b.clear_mat();
    int x,z,fdata;
    int16_t data;
    b.set_1st_bit(&x,x_axis,0);
    b.set_1st_bit(&z,z_axis,1);
    float kx,gtheta,dt,atheta,xt,om,fom,iom;
    c.setAngle(0);
    atheta=0;
    fdata=0;
    fom=0;
    iom=0;
    gtheta=0;
    while(1){
        wait_ms(1);
        d1=a.read_8(OUT_Z_H);
        d2=a.read_8(OUT_Z_L);
        data=(d1<<8)|d2;
        b.low_pass_filter(&x,x_axis);
        xt=b.bit_to_g(x,x_axis);
        xt=xt*981/100;
        om=sqrt(abs(xt*1000/37));
        om=b.rad_to_deg(om);
        if(om/data<0){
            om*=-1;
        }
        iom=iom*0.9+om*0.1;
        /*b.low_pass_filter(&z,z_axis);
        atheta=b.rotate(&x,x_axis,&z,z_axis);
        atheta=b.rad_to_deg(atheta);*/
        t.stop();
        us=t.read_us();
        t.reset();
        t.start();
        dt=us*0.000001;
        gtheta+=(data+fdata)*0.00875*dt*0.5;
        atheta+=(om+fom)*dt*0.5;
        /*if(atheta/kx<0 && abs(kx)>70){
            atheta*=-1;
        }*/
        kx = c.getAngle(iom,gtheta,dt);
        pc.printf("%.3f,%.3f,%d\n\r",kx,atheta,data);
        //pc.printf("%.3f\n\r",om);
        fdata=data;
        fom=om;
        gtheta=kx;
    }
}