Colin Stearns
/
qcControl
QC Control software
Fork of dgps by
adapt/compass.h@17:323fc40376d5, 2014-04-03 (annotated)
- Committer:
- krobertson
- Date:
- Thu Apr 03 17:18:58 2014 +0000
- Revision:
- 17:323fc40376d5
added compass to project
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
krobertson | 17:323fc40376d5 | 1 | /** |
krobertson | 17:323fc40376d5 | 2 | * \brief Adaptor for the LSM303 integrated compass and accelerometer |
krobertson | 17:323fc40376d5 | 3 | **/ |
krobertson | 17:323fc40376d5 | 4 | |
krobertson | 17:323fc40376d5 | 5 | #ifndef _COMPASS_H_ |
krobertson | 17:323fc40376d5 | 6 | #define _COMPASS_H_ |
krobertson | 17:323fc40376d5 | 7 | |
krobertson | 17:323fc40376d5 | 8 | #include "mbed.h" |
krobertson | 17:323fc40376d5 | 9 | #include <SPI.h> |
krobertson | 17:323fc40376d5 | 10 | #include <stdint.h> |
krobertson | 17:323fc40376d5 | 11 | |
krobertson | 17:323fc40376d5 | 12 | typedef unsigned char byte; |
krobertson | 17:323fc40376d5 | 13 | |
krobertson | 17:323fc40376d5 | 14 | class Compass{ |
krobertson | 17:323fc40376d5 | 15 | public: |
krobertson | 17:323fc40376d5 | 16 | |
krobertson | 17:323fc40376d5 | 17 | template <typename T> struct vector{ |
krobertson | 17:323fc40376d5 | 18 | T x, y, z; |
krobertson | 17:323fc40376d5 | 19 | }; |
krobertson | 17:323fc40376d5 | 20 | |
krobertson | 17:323fc40376d5 | 21 | /** |
krobertson | 17:323fc40376d5 | 22 | * \brief LSM303 devices |
krobertson | 17:323fc40376d5 | 23 | **/ |
krobertson | 17:323fc40376d5 | 24 | enum deviceType { device_DLH, device_DLM, device_DLHC, device_D, device_auto }; |
krobertson | 17:323fc40376d5 | 25 | |
krobertson | 17:323fc40376d5 | 26 | /** |
krobertson | 17:323fc40376d5 | 27 | * \brief register addresses |
krobertson | 17:323fc40376d5 | 28 | **/ |
krobertson | 17:323fc40376d5 | 29 | enum regAddr{ |
krobertson | 17:323fc40376d5 | 30 | TEMP_OUT_L = 0x05, // D |
krobertson | 17:323fc40376d5 | 31 | TEMP_OUT_H = 0x06, // D |
krobertson | 17:323fc40376d5 | 32 | |
krobertson | 17:323fc40376d5 | 33 | STATUS_M = 0x07, // D |
krobertson | 17:323fc40376d5 | 34 | |
krobertson | 17:323fc40376d5 | 35 | INT_CTRL_M = 0x12, // D |
krobertson | 17:323fc40376d5 | 36 | INT_SRC_M = 0x13, // D |
krobertson | 17:323fc40376d5 | 37 | INT_THS_L_M = 0x14, // D |
krobertson | 17:323fc40376d5 | 38 | INT_THS_H_M = 0x15, // D |
krobertson | 17:323fc40376d5 | 39 | |
krobertson | 17:323fc40376d5 | 40 | OFFSET_X_L_M = 0x16, // D |
krobertson | 17:323fc40376d5 | 41 | OFFSET_X_H_M = 0x17, // D |
krobertson | 17:323fc40376d5 | 42 | OFFSET_Y_L_M = 0x18, // D |
krobertson | 17:323fc40376d5 | 43 | OFFSET_Y_H_M = 0x19, // D |
krobertson | 17:323fc40376d5 | 44 | OFFSET_Z_L_M = 0x1A, // D |
krobertson | 17:323fc40376d5 | 45 | OFFSET_Z_H_M = 0x1B, // D |
krobertson | 17:323fc40376d5 | 46 | REFERENCE_X = 0x1C, // D |
krobertson | 17:323fc40376d5 | 47 | REFERENCE_Y = 0x1D, // D |
krobertson | 17:323fc40376d5 | 48 | REFERENCE_Z = 0x1E, // D |
krobertson | 17:323fc40376d5 | 49 | |
krobertson | 17:323fc40376d5 | 50 | CTRL0 = 0x1F, // D |
krobertson | 17:323fc40376d5 | 51 | CTRL1 = 0x20, // D |
krobertson | 17:323fc40376d5 | 52 | CTRL_REG1_A = 0x20, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 53 | CTRL2 = 0x21, // D |
krobertson | 17:323fc40376d5 | 54 | CTRL_REG2_A = 0x21, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 55 | CTRL3 = 0x22, // D |
krobertson | 17:323fc40376d5 | 56 | CTRL_REG3_A = 0x22, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 57 | CTRL4 = 0x23, // D |
krobertson | 17:323fc40376d5 | 58 | CTRL_REG4_A = 0x23, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 59 | CTRL5 = 0x24, // D |
krobertson | 17:323fc40376d5 | 60 | CTRL_REG5_A = 0x24, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 61 | CTRL6 = 0x25, // D |
krobertson | 17:323fc40376d5 | 62 | CTRL_REG6_A = 0x25, // DLHC |
krobertson | 17:323fc40376d5 | 63 | HP_FILTER_RESET_A = 0x25, // DLH, DLM |
krobertson | 17:323fc40376d5 | 64 | CTRL7 = 0x26, // D |
krobertson | 17:323fc40376d5 | 65 | REFERENCE_A = 0x26, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 66 | STATUS_A = 0x27, // D |
krobertson | 17:323fc40376d5 | 67 | STATUS_REG_A = 0x27, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 68 | |
krobertson | 17:323fc40376d5 | 69 | OUT_X_L_A = 0x28, |
krobertson | 17:323fc40376d5 | 70 | OUT_X_H_A = 0x29, |
krobertson | 17:323fc40376d5 | 71 | OUT_Y_L_A = 0x2A, |
krobertson | 17:323fc40376d5 | 72 | OUT_Y_H_A = 0x2B, |
krobertson | 17:323fc40376d5 | 73 | OUT_Z_L_A = 0x2C, |
krobertson | 17:323fc40376d5 | 74 | OUT_Z_H_A = 0x2D, |
krobertson | 17:323fc40376d5 | 75 | |
krobertson | 17:323fc40376d5 | 76 | FIFO_CTRL = 0x2E, // D |
krobertson | 17:323fc40376d5 | 77 | FIFO_CTRL_REG_A = 0x2E, // DLHC |
krobertson | 17:323fc40376d5 | 78 | FIFO_SRC = 0x2F, // D |
krobertson | 17:323fc40376d5 | 79 | FIFO_SRC_REG_A = 0x2F, // DLHC |
krobertson | 17:323fc40376d5 | 80 | |
krobertson | 17:323fc40376d5 | 81 | IG_CFG1 = 0x30, // D |
krobertson | 17:323fc40376d5 | 82 | INT1_CFG_A = 0x30, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 83 | IG_SRC1 = 0x31, // D |
krobertson | 17:323fc40376d5 | 84 | INT1_SRC_A = 0x31, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 85 | IG_THS1 = 0x32, // D |
krobertson | 17:323fc40376d5 | 86 | INT1_THS_A = 0x32, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 87 | IG_DUR1 = 0x33, // D |
krobertson | 17:323fc40376d5 | 88 | INT1_DURATION_A = 0x33, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 89 | IG_CFG2 = 0x34, // D |
krobertson | 17:323fc40376d5 | 90 | INT2_CFG_A = 0x34, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 91 | IG_SRC2 = 0x35, // D |
krobertson | 17:323fc40376d5 | 92 | INT2_SRC_A = 0x35, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 93 | IG_THS2 = 0x36, // D |
krobertson | 17:323fc40376d5 | 94 | INT2_THS_A = 0x36, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 95 | IG_DUR2 = 0x37, // D |
krobertson | 17:323fc40376d5 | 96 | INT2_DURATION_A = 0x37, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 97 | |
krobertson | 17:323fc40376d5 | 98 | CLICK_CFG = 0x38, // D |
krobertson | 17:323fc40376d5 | 99 | CLICK_CFG_A = 0x38, // DLHC |
krobertson | 17:323fc40376d5 | 100 | CLICK_SRC = 0x39, // D |
krobertson | 17:323fc40376d5 | 101 | CLICK_SRC_A = 0x39, // DLHC |
krobertson | 17:323fc40376d5 | 102 | CLICK_THS = 0x3A, // D |
krobertson | 17:323fc40376d5 | 103 | CLICK_THS_A = 0x3A, // DLHC |
krobertson | 17:323fc40376d5 | 104 | TIME_LIMIT = 0x3B, // D |
krobertson | 17:323fc40376d5 | 105 | TIME_LIMIT_A = 0x3B, // DLHC |
krobertson | 17:323fc40376d5 | 106 | TIME_LATENCY = 0x3C, // D |
krobertson | 17:323fc40376d5 | 107 | TIME_LATENCY_A = 0x3C, // DLHC |
krobertson | 17:323fc40376d5 | 108 | TIME_WINDOW = 0x3D, // D |
krobertson | 17:323fc40376d5 | 109 | TIME_WINDOW_A = 0x3D, // DLHC |
krobertson | 17:323fc40376d5 | 110 | |
krobertson | 17:323fc40376d5 | 111 | Act_THS = 0x3E, // D |
krobertson | 17:323fc40376d5 | 112 | Act_DUR = 0x3F, // D |
krobertson | 17:323fc40376d5 | 113 | |
krobertson | 17:323fc40376d5 | 114 | CRA_REG_M = 0x00, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 115 | CRB_REG_M = 0x01, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 116 | MR_REG_M = 0x02, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 117 | |
krobertson | 17:323fc40376d5 | 118 | SR_REG_M = 0x09, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 119 | IRA_REG_M = 0x0A, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 120 | IRB_REG_M = 0x0B, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 121 | IRC_REG_M = 0x0C, // DLH, DLM, DLHC |
krobertson | 17:323fc40376d5 | 122 | |
krobertson | 17:323fc40376d5 | 123 | WHO_AM_I_M = 0x0F, // DLM |
krobertson | 17:323fc40376d5 | 124 | WHO_AM_I = 0x0F, // D |
krobertson | 17:323fc40376d5 | 125 | |
krobertson | 17:323fc40376d5 | 126 | TEMP_OUT_H_M = 0x31, // DLHC |
krobertson | 17:323fc40376d5 | 127 | TEMP_OUT_L_M = 0x32, // DLHC |
krobertson | 17:323fc40376d5 | 128 | |
krobertson | 17:323fc40376d5 | 129 | |
krobertson | 17:323fc40376d5 | 130 | // dummy addresses for registers in different locations on different devices; |
krobertson | 17:323fc40376d5 | 131 | // the library translates these based on device type |
krobertson | 17:323fc40376d5 | 132 | // value with sign flipped is used as index into translated_regs array |
krobertson | 17:323fc40376d5 | 133 | |
krobertson | 17:323fc40376d5 | 134 | OUT_X_H_M = -1, |
krobertson | 17:323fc40376d5 | 135 | OUT_X_L_M = -2, |
krobertson | 17:323fc40376d5 | 136 | OUT_Y_H_M = -3, |
krobertson | 17:323fc40376d5 | 137 | OUT_Y_L_M = -4, |
krobertson | 17:323fc40376d5 | 138 | OUT_Z_H_M = -5, |
krobertson | 17:323fc40376d5 | 139 | OUT_Z_L_M = -6, |
krobertson | 17:323fc40376d5 | 140 | // update dummy_reg_count if registers are added here! |
krobertson | 17:323fc40376d5 | 141 | |
krobertson | 17:323fc40376d5 | 142 | // device-specific register addresses |
krobertson | 17:323fc40376d5 | 143 | DLH_OUT_X_H_M = 0x03, |
krobertson | 17:323fc40376d5 | 144 | DLH_OUT_X_L_M = 0x04, |
krobertson | 17:323fc40376d5 | 145 | DLH_OUT_Y_H_M = 0x05, |
krobertson | 17:323fc40376d5 | 146 | DLH_OUT_Y_L_M = 0x06, |
krobertson | 17:323fc40376d5 | 147 | DLH_OUT_Z_H_M = 0x07, |
krobertson | 17:323fc40376d5 | 148 | DLH_OUT_Z_L_M = 0x08, |
krobertson | 17:323fc40376d5 | 149 | |
krobertson | 17:323fc40376d5 | 150 | DLM_OUT_X_H_M = 0x03, |
krobertson | 17:323fc40376d5 | 151 | DLM_OUT_X_L_M = 0x04, |
krobertson | 17:323fc40376d5 | 152 | DLM_OUT_Z_H_M = 0x05, |
krobertson | 17:323fc40376d5 | 153 | DLM_OUT_Z_L_M = 0x06, |
krobertson | 17:323fc40376d5 | 154 | DLM_OUT_Y_H_M = 0x07, |
krobertson | 17:323fc40376d5 | 155 | DLM_OUT_Y_L_M = 0x08, |
krobertson | 17:323fc40376d5 | 156 | |
krobertson | 17:323fc40376d5 | 157 | DLHC_OUT_X_H_M = 0x03, |
krobertson | 17:323fc40376d5 | 158 | DLHC_OUT_X_L_M = 0x04, |
krobertson | 17:323fc40376d5 | 159 | DLHC_OUT_Z_H_M = 0x05, |
krobertson | 17:323fc40376d5 | 160 | DLHC_OUT_Z_L_M = 0x06, |
krobertson | 17:323fc40376d5 | 161 | DLHC_OUT_Y_H_M = 0x07, |
krobertson | 17:323fc40376d5 | 162 | DLHC_OUT_Y_L_M = 0x08, |
krobertson | 17:323fc40376d5 | 163 | |
krobertson | 17:323fc40376d5 | 164 | D_OUT_X_L_M = 0x08, |
krobertson | 17:323fc40376d5 | 165 | D_OUT_X_H_M = 0x09, |
krobertson | 17:323fc40376d5 | 166 | D_OUT_Y_L_M = 0x0A, |
krobertson | 17:323fc40376d5 | 167 | D_OUT_Y_H_M = 0x0B, |
krobertson | 17:323fc40376d5 | 168 | D_OUT_Z_L_M = 0x0C, |
krobertson | 17:323fc40376d5 | 169 | D_OUT_Z_H_M = 0x0D |
krobertson | 17:323fc40376d5 | 170 | }; |
krobertson | 17:323fc40376d5 | 171 | |
krobertson | 17:323fc40376d5 | 172 | /** |
krobertson | 17:323fc40376d5 | 173 | * \brief accelerometer readings |
krobertson | 17:323fc40376d5 | 174 | **/ |
krobertson | 17:323fc40376d5 | 175 | vector<int16_t> a; |
krobertson | 17:323fc40376d5 | 176 | /** |
krobertson | 17:323fc40376d5 | 177 | * \brief magnetometer readings |
krobertson | 17:323fc40376d5 | 178 | **/ |
krobertson | 17:323fc40376d5 | 179 | vector<int16_t> m; |
krobertson | 17:323fc40376d5 | 180 | /** |
krobertson | 17:323fc40376d5 | 181 | * \brief maximum magnetometer values (calibration values) |
krobertson | 17:323fc40376d5 | 182 | **/ |
krobertson | 17:323fc40376d5 | 183 | vector<int16_t> m_max; |
krobertson | 17:323fc40376d5 | 184 | /** |
krobertson | 17:323fc40376d5 | 185 | * \brief minimum magnetometer values (calibration values) |
krobertson | 17:323fc40376d5 | 186 | **/ |
krobertson | 17:323fc40376d5 | 187 | vector<int16_t> m_min; |
krobertson | 17:323fc40376d5 | 188 | |
krobertson | 17:323fc40376d5 | 189 | /** |
krobertson | 17:323fc40376d5 | 190 | * \brief Compass constructor |
krobertson | 17:323fc40376d5 | 191 | **/ |
krobertson | 17:323fc40376d5 | 192 | Compass(void); |
krobertson | 17:323fc40376d5 | 193 | |
krobertson | 17:323fc40376d5 | 194 | /** |
krobertson | 17:323fc40376d5 | 195 | * \brief setup SPI, determine device type, and setup register addresses for device |
krobertson | 17:323fc40376d5 | 196 | **/ |
krobertson | 17:323fc40376d5 | 197 | bool init(deviceType device = device_auto); |
krobertson | 17:323fc40376d5 | 198 | |
krobertson | 17:323fc40376d5 | 199 | /** |
krobertson | 17:323fc40376d5 | 200 | * \brief get the device type |
krobertson | 17:323fc40376d5 | 201 | **/ |
krobertson | 17:323fc40376d5 | 202 | int getDeviceType(void) { return _device; } |
krobertson | 17:323fc40376d5 | 203 | |
krobertson | 17:323fc40376d5 | 204 | /** |
krobertson | 17:323fc40376d5 | 205 | * \brief enable default settings (writes default values to control registers) |
krobertson | 17:323fc40376d5 | 206 | **/ |
krobertson | 17:323fc40376d5 | 207 | void enableDefault(void); |
krobertson | 17:323fc40376d5 | 208 | |
krobertson | 17:323fc40376d5 | 209 | /** |
krobertson | 17:323fc40376d5 | 210 | * \brief write to an accelerometer register |
krobertson | 17:323fc40376d5 | 211 | **/ |
krobertson | 17:323fc40376d5 | 212 | void writeAccReg(regAddr reg, int value); |
krobertson | 17:323fc40376d5 | 213 | int readAccReg(regAddr reg); |
krobertson | 17:323fc40376d5 | 214 | void writeMagReg(regAddr reg, int value); |
krobertson | 17:323fc40376d5 | 215 | int readMagReg(regAddr reg); |
krobertson | 17:323fc40376d5 | 216 | |
krobertson | 17:323fc40376d5 | 217 | void writeReg(regAddr reg, int value); |
krobertson | 17:323fc40376d5 | 218 | int readReg(regAddr reg); |
krobertson | 17:323fc40376d5 | 219 | |
krobertson | 17:323fc40376d5 | 220 | void readAcc(void); |
krobertson | 17:323fc40376d5 | 221 | void readMag(void); |
krobertson | 17:323fc40376d5 | 222 | void read(void); |
krobertson | 17:323fc40376d5 | 223 | |
krobertson | 17:323fc40376d5 | 224 | float get_heading(void); |
krobertson | 17:323fc40376d5 | 225 | template <typename T> float get_heading(vector<T> from); |
krobertson | 17:323fc40376d5 | 226 | |
krobertson | 17:323fc40376d5 | 227 | // vector functions |
krobertson | 17:323fc40376d5 | 228 | template <typename Ta, typename Tb, typename To> static void vector_cross(const vector<Ta> *a, const vector<Tb> *b, vector<To> *out); |
krobertson | 17:323fc40376d5 | 229 | template <typename Ta, typename Tb> static float vector_dot(const vector<Ta> *a,const vector<Tb> *b); |
krobertson | 17:323fc40376d5 | 230 | static void vector_normalize(vector<float> *a); |
krobertson | 17:323fc40376d5 | 231 | |
krobertson | 17:323fc40376d5 | 232 | deviceType _device; // chip type (DLH, DLM, or DLHC) |
krobertson | 17:323fc40376d5 | 233 | |
krobertson | 17:323fc40376d5 | 234 | private: |
krobertson | 17:323fc40376d5 | 235 | static const int dummy_reg_count = 6; |
krobertson | 17:323fc40376d5 | 236 | regAddr translated_regs[dummy_reg_count + 1]; // index 0 not used |
krobertson | 17:323fc40376d5 | 237 | |
krobertson | 17:323fc40376d5 | 238 | int testReg(regAddr reg); |
krobertson | 17:323fc40376d5 | 239 | }; |
krobertson | 17:323fc40376d5 | 240 | |
krobertson | 17:323fc40376d5 | 241 | #endif |