for interfacing the sparkfun boards
Dependencies: ADXL345_I2C HMC5883L IMUfilter ITG3200_HelloWorld mbed
ITG3200HL.cpp
- Committer:
- sandwich
- Date:
- 2014-04-29
- Revision:
- 0:441caaf895d8
File content as of revision 0:441caaf895d8:
#include "ITG3200HL.h" ITG3200HL::~ITG3200HL() { delete[] output; delete gyro; } void ITG3200HL::init(int calibsampls, int readsampls, float samplrate) { gyro=new ITG3200(p28,p27); gyro->setLpBandwidth(LPFBW_42HZ); output=new double[3]; calibrationsamples=calibsampls; samplerate=samplrate; readsamples=readsampls; output[0]=0; output[1]=0; output[2]=0; } void ITG3200HL::calibrate() { double a_xAccumulator = 0; double a_yAccumulator = 0; double a_zAccumulator = 0; //Take a number of readings and average them //to calculate the zero g offset. for (int i = 0; i < calibrationsamples; i++) { int16_t readings[3]= {gyro->getGyroX(), gyro->getGyroY(), gyro->getGyroZ()}; a_xAccumulator += (int16_t) readings[0]; a_yAccumulator += (int16_t) readings[1]; a_zAccumulator += (int16_t) readings[2]; wait(samplerate); } a_xAccumulator /= calibrationsamples; a_yAccumulator /= calibrationsamples; a_zAccumulator /= calibrationsamples; //At 4mg/LSB, 250 LSBs is 1g. xBias = a_xAccumulator; yBias = a_yAccumulator; zBias=a_zAccumulator; //zBias = (a_zAccumulator - 250); a_xAccumulator = 0; a_yAccumulator = 0; a_zAccumulator = 0; } double* ITG3200HL::sample() { double a_xAccumulator = 0; double a_yAccumulator = 0; double a_zAccumulator = 0; for (int i=0; i<readsamples; ++i) { int16_t readings[3]= {gyro->getGyroX(), gyro->getGyroY(), gyro->getGyroZ()}; a_xAccumulator += (int16_t) readings[0]; a_yAccumulator += (int16_t) readings[1]; a_zAccumulator += (int16_t) readings[2]; } //Average the samples, remove the bias, and calculate the rotation //in rad/s output[0] = ((a_xAccumulator / readsamples) - xBias) * GYRO_GAIN; output[1] = ((a_yAccumulator / readsamples) - yBias) * GYRO_GAIN; output[2] = ((a_zAccumulator / readsamples) - zBias) * GYRO_GAIN; return output; }