Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of LSM303DLH by
LSM303DLH.h
00001 #include "mbed.h" 00002 #include "vector.h" 00003 00004 #include "LSM303DLH_RegisterDef.h" 00005 00006 #ifndef M_PI 00007 #define M_PI 3.14159265358979323846 00008 #endif 00009 00010 /** Tilt-compensated compass interface Library for the STMicro LSM303DLH 3-axis magnetometer, 3-axis acceleromter 00011 * 00012 * This file is subject to the terms and conditions of the GNU Lesser 00013 * General Public License v2.1. See the file LICENSE in the top level 00014 * directory for more details. 00015 * 00016 * 00017 * 00018 * Base on the @see doccumentation https://cdn-shop.adafruit.com/datasheets/LSM303DLHC.PDF 00019 * @code 00020 * #include "mbed.h" 00021 * #include "LSM303DLH.h" 00022 * 00023 * Serial debug(USBTX,USBRX); 00024 * LSM303DLH compass(p28, p27); 00025 * 00026 * int main() { 00027 * float hdg; 00028 * debug.format(8,Serial::None,1); 00029 * debug.baud(115200); 00030 * debug.printf("LSM303DLH Test\x0d\x0a"); 00031 * compass.setOffset(29.50, -0.50, 4.00); // example calibration 00032 * compass.setScale(1.00, 1.03, 1.21); // example calibration 00033 * while(1) { 00034 * hdg = compass.heading(); 00035 * debug.printf("Heading: %.2f\n", hdg); 00036 * wait(0.1); 00037 * } 00038 * } 00039 * @endcode 00040 * 00041 * @author Salco <JeSuisSalco@gmail.com> 00042 */ 00043 00044 /** enable for MSB @ lower address */ 00045 //#define LSM303_LITLE_ENDIAN 00046 00047 class LSM303DLH { 00048 public: 00049 /** Create a new interface for an LSM303DLH 00050 * 00051 * @param sda is the pin for the I2C SDA line 00052 * @param scl is the pin for the I2C SCL line 00053 */ 00054 LSM303DLH(PinName sda, PinName scl); 00055 /** Create a new interface for an LSM303DLH 00056 * 00057 * @param ptrI2C is a pointer from existing I2C 00058 */ 00059 LSM303DLH(I2C* ptrI2C); 00060 /** Destructor of the class 00061 */ 00062 ~LSM303DLH(); 00063 /** sets the x, y, and z offset corrections for hard iron calibration 00064 * 00065 * Calibration details here: 00066 * http://mbed.org/users/shimniok/notebook/quick-and-dirty-3d-compass-calibration/ 00067 * 00068 * If you gather raw magnetometer data and find, for example, x is offset 00069 * by hard iron by -20 then pass +20 to this member function to correct 00070 * for hard iron. 00071 * 00072 * @param x is the offset correction for the x axis 00073 * @param y is the offset correction for the y axis 00074 * @param z is the offset correction for the z axis 00075 */ 00076 void setOffset(float x, float y, float z); 00077 00078 /** sets the scale factor for the x, y, and z axes 00079 * 00080 * Calibratio details here: 00081 * http://mbed.org/users/shimniok/notebook/quick-and-dirty-3d-compass-calibration/ 00082 * 00083 * Sensitivity of the three axes is never perfectly identical and this 00084 * function can help to correct differences in sensitivity. You're 00085 * supplying a multipler such that x, y and z will be normalized to the 00086 * same max/min values 00087 */ 00088 void setScale(float x, float y, float z); 00089 00090 /** read the raw accelerometer and compass values 00091 * 00092 * @param a is the accelerometer 3d vector, written by the function 00093 * @param m is the magnetometer 3d vector, written by the function 00094 */ 00095 bool read(vector &a, vector &m); 00096 /** read the raw accelerometer values 00097 * 00098 * @param a is the accelerometer 3d vector, written by the function 00099 */ 00100 bool read_acc_raw(vector *a); 00101 /** read the raw compass values 00102 * 00103 * @param m is the magnetometer 3d vector, written by the function 00104 */ 00105 bool read_mag_raw(vector *m); 00106 00107 /** returns the magnetic heading with respect to the y axis 00108 * 00109 */ 00110 float heading(void); 00111 00112 /** returns the heading with respect to the specified vector 00113 * 00114 */ 00115 float heading(vector from); 00116 00117 /** sets the I2C bus frequency 00118 * 00119 * @param frequency is the I2C bus/clock frequency, either standard (100000) or fast (400000) 00120 */ 00121 void frequency(int hz); 00122 00123 private: 00124 enum DEV_ADDRS { 00125 /* --- Mag --- */ 00126 addr_mag = 0x3c, 00127 /* --- Acc --- */ 00128 addr_acc = 0x32,//0x30; 00129 }; 00130 00131 enum REG_ADDRS { 00132 /* --- Mag --- */ 00133 CRA_REG_M = 0x00, 00134 CRB_REG_M = 0x01, 00135 MR_REG_M = 0x02, 00136 OUT_X_M = 0x03, 00137 OUT_Y_M = 0x05, 00138 OUT_Z_M = 0x07, 00139 SR_REG_M = 0x09, 00140 /* --- Acc --- */ 00141 CTRL_REG1_A = 0x20, 00142 CTRL_REG4_A = 0x23, 00143 STATUS_REG_A= 0x27, 00144 OUT_X_A = 0x28, 00145 OUT_Y_A = 0x2A, 00146 OUT_Z_A = 0x2C, 00147 }; 00148 00149 I2C* m_ptr_I2C;//_compass; 00150 float _offset_x; 00151 float _offset_y; 00152 float _offset_z; 00153 float _scale_x; 00154 float _scale_y; 00155 float _scale_z; 00156 long _filt_ax; 00157 long _filt_ay; 00158 long _filt_az; 00159 int8_t m_FS; 00160 int8_t m_GN; 00161 bool m_have_createdI2C; 00162 void init(void) ; 00163 00164 bool write_reg(int addr_i2c,int addr_reg, uint8_t v); 00165 bool write_reg(int addr_i2c,int addr_reg, char v); 00166 00167 bool read_reg(int addr_i2c,int addr_reg, uint8_t *v); 00168 bool read_reg(int addr_i2c,int addr_reg, char *v); 00169 00170 bool read_reg_short(int addr_i2c,int addr_reg, short *v); 00171 bool read_reg_short(DEV_ADDRS addr_i2c,REG_ADDRS addr_reg, OUT_XYZ_t *dataRead); 00172 00173 int8_t get_FullScall_selection(void); 00174 float get_acc_value_in_g(OUT_XYZ_t* dataOut); 00175 };
Generated on Fri Jul 15 2022 14:50:37 by
1.7.2
