DCM Code ported from Arduino for FRDM-KL25Z

Dependents:   minimu_data_capture minimu_data_capture

Fork of DCM_AHRS by Kris Reynolds

Committer:
ogarai
Date:
Tue Jan 20 02:04:07 2015 +0000
Revision:
2:85214374e094
Parent:
1:3272ece36ce1
First Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
krmreynolds 0:dc35364e2291 1 #ifndef LSM303_h
krmreynolds 0:dc35364e2291 2 #define LSM303_h
krmreynolds 0:dc35364e2291 3
krmreynolds 0:dc35364e2291 4 #include "mbed.h"
krmreynolds 1:3272ece36ce1 5
krmreynolds 1:3272ece36ce1 6 // device types
krmreynolds 1:3272ece36ce1 7
krmreynolds 1:3272ece36ce1 8 #define LSM303DLH_DEVICE 0
krmreynolds 1:3272ece36ce1 9 #define LSM303DLM_DEVICE 1
krmreynolds 1:3272ece36ce1 10 #define LSM303DLHC_DEVICE 2
krmreynolds 1:3272ece36ce1 11 #define LSM303_DEVICE_AUTO 3
krmreynolds 1:3272ece36ce1 12
krmreynolds 1:3272ece36ce1 13 // SA0_A states
krmreynolds 1:3272ece36ce1 14
krmreynolds 1:3272ece36ce1 15 #define LSM303_SA0_A_LOW 0
krmreynolds 1:3272ece36ce1 16 #define LSM303_SA0_A_HIGH 1
krmreynolds 1:3272ece36ce1 17 #define LSM303_SA0_A_AUTO 2
krmreynolds 1:3272ece36ce1 18
krmreynolds 1:3272ece36ce1 19 // register addresses
krmreynolds 1:3272ece36ce1 20
krmreynolds 1:3272ece36ce1 21 #define LSM303_CTRL_REG1_A 0x20
krmreynolds 1:3272ece36ce1 22 #define LSM303_CTRL_REG2_A 0x21
krmreynolds 1:3272ece36ce1 23 #define LSM303_CTRL_REG3_A 0x22
krmreynolds 1:3272ece36ce1 24 #define LSM303_CTRL_REG4_A 0x23
krmreynolds 1:3272ece36ce1 25 #define LSM303_CTRL_REG5_A 0x24
krmreynolds 1:3272ece36ce1 26 #define LSM303_CTRL_REG6_A 0x25 // DLHC only
krmreynolds 1:3272ece36ce1 27 #define LSM303_HP_FILTER_RESET_A 0x25 // DLH, DLM only
krmreynolds 1:3272ece36ce1 28 #define LSM303_REFERENCE_A 0x26
krmreynolds 1:3272ece36ce1 29 #define LSM303_STATUS_REG_A 0x27
krmreynolds 1:3272ece36ce1 30
krmreynolds 1:3272ece36ce1 31 #define LSM303_OUT_X_L_A 0x28
krmreynolds 1:3272ece36ce1 32 #define LSM303_OUT_X_H_A 0x29
krmreynolds 1:3272ece36ce1 33 #define LSM303_OUT_Y_L_A 0x2A
krmreynolds 1:3272ece36ce1 34 #define LSM303_OUT_Y_H_A 0x2B
krmreynolds 1:3272ece36ce1 35 #define LSM303_OUT_Z_L_A 0x2C
krmreynolds 1:3272ece36ce1 36 #define LSM303_OUT_Z_H_A 0x2D
krmreynolds 1:3272ece36ce1 37
krmreynolds 1:3272ece36ce1 38 #define LSM303_FIFO_CTRL_REG_A 0x2E // DLHC only
krmreynolds 1:3272ece36ce1 39 #define LSM303_FIFO_SRC_REG_A 0x2F // DLHC only
krmreynolds 1:3272ece36ce1 40
krmreynolds 1:3272ece36ce1 41 #define LSM303_INT1_CFG_A 0x30
krmreynolds 1:3272ece36ce1 42 #define LSM303_INT1_SRC_A 0x31
krmreynolds 1:3272ece36ce1 43 #define LSM303_INT1_THS_A 0x32
krmreynolds 1:3272ece36ce1 44 #define LSM303_INT1_DURATION_A 0x33
krmreynolds 1:3272ece36ce1 45 #define LSM303_INT2_CFG_A 0x34
krmreynolds 1:3272ece36ce1 46 #define LSM303_INT2_SRC_A 0x35
krmreynolds 1:3272ece36ce1 47 #define LSM303_INT2_THS_A 0x36
krmreynolds 1:3272ece36ce1 48 #define LSM303_INT2_DURATION_A 0x37
krmreynolds 1:3272ece36ce1 49
krmreynolds 1:3272ece36ce1 50 #define LSM303_CLICK_CFG_A 0x38 // DLHC only
krmreynolds 1:3272ece36ce1 51 #define LSM303_CLICK_SRC_A 0x39 // DLHC only
krmreynolds 1:3272ece36ce1 52 #define LSM303_CLICK_THS_A 0x3A // DLHC only
krmreynolds 1:3272ece36ce1 53 #define LSM303_TIME_LIMIT_A 0x3B // DLHC only
krmreynolds 1:3272ece36ce1 54 #define LSM303_TIME_LATENCY_A 0x3C // DLHC only
krmreynolds 1:3272ece36ce1 55 #define LSM303_TIME_WINDOW_A 0x3D // DLHC only
krmreynolds 1:3272ece36ce1 56
krmreynolds 1:3272ece36ce1 57 #define LSM303_CRA_REG_M 0x00
krmreynolds 1:3272ece36ce1 58 #define LSM303_CRB_REG_M 0x01
krmreynolds 1:3272ece36ce1 59 #define LSM303_MR_REG_M 0x02
krmreynolds 1:3272ece36ce1 60
krmreynolds 1:3272ece36ce1 61 #define LSM303_OUT_X_H_M 0x03
krmreynolds 1:3272ece36ce1 62 #define LSM303_OUT_X_L_M 0x04
krmreynolds 1:3272ece36ce1 63 #define LSM303_OUT_Y_H_M -1 // The addresses of the Y and Z magnetometer output registers
krmreynolds 1:3272ece36ce1 64 #define LSM303_OUT_Y_L_M -2 // are reversed on the DLM and DLHC relative to the DLH.
krmreynolds 1:3272ece36ce1 65 #define LSM303_OUT_Z_H_M -3 // These four defines have dummy values so the library can
krmreynolds 1:3272ece36ce1 66 #define LSM303_OUT_Z_L_M -4 // determine the correct address based on the device type.
krmreynolds 1:3272ece36ce1 67
krmreynolds 1:3272ece36ce1 68 #define LSM303_SR_REG_M 0x09
krmreynolds 1:3272ece36ce1 69 #define LSM303_IRA_REG_M 0x0A
krmreynolds 1:3272ece36ce1 70 #define LSM303_IRB_REG_M 0x0B
krmreynolds 1:3272ece36ce1 71 #define LSM303_IRC_REG_M 0x0C
krmreynolds 1:3272ece36ce1 72
krmreynolds 1:3272ece36ce1 73 #define LSM303_WHO_AM_I_M 0x0F // DLM only
krmreynolds 1:3272ece36ce1 74
krmreynolds 1:3272ece36ce1 75 #define LSM303_TEMP_OUT_H_M 0x31 // DLHC only
krmreynolds 1:3272ece36ce1 76 #define LSM303_TEMP_OUT_L_M 0x32 // DLHC only
krmreynolds 1:3272ece36ce1 77
krmreynolds 1:3272ece36ce1 78 #define LSM303DLH_OUT_Y_H_M 0x05
krmreynolds 1:3272ece36ce1 79 #define LSM303DLH_OUT_Y_L_M 0x06
krmreynolds 1:3272ece36ce1 80 #define LSM303DLH_OUT_Z_H_M 0x07
krmreynolds 1:3272ece36ce1 81 #define LSM303DLH_OUT_Z_L_M 0x08
krmreynolds 1:3272ece36ce1 82
krmreynolds 1:3272ece36ce1 83 #define LSM303DLM_OUT_Z_H_M 0x05
krmreynolds 1:3272ece36ce1 84 #define LSM303DLM_OUT_Z_L_M 0x06
krmreynolds 1:3272ece36ce1 85 #define LSM303DLM_OUT_Y_H_M 0x07
krmreynolds 1:3272ece36ce1 86 #define LSM303DLM_OUT_Y_L_M 0x08
krmreynolds 1:3272ece36ce1 87
krmreynolds 1:3272ece36ce1 88 #define LSM303DLHC_OUT_Z_H_M 0x05
krmreynolds 1:3272ece36ce1 89 #define LSM303DLHC_OUT_Z_L_M 0x06
krmreynolds 1:3272ece36ce1 90 #define LSM303DLHC_OUT_Y_H_M 0x07
krmreynolds 1:3272ece36ce1 91 #define LSM303DLHC_OUT_Y_L_M 0x08
krmreynolds 1:3272ece36ce1 92
krmreynolds 1:3272ece36ce1 93 #define MAG_ADDRESS 0x3C
krmreynolds 1:3272ece36ce1 94 #define ACC_ADDRESS_SA0_A_LOW 0x30
krmreynolds 1:3272ece36ce1 95 #define ACC_ADDRESS_SA0_A_HIGH 0x32
krmreynolds 1:3272ece36ce1 96
krmreynolds 1:3272ece36ce1 97 #define M_PI 3.14159265
krmreynolds 1:3272ece36ce1 98
krmreynolds 1:3272ece36ce1 99 typedef unsigned char byte;
krmreynolds 0:dc35364e2291 100
krmreynolds 0:dc35364e2291 101 class LSM303 {
krmreynolds 0:dc35364e2291 102 public:
krmreynolds 1:3272ece36ce1 103 typedef struct Plane {
krmreynolds 1:3272ece36ce1 104 float x, y, z;
krmreynolds 1:3272ece36ce1 105 } Plane;
krmreynolds 1:3272ece36ce1 106
krmreynolds 1:3272ece36ce1 107 I2C i2c;
krmreynolds 1:3272ece36ce1 108
krmreynolds 1:3272ece36ce1 109 Plane a; // accelerometer readings
krmreynolds 1:3272ece36ce1 110 Plane m; // magnetometer readings
krmreynolds 1:3272ece36ce1 111 Plane m_max; // maximum magnetometer values, used for calibration
krmreynolds 1:3272ece36ce1 112 Plane m_min; // minimum magnetometer values, used for calibration
krmreynolds 0:dc35364e2291 113
krmreynolds 1:3272ece36ce1 114 LSM303(PinName, PinName);
krmreynolds 0:dc35364e2291 115
krmreynolds 1:3272ece36ce1 116 void init(byte device = LSM303_DEVICE_AUTO, byte sa0_a = LSM303_SA0_A_AUTO);
krmreynolds 0:dc35364e2291 117
krmreynolds 1:3272ece36ce1 118 void enableDefault(void);
krmreynolds 0:dc35364e2291 119
krmreynolds 1:3272ece36ce1 120 void writeAccReg(byte reg, byte value);
krmreynolds 1:3272ece36ce1 121 int readAccReg(byte reg);
krmreynolds 1:3272ece36ce1 122 void writeMagReg(byte reg, byte value);
krmreynolds 1:3272ece36ce1 123 int readMagReg(int reg);
krmreynolds 0:dc35364e2291 124
krmreynolds 1:3272ece36ce1 125 void readAcc(void);
krmreynolds 1:3272ece36ce1 126 void readMag(void);
krmreynolds 1:3272ece36ce1 127 void read(void);
krmreynolds 1:3272ece36ce1 128
krmreynolds 1:3272ece36ce1 129 int heading(void);
krmreynolds 1:3272ece36ce1 130 int heading(Plane from);
krmreynolds 1:3272ece36ce1 131
krmreynolds 1:3272ece36ce1 132 // Plane functions
krmreynolds 1:3272ece36ce1 133 static void vector_cross(const Plane *a, const Plane *b, Plane *out);
krmreynolds 1:3272ece36ce1 134 static float vector_dot(const Plane *a,const Plane *b);
krmreynolds 1:3272ece36ce1 135 static void vector_normalize(Plane *a);
krmreynolds 0:dc35364e2291 136
krmreynolds 0:dc35364e2291 137 private:
krmreynolds 1:3272ece36ce1 138 byte _device; // chip type (DLH, DLM, or DLHC)
krmreynolds 1:3272ece36ce1 139 byte acc_address;
krmreynolds 0:dc35364e2291 140
krmreynolds 1:3272ece36ce1 141 byte detectSA0_A(void);
krmreynolds 0:dc35364e2291 142 };
krmreynolds 0:dc35364e2291 143
krmreynolds 1:3272ece36ce1 144 #endif