code of robot bike

Dependencies:   SDFileSystem mbed

Fork of Robot_Bicycle by Chris LU

SPI_9dSensor.cpp

Committer:
YCTung
Date:
2016-06-09
Revision:
0:830ddddc129f
Child:
2:ec30613f2b2b

File content as of revision 0:830ddddc129f:

#include "SPI_9dSensor.h"
#include "SensorFusion.h"

#include <stdio.h>  // printf()
#include <signal.h> // signal()
#include <errno.h> // strerro
#include <string.h>

SPI spi2(PB_15,PB_14,PB_13);
DigitalOut sensor_CSG(PB_2);
DigitalOut sensor_CSXM(PB_1);

Serial pc(D1,D0);

int volatile interrupt = 0;

const int speed = 1875000;

unsigned char sensorG_CTRL_REG[6];
unsigned char sensorXM_CTRL_REG[9];

short int Gyro_axis_data[3]; // X, Y, Z axis
short int Gyro_axis_zero[3] = {GX_offset, GY_offset, GZ_offset};///new{-57,-10,34};///{32, -28, 138};///{25, -25, 120};
float Gyro_scale[3];

short int Acce_axis_data[3]; // X, Y, Z axis
short int Acce_axis_zero[3] = {AX_offset, AY_offset, AZ_offset};///new{-847,-420,186};///{-855, -590, 186};///{-855, -504, 186};///{-855, -454, 186};///
float Acce_scale[3];

short int Magn_axis_data[3]; //X,Y,Z axis
short int Magn_axis_zero[3] = {MX_offset, MY_offset, MZ_offset};///{-55, -21, 77};//{-32,-25,80};
float Magn_scale[3];

float B_x = 1015.0f*Magn_gain;
float B_y = 0.0f*Magn_gain;
float B_z = -580.0f*Magn_gain;
float B_total = 0.0f;

float u_cali[9] = {0,0,0,0,0,0,0,0,0};
float u_old[9] = {GX_offset, GY_offset, GZ_offset, AX_offset, AY_offset, AZ_offset, MX_offset, MY_offset, MZ_offset};

void sig_handler(int signo)
{
    if(signo == SIGINT)interrupt = 1;
}

void setup_spi(void)
{
//    signal(SIGINT, sig_handler);
//    wiringPiSetupGpio () ;
    sensor_CSG = 1;
    sensor_CSXM = 1;
    spi2.format(8, 3);
    pc.printf("SPI ready.\n");
    wait_ms(50);
}

void init_Sensors(void)
{
    Gyro_axis_data[0] = 0; // X
    Gyro_axis_data[1] = 0; // Y
    Gyro_axis_data[2] = 0; // Z
    Acce_axis_data[0] = 0;
    Acce_axis_data[1] = 0;
    Acce_axis_data[2] = 0;
    Magn_axis_data[0] = 0;
    Magn_axis_data[1] = 0;
    Magn_axis_data[2] = 0;
    sensorG_setup();
    sensorXM_setup();
}

void sensorG_setup(void)
{
    sensorG_CTRL_REG[1] = 0b11111111; // x, y, z enabled
    sensorG_CTRL_REG[2] = 0b00001001; // ODR = 800Hz, LPfc = 110Hz
    sensorG_CTRL_REG[3] = 0b00000000; // output circuit: push- pull
    sensorG_CTRL_REG[4] = 0b00110000; // 2000dps
    sensorG_CTRL_REG[5] = 0b00000000; // HPen = 0, LPFen = 0

    // write mode (R/W = 0)
    // Auto increase address (M/S = 1)
    //sensorG_data_write = 0x20;
    sensorG_CTRL_REG[0] = (sensorG_CTRL_REG1_address & 0b00111111) | 0b01000000; // mask first two bits, write first two bits

    // start
    sensor_CSG = 0;
    
    spi2.write(sensorG_CTRL_REG[0]);
    spi2.write(sensorG_CTRL_REG[1]);
    spi2.write(sensorG_CTRL_REG[2]);
    spi2.write(sensorG_CTRL_REG[3]);
    spi2.write(sensorG_CTRL_REG[4]);
    spi2.write(sensorG_CTRL_REG[5]);
        
    sensor_CSG = 1;
    // end
}

void sensorXM_setup(void)
{
    sensorXM_CTRL_REG[1] = 0b00000000;
    sensorXM_CTRL_REG[2] = 0b10010111; // ODR = 800Hz, x, y, z enabled
    sensorXM_CTRL_REG[3] = 0b11011000; // LPfc = 110Hz, +-8g
    sensorXM_CTRL_REG[4] = 0b00000000; // output circuit: push- pull
    sensorXM_CTRL_REG[5] = 0b00000000;
    sensorXM_CTRL_REG[6] = 0b01110100; //Magnetic data rate 100Hz
    sensorXM_CTRL_REG[7] = 0b01000000; //mag full scale +-8 gauss
    sensorXM_CTRL_REG[8] = 0b00000000; // HPen = 0, LPFen = 0
    // write mode (R/W = 0)
    // Auto increase address (M/S = 1)
    //sensorXM_data_write = sensorXM_CTRL_REG0_address;
    sensorXM_CTRL_REG[0] = (sensorXM_CTRL_REG0_address & 0b00111111) | 0b01000000; // mask first two bits, write first two bits

    // start
    sensor_CSXM = 0;
    
    spi2.write(sensorXM_CTRL_REG[0]);
    spi2.write(sensorXM_CTRL_REG[1]);
    spi2.write(sensorXM_CTRL_REG[2]);
    spi2.write(sensorXM_CTRL_REG[3]);
    spi2.write(sensorXM_CTRL_REG[4]);
    spi2.write(sensorXM_CTRL_REG[5]);
    spi2.write(sensorXM_CTRL_REG[6]);
    spi2.write(sensorXM_CTRL_REG[7]);
    spi2.write(sensorXM_CTRL_REG[8]);
        
    sensor_CSXM = 1;
    // end
}

void sensorG_read_3axis(void)
{
    static unsigned char sensorG_READ_REG[7];
    // read mode (R/W = 1)
    // Auto increase address (M/S = 1)
    //sensorG_data_write = sensorG_OUT_X_L_address;
    sensorG_READ_REG[0] = 0x28;
    sensorG_READ_REG[0] = (sensorG_READ_REG[0] & 0b00111111) | 0b11000000; // mask first two bits, write first two bits
    sensorG_READ_REG[1] = 0x00;
    sensorG_READ_REG[2] = 0x00;
    sensorG_READ_REG[3] = 0x00;
    sensorG_READ_REG[4] = 0x00;
    sensorG_READ_REG[5] = 0x00;
    sensorG_READ_REG[6] = 0x00;

    // start
    sensor_CSG = 0;
    
    spi2.write(sensorG_READ_REG[0]);
    sensorG_READ_REG[1] = spi2.write(0x00); // XL
    sensorG_READ_REG[2] = spi2.write(0x00); // XH
    sensorG_READ_REG[3] = spi2.write(0x00); // YL
    sensorG_READ_REG[4] = spi2.write(0x00); // YH
    sensorG_READ_REG[5] = spi2.write(0x00); // ZL
    sensorG_READ_REG[6] = spi2.write(0x00); // YH
    
    sensor_CSG = 1;
    // end

    // Data reconstruction
    Gyro_axis_data[0] = (short int)((sensorG_READ_REG[2]<<8) | sensorG_READ_REG[1]);
    Gyro_axis_data[1] = (short int)((sensorG_READ_REG[4]<<8) | sensorG_READ_REG[3]);
    Gyro_axis_data[2] = (short int)((sensorG_READ_REG[6]<<8) | sensorG_READ_REG[5]);
}

void sensorX_read_3axis(void)
{
    static unsigned char sensorX_READ_REG[7];

    // read mode (R/W = 1)
    // Auto increase address (M/S = 1)
    sensorX_READ_REG[0] = 0x28;//accelerator's first address
    sensorX_READ_REG[0] = (sensorX_READ_REG[0] & 0b00111111) | 0b11000000; // mask first two bits, write first two bits
    sensorX_READ_REG[1] = 0x00;
    sensorX_READ_REG[2] = 0x00;
    sensorX_READ_REG[3] = 0x00;
    sensorX_READ_REG[4] = 0x00;
    sensorX_READ_REG[5] = 0x00;
    sensorX_READ_REG[6] = 0x00;
    // start
    sensor_CSXM = 0;
    
    spi2.write(sensorX_READ_REG[0]);
    sensorX_READ_REG[1] = spi2.write(0x00); // XL
    sensorX_READ_REG[2] = spi2.write(0x00); // XH
    sensorX_READ_REG[3] = spi2.write(0x00); // YL
    sensorX_READ_REG[4] = spi2.write(0x00); // YH
    sensorX_READ_REG[5] = spi2.write(0x00); // ZL
    sensorX_READ_REG[6] = spi2.write(0x00); // YH
    
    sensor_CSXM = 1;
    // end

    // Data reconstruction
    Acce_axis_data[0] = (short int)((sensorX_READ_REG[2]<<8) | sensorX_READ_REG[1]); // X
    Acce_axis_data[1] = (short int)((sensorX_READ_REG[4]<<8) | sensorX_READ_REG[3]); // Y
    Acce_axis_data[2] = (short int)((sensorX_READ_REG[6]<<8) | sensorX_READ_REG[5]); // Z
}

void sensorM_read_3axis(void)
{
    static unsigned char sensorM_READ_REG[7];

    // read mode (R/W = 1)
    // Auto increase address (M/S = 1)
    sensorM_READ_REG[0] = 0x08;//magnetometer's first address
    sensorM_READ_REG[0] = (sensorM_READ_REG[0] & 0b00111111) | 0b11000000; // mask first two bits, write first two bits
    sensorM_READ_REG[1] = 0x00;
    sensorM_READ_REG[2] = 0x00;
    sensorM_READ_REG[3] = 0x00;
    sensorM_READ_REG[4] = 0x00;
    sensorM_READ_REG[5] = 0x00;
    sensorM_READ_REG[6] = 0x00;

    // start
    sensor_CSXM = 0;
    
    spi2.write(sensorM_READ_REG[0]);
    sensorM_READ_REG[1] = spi2.write(0x00); // XL
    sensorM_READ_REG[2] = spi2.write(0x00); // XH
    sensorM_READ_REG[3] = spi2.write(0x00); // YL
    sensorM_READ_REG[4] = spi2.write(0x00); // YH
    sensorM_READ_REG[5] = spi2.write(0x00); // ZL
    sensorM_READ_REG[6] = spi2.write(0x00); // YH
    
    sensor_CSXM = 1;
    // end

    // Data reconstruction
    Magn_axis_data[0] = (short int)((sensorM_READ_REG[2]<<8) | sensorM_READ_REG[1]); // X
    Magn_axis_data[1] = (short int)((sensorM_READ_REG[4]<<8) | sensorM_READ_REG[3]); // Y
    Magn_axis_data[2] = (short int)((sensorM_READ_REG[6]<<8) | sensorM_READ_REG[5]); // Z
}

short int filted_sensor_data(unsigned char axis_index, float freq)
{
    float data_to_filt = 0.0;

    switch(axis_index)
    {
        case 1: data_to_filt = (float)Gyro_axis_data[0]; break;
        case 2: data_to_filt = (float)Gyro_axis_data[1]; break;
        case 3: data_to_filt = (float)Gyro_axis_data[2]; break;
        case 4: data_to_filt = (float)Acce_axis_data[0]; break;
        case 5: data_to_filt = (float)Acce_axis_data[1]; break;
        case 6: data_to_filt = (float)Acce_axis_data[2]; break;
        case 7: data_to_filt = (float)Magn_axis_data[0]; break;
        case 8: data_to_filt = (float)Magn_axis_data[1]; break;
        case 9: data_to_filt = (float)Magn_axis_data[2]; break;
        default: break;
    }

    u_cali[axis_index - 1] = lpf(data_to_filt, u_old[axis_index - 1], freq);
    u_old[axis_index - 1] = u_cali[axis_index - 1];
    return (short int)u_cali[axis_index - 1];
}

void reset_gyro_offset(void)
{
    sensorG_read_3axis();
    Gyro_axis_zero[0] = filted_sensor_data(INDEX_GYRO_X, 1.8);
    Gyro_axis_zero[1] = filted_sensor_data(INDEX_GYRO_Y, 1.8);
    Gyro_axis_zero[2] = filted_sensor_data(INDEX_GYRO_Z, 1.8);
}

void reset_acceX_offset(void)
{
    sensorX_read_3axis();
    Acce_axis_zero[0] = filted_sensor_data(INDEX_ACCE_X, 1.8);
}

void get_9axis_scale(void)
{
    Gyro_scale[0] = ((float)Gyro_axis_data[0]-Gyro_axis_zero[0])*Gyro_gainx;
    Gyro_scale[1] = ((float)Gyro_axis_data[1]-Gyro_axis_zero[1])*Gyro_gainy;
    Gyro_scale[2] = ((float)Gyro_axis_data[2]-Gyro_axis_zero[2])*Gyro_gainz;
    Acce_scale[0] = ((float)(Acce_axis_data[0]-Acce_axis_zero[0]))*Acce_gainx;
    Acce_scale[1] = ((float)(Acce_axis_data[1]-Acce_axis_zero[1]))*Acce_gainy;
    Acce_scale[2] = ((float)(Acce_axis_data[2]-Acce_axis_zero[2]))*Acce_gainz;
    Magn_scale[0] = ((float)(Magn_axis_data[0]-Magn_axis_zero[0]))*Magn_gain;
    Magn_scale[1] = ((float)(Magn_axis_data[1]-Magn_axis_zero[1]))*Magn_gain;
    Magn_scale[2] = ((float)(Magn_axis_data[2]-Magn_axis_zero[2]))*Magn_gain;
}