DCM Code ported from Arduino for FRDM-KL25Z
Dependents: minimu_data_capture minimu_data_capture
Fork of DCM_AHRS by
Diff: minimu9.h
- Revision:
- 0:dc35364e2291
- Child:
- 1:3272ece36ce1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/minimu9.h Thu Apr 12 13:47:23 2012 +0000 @@ -0,0 +1,143 @@ +/* mbed L3G4200D Library version 0.1 + * Copyright (c) 2012 Prediluted + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#pragma once + +#include "L3G4200D.h" +#include "LSM303.h" +#include "mbed.h" +// LSM303 accelerometer: 8 g sensitivity +// 3.8 mg/digit; 1 g = 256 +#define GRAVITY 256 //this equivalent to 1G in the raw data coming from the accelerometer + +#define ToRad(x) ((x)*0.01745329252) // *pi/180 +#define ToDeg(x) ((x)*57.2957795131) // *180/pi + +// L3G4200D gyro: 2000 dps full scale +// 70 mdps/digit; 1 dps = 0.07 +#define Gyro_Gain_X 0.07 //X axis Gyro gain +#define Gyro_Gain_Y 0.07 //Y axis Gyro gain +#define Gyro_Gain_Z 0.07 //Z axis Gyro gain +#define Gyro_Scaled_X(x) ((x)*ToRad(Gyro_Gain_X)) //Return the scaled ADC raw data of the gyro in radians for second +#define Gyro_Scaled_Y(x) ((x)*ToRad(Gyro_Gain_Y)) //Return the scaled ADC raw data of the gyro in radians for second +#define Gyro_Scaled_Z(x) ((x)*ToRad(Gyro_Gain_Z)) //Return the scaled ADC raw data of the gyro in radians for second + + +#define Kp_ROLLPITCH 0.02 +#define Ki_ROLLPITCH 0.00002 +#define Kp_YAW 1.2 +#define Ki_YAW 0.00002 + + +#define STATUS_LED 13 +typedef unsigned char byte; + +class minimu9 { +public: + minimu9 ( void ); + void get_data ( void ); + void print_data ( void ); + void Gyro_Init(); + void Read_Gyro(); + void Accel_Init(); + void Read_Accel(); + void Compass_Init(); + void Compass_Heading(); + void Read_Compass(); + void Normalize( void ); + void Drift_correction( void ); + void Matrix_update( void) ; + void Euler_angles( void ); + void Calibrate_compass( void ); + void set_calibration_values( int, int, int, int, int, int ); + void set_print_settings( int, int, int, int, int ); + + float get_pitch( void ); + float get_roll( void ); + float get_yaw( void ); + +private: + L3G4200D *gyro; + LSM303 *compass; + + Timer t; + + float G_Dt; // Integration time (DCM algorithm) We will run the integration loop at 50Hz if possible + long timer; //general purpuse timer + long timer_old; + long timer24; //Second timer used to print values + unsigned int counter; + int AN[6]; //array that stores the gyro and accelerometer data + int AN_OFFSET[6]; //Array that stores the Offset of the sensors + int SENSOR_SIGN[9]; + + int gyro_x; + int gyro_y; + int gyro_z; + int accel_x; + int accel_y; + int accel_z; + int magnetom_x; + int magnetom_y; + int magnetom_z; + float c_magnetom_x; + float c_magnetom_y; + float c_magnetom_z; + float MAG_Heading; + + float Accel_Vector[3]; //Store the acceleration in a vector + float Gyro_Vector[3]; //Store the gyros turn rate in a vector + float Omega_Vector[3]; //Corrected Gyro_Vector data + float Omega_P[3]; //Omega Proportional correction + float Omega_I[3]; //Omega Integrator + float Omega[3]; + + // Euler angles + float roll; + float pitch; + float yaw; + + float errorRollPitch[3]; + float errorYaw[3]; + + byte gyro_sat; + + // Gyros here + float DCM_Matrix[3][3]; + float Update_Matrix[3][3]; + float Temporary_Matrix[3][3]; + + // Calibration values + int M_X_MIN; + int M_Y_MIN; + int M_Z_MIN; + int M_X_MAX; + int M_Y_MAX; + int M_Z_MAX; + + int OUTPUTMODE; + int PRINT_ANALOGS; + int PRINT_EULER; + int PRINT_DCM; + int PRINT_SERIAL; + +}; \ No newline at end of file