Committer:
ssozonoff
Date:
Fri Jun 17 22:35:48 2011 +0000
Revision:
2:2645c4d75671
Parent:
1:bdf678f27614
Fixed issue with Pitch and Roll negative values

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ssozonoff 0:5b09476278da 1 /**
ssozonoff 1:bdf678f27614 2 * @author Serge Sozonoff
ssozonoff 0:5b09476278da 3 * @author Aaron Berk
ssozonoff 1:bdf678f27614 4 * Partially based on the work of Aaron Berk for the HMC6352
ssozonoff 0:5b09476278da 5 *
ssozonoff 0:5b09476278da 6 * @section LICENSE
ssozonoff 0:5b09476278da 7 *
ssozonoff 0:5b09476278da 8 * Copyright (c) 2010 ARM Limited
ssozonoff 0:5b09476278da 9 *
ssozonoff 0:5b09476278da 10 * Permission is hereby granted, free of charge, to any person obtaining a copy
ssozonoff 0:5b09476278da 11 * of this software and associated documentation files (the "Software"), to deal
ssozonoff 0:5b09476278da 12 * in the Software without restriction, including without limitation the rights
ssozonoff 0:5b09476278da 13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
ssozonoff 0:5b09476278da 14 * copies of the Software, and to permit persons to whom the Software is
ssozonoff 0:5b09476278da 15 * furnished to do so, subject to the following conditions:
ssozonoff 0:5b09476278da 16 *
ssozonoff 0:5b09476278da 17 * The above copyright notice and this permission notice shall be included in
ssozonoff 0:5b09476278da 18 * all copies or substantial portions of the Software.
ssozonoff 0:5b09476278da 19 *
ssozonoff 0:5b09476278da 20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
ssozonoff 0:5b09476278da 21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
ssozonoff 0:5b09476278da 22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
ssozonoff 0:5b09476278da 23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
ssozonoff 0:5b09476278da 24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
ssozonoff 0:5b09476278da 25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
ssozonoff 0:5b09476278da 26 * THE SOFTWARE.
ssozonoff 0:5b09476278da 27 *
ssozonoff 0:5b09476278da 28 * @section DESCRIPTION
ssozonoff 0:5b09476278da 29 *
ssozonoff 0:5b09476278da 30 * Honeywell HMC6343 digital compass.
ssozonoff 0:5b09476278da 31 *
ssozonoff 0:5b09476278da 32 * Datasheet:
ssozonoff 0:5b09476278da 33 *
ssozonoff 0:5b09476278da 34 * http://www.ssec.honeywell.com/magnetic/datasheets/HMC6343.pdf
ssozonoff 0:5b09476278da 35 */
ssozonoff 0:5b09476278da 36
ssozonoff 0:5b09476278da 37 #ifndef HMC6343_H
ssozonoff 0:5b09476278da 38 #define HMC6343_H
ssozonoff 0:5b09476278da 39
ssozonoff 0:5b09476278da 40 /**
ssozonoff 0:5b09476278da 41 * Includes
ssozonoff 0:5b09476278da 42 */
ssozonoff 0:5b09476278da 43 #include "mbed.h"
ssozonoff 0:5b09476278da 44
ssozonoff 0:5b09476278da 45 /**
ssozonoff 0:5b09476278da 46 * Defines
ssozonoff 0:5b09476278da 47 */
ssozonoff 0:5b09476278da 48 #define HMC6343_I2C_ADDRESS 0x32 >> 1 //7-bit address
ssozonoff 0:5b09476278da 49
ssozonoff 0:5b09476278da 50 //Commands.
ssozonoff 0:5b09476278da 51 #define HMC6343_EEPROM_WRITE 0xF1
ssozonoff 0:5b09476278da 52 #define HMC6343_EEPROM_READ 0xE1
ssozonoff 0:5b09476278da 53 #define HMC6343_ENTER_SLEEP 0x83
ssozonoff 0:5b09476278da 54 #define HMC6343_EXIT_SLEEP 0x84
ssozonoff 0:5b09476278da 55 #define HMC6343_ENTER_STANDBY 0x76
ssozonoff 0:5b09476278da 56 #define HMC6343_ENTER_RUN 0x75
ssozonoff 0:5b09476278da 57 #define HMC6343_RESET 0x82
ssozonoff 0:5b09476278da 58 #define HMC6343_ENTER_CALIB 0x71
ssozonoff 0:5b09476278da 59 #define HMC6343_EXIT_CALIB 0x7E
ssozonoff 0:5b09476278da 60 #define HMC6343_GET_ACCEL_DATA 0x40
ssozonoff 0:5b09476278da 61 #define HMC6343_GET_MAG_DATA 0x45
ssozonoff 0:5b09476278da 62 #define HMC6343_GET_HEADING_DATA 0x50
ssozonoff 0:5b09476278da 63 #define HMC6343_GET_TILT_DATA 0x55
ssozonoff 0:5b09476278da 64 #define HMC6343_GET_HEADING_DATA 0x50
ssozonoff 0:5b09476278da 65 #define HMC6343_SET_XFWD_PLS_ZUP 0x72
ssozonoff 0:5b09476278da 66 #define HMC6343_SET_XFWD_YUP 0x73
ssozonoff 0:5b09476278da 67 #define HMC6343_SET_ZFWD_NEG_XUP 0x74
ssozonoff 0:5b09476278da 68 #define HMC6343_GET_OPMODE 0x65
ssozonoff 0:5b09476278da 69
ssozonoff 0:5b09476278da 70 //EEPROM locations.
ssozonoff 0:5b09476278da 71 #define HMC6343_SLAVE_ADDR 0x00
ssozonoff 0:5b09476278da 72 #define HMC6343_OPMOD_REG1 0x04
ssozonoff 0:5b09476278da 73 #define HMC6343_OPMOD_REG2 0x05
ssozonoff 0:5b09476278da 74 #define HMC6343_SN_LSB 0x06
ssozonoff 0:5b09476278da 75 #define HMC6343_SN_MSB 0x07
ssozonoff 0:5b09476278da 76 #define HMC6343_DEV_LSB 0x0A
ssozonoff 0:5b09476278da 77 #define HMC6343_DEV_MSB 0x0B
ssozonoff 0:5b09476278da 78 #define HMC6343_VAR_LSB 0x0C
ssozonoff 0:5b09476278da 79 #define HMC6343_VAR_MSB 0x0D
ssozonoff 0:5b09476278da 80 #define HMC6343_XOFFSET_LSB 0x0E
ssozonoff 0:5b09476278da 81 #define HMC6343_XOFFSET_MSB 0x0F
ssozonoff 0:5b09476278da 82 #define HMC6343_YOFFSET_LSB 0x10
ssozonoff 0:5b09476278da 83 #define HMC6343_YOFFSET_MSB 0x11
ssozonoff 0:5b09476278da 84 #define HMC6343_ZOFFSET_LSB 0x12
ssozonoff 0:5b09476278da 85 #define HMC6343_ZOFFSET_MSB 0x13
ssozonoff 0:5b09476278da 86 #define HMC6343_IIRF_LSB 0x14
ssozonoff 0:5b09476278da 87 #define HMC6343_IIRF_MSB 0x15
ssozonoff 0:5b09476278da 88 #define HMC6343_SOFT_VER 0x02
ssozonoff 0:5b09476278da 89
ssozonoff 0:5b09476278da 90
ssozonoff 0:5b09476278da 91 #define HMC6343_X_AXIS 0x01
ssozonoff 0:5b09476278da 92 #define HMC6343_Y_AXIS 0x02
ssozonoff 0:5b09476278da 93 #define HMC6343_Z_AXIS 0x04
ssozonoff 0:5b09476278da 94
ssozonoff 0:5b09476278da 95
ssozonoff 0:5b09476278da 96 // Operation mode bit masks
ssozonoff 0:5b09476278da 97 // LSB
ssozonoff 1:bdf678f27614 98 #define HMC6343_COMP 0x80
ssozonoff 1:bdf678f27614 99 #define HMC6343_CAL 0x40
ssozonoff 1:bdf678f27614 100 #define HMC6343_FILTER 0x20
ssozonoff 1:bdf678f27614 101 #define HMC6343_RUN 0x10
ssozonoff 0:5b09476278da 102 #define HMC6343_STDBY 0x08
ssozonoff 0:5b09476278da 103 #define HMC6343_UF 0x04
ssozonoff 0:5b09476278da 104 #define HMC6343_UE 0x02
ssozonoff 0:5b09476278da 105 #define HMC6343_LEVEL 0x01
ssozonoff 0:5b09476278da 106
ssozonoff 0:5b09476278da 107
ssozonoff 0:5b09476278da 108 //Operational mode register masks.
ssozonoff 0:5b09476278da 109 #define HMC6343_CM_MR_1HZ 0x00
ssozonoff 1:bdf678f27614 110 #define HMC6343_CM_MR_5HZ 0x100
ssozonoff 1:bdf678f27614 111 #define HMC6343_CM_MR_10HZ 0x200
ssozonoff 1:bdf678f27614 112
ssozonoff 0:5b09476278da 113
ssozonoff 1:bdf678f27614 114 struct Heading {
ssozonoff 2:2645c4d75671 115 float heading;
ssozonoff 2:2645c4d75671 116 float pitch;
ssozonoff 2:2645c4d75671 117 float roll;
ssozonoff 1:bdf678f27614 118 };
ssozonoff 0:5b09476278da 119
ssozonoff 0:5b09476278da 120 /**
ssozonoff 0:5b09476278da 121 * Honeywell HMC6343 digital compass.
ssozonoff 0:5b09476278da 122 */
ssozonoff 0:5b09476278da 123 class HMC6343 {
ssozonoff 0:5b09476278da 124
ssozonoff 0:5b09476278da 125 public:
ssozonoff 0:5b09476278da 126
ssozonoff 0:5b09476278da 127 /**
ssozonoff 0:5b09476278da 128 * Constructor.
ssozonoff 0:5b09476278da 129 *
ssozonoff 0:5b09476278da 130 * @param sda mbed pin to use for SDA line of I2C interface.
ssozonoff 0:5b09476278da 131 * @param scl mbed pin to use for SCL line of I2C interface.
ssozonoff 0:5b09476278da 132 */
ssozonoff 0:5b09476278da 133 HMC6343(PinName sda, PinName scl);
ssozonoff 1:bdf678f27614 134
ssozonoff 1:bdf678f27614 135 HMC6343(I2C& p_itc);
ssozonoff 0:5b09476278da 136
ssozonoff 0:5b09476278da 137 /**
ssozonoff 0:5b09476278da 138 * Sample the device and return the result.
ssozonoff 0:5b09476278da 139 *
ssozonoff 0:5b09476278da 140 * @return In heading output mode, the current heading as a number between
ssozonoff 0:5b09476278da 141 * 0-3599, representing 0-359.9 degrees.
ssozonoff 0:5b09476278da 142 * In raw magnetometer X output mode, the raw output of the X-axis
ssozonoff 0:5b09476278da 143 * magnetometer.
ssozonoff 0:5b09476278da 144 * In raw magnetometer Y mode, the raw output of the Y-axis
ssozonoff 0:5b09476278da 145 * magnetometer.
ssozonoff 0:5b09476278da 146 * In magnetometer X mode, the corrected output of the X-axis
ssozonoff 0:5b09476278da 147 * magnetometer.
ssozonoff 0:5b09476278da 148 * In magnetometer Y mode, the corrected output of the Y-axis
ssozonoff 0:5b09476278da 149 * magnetometer.
ssozonoff 0:5b09476278da 150 */
ssozonoff 1:bdf678f27614 151 void sampleHeading(Heading* p_heading);
ssozonoff 0:5b09476278da 152
ssozonoff 0:5b09476278da 153 /**
ssozonoff 0:5b09476278da 154 * Update bridge offsets.
ssozonoff 0:5b09476278da 155 *
ssozonoff 0:5b09476278da 156 * Performs a set/reset immediately.
ssozonoff 0:5b09476278da 157 */
ssozonoff 0:5b09476278da 158 void setReset(void);
ssozonoff 0:5b09476278da 159
ssozonoff 0:5b09476278da 160 /**
ssozonoff 0:5b09476278da 161 * Enter into or exit from calibration mode.
ssozonoff 0:5b09476278da 162 *
ssozonoff 0:5b09476278da 163 * @param enterOrExit 0x45 -> Exit
ssozonoff 0:5b09476278da 164 * 0x43 -> Enter
ssozonoff 0:5b09476278da 165 */
ssozonoff 0:5b09476278da 166 void setCalibrationMode(int enterOrExit);
ssozonoff 0:5b09476278da 167
ssozonoff 0:5b09476278da 168 /**
ssozonoff 0:5b09476278da 169 * Save the current operation mode byte to EEPROM.
ssozonoff 0:5b09476278da 170 */
ssozonoff 0:5b09476278da 171 void saveOpMode(void);
ssozonoff 0:5b09476278da 172
ssozonoff 0:5b09476278da 173 /**
ssozonoff 0:5b09476278da 174 * Read the memory location on the device which contains the slave address.
ssozonoff 0:5b09476278da 175 *
ssozonoff 0:5b09476278da 176 * @return The slave address of the device.
ssozonoff 0:5b09476278da 177 */
ssozonoff 0:5b09476278da 178 int getSlaveAddress(void);
ssozonoff 0:5b09476278da 179
ssozonoff 0:5b09476278da 180 /**
ssozonoff 0:5b09476278da 181 * Read the current offset for X or Y axis magnetometer.
ssozonoff 0:5b09476278da 182 *
ssozonoff 0:5b09476278da 183 * @param axis 0x01 -> X-axis
ssozonoff 0:5b09476278da 184 * 0x02 -> Y-axis
ssozonoff 0:5b09476278da 185 * 0x04 -> Z-axis
ssozonoff 0:5b09476278da 186 * @return The current offset for the axis as a 16-bit number.
ssozonoff 0:5b09476278da 187 */
ssozonoff 0:5b09476278da 188 int getOffset(int axis);
ssozonoff 0:5b09476278da 189
ssozonoff 0:5b09476278da 190
ssozonoff 0:5b09476278da 191 /**
ssozonoff 0:5b09476278da 192 * Get the software version on the device.
ssozonoff 0:5b09476278da 193 *
ssozonoff 0:5b09476278da 194 * @return The software version number.
ssozonoff 0:5b09476278da 195 */
ssozonoff 0:5b09476278da 196 int getSoftwareVersion(void);
ssozonoff 0:5b09476278da 197
ssozonoff 0:5b09476278da 198 /**
ssozonoff 0:5b09476278da 199 * Get the current operation mode.
ssozonoff 0:5b09476278da 200 *
ssozonoff 0:5b09476278da 201 * @return 0x00 -> Standby mode
ssozonoff 0:5b09476278da 202 * 0x01 -> Query mode
ssozonoff 0:5b09476278da 203 * 0x02 -> Continuous mode
ssozonoff 0:5b09476278da 204 */
ssozonoff 0:5b09476278da 205 int getOpMode(void);
ssozonoff 0:5b09476278da 206
ssozonoff 0:5b09476278da 207 /**
ssozonoff 0:5b09476278da 208 * Set the operation mode.
ssozonoff 0:5b09476278da 209 *
ssozonoff 0:5b09476278da 210 * @param periodicSetReset 0x00 -> No periodic set/reset
ssozonoff 0:5b09476278da 211 * 0x01 -> Periodic set/reset
ssozonoff 0:5b09476278da 212 */
ssozonoff 1:bdf678f27614 213 void setOpMode(int opMode);
ssozonoff 0:5b09476278da 214
ssozonoff 0:5b09476278da 215
ssozonoff 0:5b09476278da 216 void setMagneticVariation(float var);
ssozonoff 0:5b09476278da 217 float getMagneticVariation();
ssozonoff 0:5b09476278da 218 void setMagneticDeviation(float data);
ssozonoff 0:5b09476278da 219 float getMagneticDeviation();
ssozonoff 1:bdf678f27614 220 bool isOpModeFlagSet(int flag);
ssozonoff 1:bdf678f27614 221 void setIIRFilter(short data);
ssozonoff 1:bdf678f27614 222 short getIIRFilter();
ssozonoff 1:bdf678f27614 223 void setMagOffset(int axis, int offset);
ssozonoff 1:bdf678f27614 224 int getMagOffset(int axis);
ssozonoff 1:bdf678f27614 225 char getMeasurementRate();
ssozonoff 0:5b09476278da 226
ssozonoff 0:5b09476278da 227 private:
ssozonoff 0:5b09476278da 228
ssozonoff 0:5b09476278da 229 I2C* i2c_;
ssozonoff 0:5b09476278da 230 int operationMode_;
ssozonoff 0:5b09476278da 231
ssozonoff 0:5b09476278da 232 /**
ssozonoff 0:5b09476278da 233 * Write to EEPROM on the device.
ssozonoff 0:5b09476278da 234 *
ssozonoff 0:5b09476278da 235 * @param address Address to write to.
ssozonoff 0:5b09476278da 236 * @param data Data to write.
ssozonoff 0:5b09476278da 237 */
ssozonoff 1:bdf678f27614 238 void writeEeprom(int address, int data);
ssozonoff 0:5b09476278da 239
ssozonoff 0:5b09476278da 240 /**
ssozonoff 0:5b09476278da 241 * Read EEPROM on the device.
ssozonoff 0:5b09476278da 242 *
ssozonoff 0:5b09476278da 243 * @param address Address to read from.
ssozonoff 0:5b09476278da 244 * @return The contents of the memory address.
ssozonoff 0:5b09476278da 245 */
ssozonoff 1:bdf678f27614 246 int readEeprom(int address);
ssozonoff 0:5b09476278da 247
ssozonoff 1:bdf678f27614 248 void writeShort(int lsb_address, short data);
ssozonoff 1:bdf678f27614 249 short readShort(int lsb_eprom_address);
ssozonoff 0:5b09476278da 250 };
ssozonoff 0:5b09476278da 251
ssozonoff 0:5b09476278da 252 #endif /* HMC6343_H */