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 FRDM-KL46Z LCD rtc Demo by
MAG3110/MAG3110.h@12:cae0afb130b1, 2014-10-02 (annotated)
- Committer:
- salemtang
- Date:
- Thu Oct 02 14:14:28 2014 +0000
- Revision:
- 12:cae0afb130b1
- Parent:
- 10:e6a7ab919241
20141002_2315 modified
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
salemtang | 8:18e86eb228ca | 1 | /* |
salemtang | 8:18e86eb228ca | 2 | * MAG3110 Sensor Library for mbed |
salemtang | 8:18e86eb228ca | 3 | * TODO: Add proper header |
salemtang | 8:18e86eb228ca | 4 | */ |
salemtang | 8:18e86eb228ca | 5 | |
salemtang | 8:18e86eb228ca | 6 | #ifndef MAG3110_H |
salemtang | 8:18e86eb228ca | 7 | #define MAG3110_H |
salemtang | 8:18e86eb228ca | 8 | |
salemtang | 8:18e86eb228ca | 9 | #include "mbed.h" |
salemtang | 8:18e86eb228ca | 10 | |
salemtang | 8:18e86eb228ca | 11 | #define PI 3.14159265359 |
salemtang | 8:18e86eb228ca | 12 | |
salemtang | 8:18e86eb228ca | 13 | #define MAG_ADDR 0x1D |
salemtang | 8:18e86eb228ca | 14 | |
salemtang | 8:18e86eb228ca | 15 | // define registers |
salemtang | 8:18e86eb228ca | 16 | #define MAG_DR_STATUS 0x00 |
salemtang | 8:18e86eb228ca | 17 | #define MAG_OUT_X_MSB 0x01 |
salemtang | 8:18e86eb228ca | 18 | #define MAG_OUT_X_LSB 0x02 |
salemtang | 8:18e86eb228ca | 19 | #define MAG_OUT_Y_MSB 0x03 |
salemtang | 8:18e86eb228ca | 20 | #define MAG_OUT_Y_LSB 0x04 |
salemtang | 8:18e86eb228ca | 21 | #define MAG_OUT_Z_MSB 0x05 |
salemtang | 8:18e86eb228ca | 22 | #define MAG_OUT_Z_LSB 0x06 |
salemtang | 8:18e86eb228ca | 23 | #define MAG_WHO_AM_I 0x07 |
salemtang | 8:18e86eb228ca | 24 | #define MAG_SYSMOD 0x08 |
salemtang | 8:18e86eb228ca | 25 | #define MAG_OFF_X_MSB 0x09 |
salemtang | 8:18e86eb228ca | 26 | #define MAG_OFF_X_LSB 0x0A |
salemtang | 8:18e86eb228ca | 27 | #define MAG_OFF_Y_MSB 0x0B |
salemtang | 8:18e86eb228ca | 28 | #define MAG_OFF_Y_LSB 0x0C |
salemtang | 8:18e86eb228ca | 29 | #define MAG_OFF_Z_MSB 0x0D |
salemtang | 8:18e86eb228ca | 30 | #define MAG_OFF_Z_LSB 0x0E |
salemtang | 8:18e86eb228ca | 31 | #define MAG_DIE_TEMP 0x0F |
salemtang | 8:18e86eb228ca | 32 | #define MAG_CTRL_REG1 0x10 |
salemtang | 8:18e86eb228ca | 33 | #define MAG_CTRL_REG2 0x11 |
salemtang | 8:18e86eb228ca | 34 | |
salemtang | 8:18e86eb228ca | 35 | // what should WHO_AM_I return? |
salemtang | 8:18e86eb228ca | 36 | #define MAG_3110_WHO_AM_I_VALUE 0xC4 |
salemtang | 8:18e86eb228ca | 37 | |
salemtang | 8:18e86eb228ca | 38 | // Fields in registers |
salemtang | 8:18e86eb228ca | 39 | // CTRL_REG1: dr2,dr1,dr0 os1,os0 fr tm ac |
salemtang | 8:18e86eb228ca | 40 | |
salemtang | 8:18e86eb228ca | 41 | // Sampling rate from 80Hz down to 0.625Hz |
salemtang | 8:18e86eb228ca | 42 | #define MAG_3110_SAMPLE80 0 |
salemtang | 8:18e86eb228ca | 43 | #define MAG_3110_SAMPLE40 0x20 |
salemtang | 8:18e86eb228ca | 44 | #define MAG_3110_SAMPLE20 0x40 |
salemtang | 8:18e86eb228ca | 45 | #define MAG_3110_SAMPLE10 0x60 |
salemtang | 8:18e86eb228ca | 46 | #define MAG_3110_SAMPLE5 0x80 |
salemtang | 8:18e86eb228ca | 47 | #define MAG_3110_SAMPLE2_5 0xA0 |
salemtang | 8:18e86eb228ca | 48 | #define MAG_3110_SAMPLE1_25 0xC0 |
salemtang | 8:18e86eb228ca | 49 | #define MAG_3110_SAMPLE0_625 0xE0 |
salemtang | 8:18e86eb228ca | 50 | |
salemtang | 8:18e86eb228ca | 51 | // How many samples to average (lowers data rate) |
salemtang | 8:18e86eb228ca | 52 | #define MAG_3110_OVERSAMPLE1 0 |
salemtang | 8:18e86eb228ca | 53 | #define MAG_3110_OVERSAMPLE2 0x08 |
salemtang | 8:18e86eb228ca | 54 | #define MAG_3110_OVERSAMPLE3 0x10 |
salemtang | 8:18e86eb228ca | 55 | #define MAG_3110_OVERSAMPLE4 0x18 |
salemtang | 8:18e86eb228ca | 56 | |
salemtang | 8:18e86eb228ca | 57 | // read only 1 byte per axis |
salemtang | 8:18e86eb228ca | 58 | #define MAG_3110_FASTREAD 0x04 |
salemtang | 8:18e86eb228ca | 59 | // do one measurement (even if in standby mode) |
salemtang | 8:18e86eb228ca | 60 | #define MAG_3110_TRIGGER 0x02 |
salemtang | 8:18e86eb228ca | 61 | // put in active mode |
salemtang | 8:18e86eb228ca | 62 | #define MAG_3110_ACTIVE 0x01 |
salemtang | 8:18e86eb228ca | 63 | |
salemtang | 8:18e86eb228ca | 64 | // CTRL_REG2: AUTO_MRST_EN _ RAW MAG_RST _ _ _ _ _ |
salemtang | 8:18e86eb228ca | 65 | // reset sensor after each reading |
salemtang | 8:18e86eb228ca | 66 | #define MAG_3110_AUTO_MRST_EN 0x80 |
salemtang | 8:18e86eb228ca | 67 | // don't subtract user offsets |
salemtang | 8:18e86eb228ca | 68 | #define MAG_3110_RAW 0x20 |
salemtang | 8:18e86eb228ca | 69 | // reset magnetic sensor after too-large field |
salemtang | 8:18e86eb228ca | 70 | #define MAG_3110_MAG_RST 0x10 |
salemtang | 8:18e86eb228ca | 71 | |
salemtang | 8:18e86eb228ca | 72 | // DR_STATUS Register ZYXOW ZOW YOW XOW ZYXDR ZDR YDR XDR |
salemtang | 8:18e86eb228ca | 73 | #define MAG_3110_ZYXDR 0x08 |
salemtang | 8:18e86eb228ca | 74 | |
salemtang | 8:18e86eb228ca | 75 | /** |
salemtang | 8:18e86eb228ca | 76 | * MAG3110 Class to read X/Y/Z data from the magentometer |
salemtang | 8:18e86eb228ca | 77 | * |
salemtang | 8:18e86eb228ca | 78 | */ |
salemtang | 8:18e86eb228ca | 79 | class MAG3110 |
salemtang | 8:18e86eb228ca | 80 | { |
salemtang | 8:18e86eb228ca | 81 | public: |
salemtang | 8:18e86eb228ca | 82 | /** |
salemtang | 8:18e86eb228ca | 83 | * Main constructor |
salemtang | 8:18e86eb228ca | 84 | * @param sda SDA pin |
salemtang | 8:18e86eb228ca | 85 | * @param sdl SCL pin |
salemtang | 8:18e86eb228ca | 86 | * @param addr addr of the I2C peripheral |
salemtang | 8:18e86eb228ca | 87 | */ |
salemtang | 8:18e86eb228ca | 88 | MAG3110(PinName sda, PinName scl); |
salemtang | 8:18e86eb228ca | 89 | /** |
salemtang | 8:18e86eb228ca | 90 | * Debug version of constructor |
salemtang | 8:18e86eb228ca | 91 | * @param sda SDA pin |
salemtang | 8:18e86eb228ca | 92 | * @param sdl SCL pin |
salemtang | 8:18e86eb228ca | 93 | * @param addr Address of the I2C peripheral |
salemtang | 8:18e86eb228ca | 94 | * @param pc Serial object to output debug messages |
salemtang | 8:18e86eb228ca | 95 | */ |
salemtang | 8:18e86eb228ca | 96 | MAG3110(PinName sda, PinName scl, Serial *pc); //pass serial for debug |
salemtang | 8:18e86eb228ca | 97 | /** |
salemtang | 8:18e86eb228ca | 98 | * Setup the Magnetometer |
salemtang | 8:18e86eb228ca | 99 | * |
salemtang | 8:18e86eb228ca | 100 | */ |
salemtang | 8:18e86eb228ca | 101 | void begin(); |
salemtang | 8:18e86eb228ca | 102 | /** |
salemtang | 8:18e86eb228ca | 103 | * Read a register, return its value as int |
salemtang | 8:18e86eb228ca | 104 | * @param regAddr The address to read |
salemtang | 8:18e86eb228ca | 105 | * @return value in register |
salemtang | 8:18e86eb228ca | 106 | */ |
salemtang | 8:18e86eb228ca | 107 | int readReg(char regAddr); |
salemtang | 8:18e86eb228ca | 108 | /** |
salemtang | 8:18e86eb228ca | 109 | * Read a value from a pair of registers, return as int |
salemtang | 8:18e86eb228ca | 110 | * @param regAddr The address to read |
salemtang | 8:18e86eb228ca | 111 | * @return Value from 2 consecutive registers |
salemtang | 8:18e86eb228ca | 112 | */ |
salemtang | 8:18e86eb228ca | 113 | int readVal(char regAddr); |
salemtang | 8:18e86eb228ca | 114 | /** |
salemtang | 8:18e86eb228ca | 115 | * Calculate the heading |
salemtang | 8:18e86eb228ca | 116 | * @return heading in degrees |
salemtang | 8:18e86eb228ca | 117 | */ |
salemtang | 8:18e86eb228ca | 118 | float getHeading(); |
salemtang | 8:18e86eb228ca | 119 | /** |
salemtang | 8:18e86eb228ca | 120 | * Perform a read on the X, Y and Z values. |
salemtang | 8:18e86eb228ca | 121 | * @param xVal Pointer to X value |
salemtang | 8:18e86eb228ca | 122 | * @param yVal Pointer to Y value |
salemtang | 8:18e86eb228ca | 123 | * @param zVal Pointer to Z value |
salemtang | 8:18e86eb228ca | 124 | */ |
salemtang | 8:18e86eb228ca | 125 | void getValues(int *xVal, int *yVal, int *zVal); |
salemtang | 8:18e86eb228ca | 126 | /** |
salemtang | 8:18e86eb228ca | 127 | * Set the calibration parameters if required. |
salemtang | 8:18e86eb228ca | 128 | * @param minX Minimum value for X range |
salemtang | 8:18e86eb228ca | 129 | * @param maxX Maximum value for X range |
salemtang | 8:18e86eb228ca | 130 | * @param minY Minimum value for Y range |
salemtang | 8:18e86eb228ca | 131 | * @param maxY maximum value for Y range |
salemtang | 8:18e86eb228ca | 132 | */ |
salemtang | 8:18e86eb228ca | 133 | void setCalibration(int minX, int maxX, int minY, int maxY); |
salemtang | 8:18e86eb228ca | 134 | |
salemtang | 8:18e86eb228ca | 135 | private: |
salemtang | 8:18e86eb228ca | 136 | I2C _i2c; |
salemtang | 8:18e86eb228ca | 137 | int _i2c_address; |
salemtang | 8:18e86eb228ca | 138 | Serial *_pc; |
salemtang | 8:18e86eb228ca | 139 | bool _debug; |
salemtang | 8:18e86eb228ca | 140 | int _avgX, _avgY; |
salemtang | 8:18e86eb228ca | 141 | |
salemtang | 8:18e86eb228ca | 142 | }; |
salemtang | 8:18e86eb228ca | 143 | #endif |