Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
7 years, 5 months ago.
Angle calculation using L3G4200D Gyroscope sensor
I have an L3G4200D gyroscope sensor communicate to LPC1768 through I2C. I have the output which gives me the angular rate of the axis but I don't know how to convert the angular rate to angle. I know it can be achieve by using integration. Can anyone help me with the code?
Convert
#include "mbed.h"
// Pin 9 is SDA & Pin 10 is SCL //
I2C i2c(p9, p10);
Serial pc(USBTX, USBRX);
Timer t;
// SAD 1101 00xb, 1101 0010 //
// x = 1 when SDO is connected to Vs, x = 0 when SDO is connected to Gnd //
// b = 1 when read, b = 0 when write //
const int Addr = 0xD2;
// Register Address 1000 1111. MSB = 1 means read and MSB = 0 means write//
const int regAddr = 0x8F;
// Register Address of CTRL_REG1, 0x20 //
const int CTRL_REG1 = 0x20;
// const int CTRL_REG1 = 0xA0;
// Reigister Address of CTRL_REG4, 0x23 //
const int CTRL_REG4 = 0x23;
// Register Address of Z-axis, 0x2C & 0x2D //
const int OUT_Z_H = 0xAD; // High Register //
const int OUT_Z_L = 0xAC; // Low Register //
// Pointer to read data //
char data[1] = {0};
// char data_ctrl[1] = {0};
char data_H[1] = {0};
char data_L[1] = {0};
float angle = 0.00000f;
float dt = 0.00125;
int main() {
// Maximum clock frequency is 400KHz //
i2c.frequency(400000);
// Master send slave address and register address //
// Master read data from slave //
// Default is 1101 0011 //
char WHO_AM_I[1] = {regAddr};
i2c.write(Addr, WHO_AM_I, 1);
i2c.read(Addr, data, 1);
pc.printf("SAD is 0x%X\n", data[0]);
//Configuring CTRL_REG1 //
char ctrl_reg1[2] = {CTRL_REG1,0xFF};
i2c.write(Addr, ctrl_reg1, 2);
// 500dps, sensitivity is 17.50mdps //
char ctrl_reg4[2] = {CTRL_REG4, 0x20};
i2c.write(Addr, ctrl_reg4, 2);
while(1) {
t.reset();
t.start();
// Reading gyro's z-axis register //
char zAxis_H[1] = {OUT_Z_H};
i2c.write(Addr, zAxis_H, 1);
i2c.read(Addr, data_H, 1);
char zAxis_L[1] = {OUT_Z_L};
i2c.write(Addr, zAxis_L, 1);
i2c.read(Addr, data_L, 1);
t.stop();
int16_t combineValue = (((int)data_H[0]) << 8 | data_L[0]);
int dAngle = combineValue * 0.0175;
angle += dAngle*t.read();
pc.printf("The angle is %.5f degrees, angular rate is %d dps\n", angle, dAngle);
}
}