KL46 Accelerometer + Magnetometer, with 3-axis calibration. Readout through OpenSDA CDC.
Dependencies: MAG3110 MMA8451Q USBDevice mbed
Diff: magnetic.h
- Revision:
- 0:c569d820861b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/magnetic.h Thu Apr 10 07:48:46 2014 +0000 @@ -0,0 +1,63 @@ +// Source: eCompass v3 + +#include "mbed.h" + +#ifndef _MAGNETIC_H_ +#define _MAGNETIC_H_ + +typedef int16_t int16; +typedef uint16_t uint16; +typedef int32_t int32; +typedef uint32_t uint32; + +#define MAGBUFFSIZE (216) // magnetic buffer size: 6 implies 6^3 = 216 entries +#define FINVMATRIXSCALING (50.0F) // inverse of FMATRIXSCALING +#define FUTPERCOUNT (0.1F) // MAG3110 and FXOS8700 provide 0.1uT per count resolution +#define FMATRIXSCALING (0.02F) // approx normalizes geomagnetic field 50uT +#define MAXMATINV 6 // maximum size supported in matrix inverse function + +// 3d arrays, dude... + +struct MagneticBuffer { + int16 iBx[MAGBUFFSIZE]/*[MAGBUFFSIZE][MAGBUFFSIZE]*/; // array of x magnetic fields + int16 iBy[MAGBUFFSIZE]/*[MAGBUFFSIZE][MAGBUFFSIZE]*/; // array of y magnetic fields + int16 iBz[MAGBUFFSIZE]/*[MAGBUFFSIZE][MAGBUFFSIZE]*/; // array of z magnetic fields + //int32 index[MAGBUFFSIZE][MAGBUFFSIZE][MAGBUFFSIZE]; // array of time indices + //int32 iMagBufferCount; // number of magnetometer readings +}; + +// magnetic calibration structure +struct MagCalibration +{ + float fVx; // x component of computed hard iron offset + float fVy; // y component of computed hard iron offset + float fVz; // z component of computed hard iron offset + float fB; // computed geomagnetic field magnitude in uT + float fFitErrorpc; // computed fit error % + float ftrVx; // trial value of x component of hard iron offset + float ftrVy; // trial value of y component of hard iron offset + float ftrVz; // trial value of z component of hard iron offset + float ftrB; // trial value of geomagnetic field magnitude in uT + float ftrFitErrorpc; // trial value of fit error % + int32 iValidMagCal; // valid magnetic calibration flag + float xfinvW[3][3]; // estimated inverse soft iron matrix size + float *finvW[3]; + float xfA[3][3]; // estimated ellipsoid matrix A + float *fA[3]; + float xinvA[3][3]; // inverse of ellipsoid matrix A + float *finvA[3]; + float xftrinvW[3][3]; // trial computed inverse soft iron matrix size + float *ftrinvW[3]; +}; + +void fUpdateCalibration4INV(struct MagCalibration *pthisMagCal, + struct MagneticBuffer *pthisMagneticBuffer, + float **ftmpA4x4, float **ftmpB4x4, float **ftmpA4x1, + float **ftmpB4x1, int32 **icolind, int32 **irowind, int32 **ipivot); + +void ResetMagCalibration(struct MagCalibration *pthisMagCal/*, struct MagneticBuffer *pthisMagneticBuffer*/); + +void magUpdateCalibration(struct MagCalibration *pthisMagCal, + struct MagneticBuffer *pthisMagneticBuffer); + +#endif \ No newline at end of file