KL46Z-lab2

Dependencies:   SLCD- mbed TSI MMA8451Q USBDevice MAG3110

Committer:
Lokkus
Date:
Thu Feb 21 07:41:00 2019 +0000
Revision:
0:29277ae50860
KL46Z-lab2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Lokkus 0:29277ae50860 1
Lokkus 0:29277ae50860 2 #include "MAG3110.h"
Lokkus 0:29277ae50860 3 #include "mbed.h"
Lokkus 0:29277ae50860 4
Lokkus 0:29277ae50860 5 /******************************************************************************
Lokkus 0:29277ae50860 6 * Constructors
Lokkus 0:29277ae50860 7 ******************************************************************************/
Lokkus 0:29277ae50860 8 MAG3110::MAG3110(PinName sda, PinName scl): _i2c(sda, scl),
Lokkus 0:29277ae50860 9 _i2c_address(0x1D), _pc(NULL), _debug(false)
Lokkus 0:29277ae50860 10 {
Lokkus 0:29277ae50860 11 begin();
Lokkus 0:29277ae50860 12 }
Lokkus 0:29277ae50860 13
Lokkus 0:29277ae50860 14 MAG3110::MAG3110(PinName sda, PinName scl, Serial *pc): _i2c(sda, scl),
Lokkus 0:29277ae50860 15 _i2c_address(0x1D), _pc(pc), _debug(true)
Lokkus 0:29277ae50860 16 {
Lokkus 0:29277ae50860 17 begin();
Lokkus 0:29277ae50860 18 }
Lokkus 0:29277ae50860 19
Lokkus 0:29277ae50860 20 void MAG3110::begin()
Lokkus 0:29277ae50860 21 {
Lokkus 0:29277ae50860 22 char cmd[2];
Lokkus 0:29277ae50860 23
Lokkus 0:29277ae50860 24 cmd[0] = MAG_CTRL_REG2;
Lokkus 0:29277ae50860 25 cmd[1] = 0x80;
Lokkus 0:29277ae50860 26 _i2c.write(_i2c_address, cmd, 2);
Lokkus 0:29277ae50860 27
Lokkus 0:29277ae50860 28 cmd[0] = MAG_CTRL_REG1;
Lokkus 0:29277ae50860 29 cmd[1] = MAG_3110_SAMPLE80+MAG_3110_OVERSAMPLE2+MAG_3110_ACTIVE;
Lokkus 0:29277ae50860 30 _i2c.write(_i2c_address, cmd, 2);
Lokkus 0:29277ae50860 31
Lokkus 0:29277ae50860 32 // No adjustment initially
Lokkus 0:29277ae50860 33 _avgX = 0;
Lokkus 0:29277ae50860 34 _avgY = 0;
Lokkus 0:29277ae50860 35 }
Lokkus 0:29277ae50860 36
Lokkus 0:29277ae50860 37 // Read a single byte form 8 bit register, return as int
Lokkus 0:29277ae50860 38 int MAG3110::readReg(char regAddr)
Lokkus 0:29277ae50860 39 {
Lokkus 0:29277ae50860 40 char cmd[1];
Lokkus 0:29277ae50860 41
Lokkus 0:29277ae50860 42 cmd[0] = regAddr;
Lokkus 0:29277ae50860 43 _i2c.write(_i2c_address, cmd, 1);
Lokkus 0:29277ae50860 44
Lokkus 0:29277ae50860 45 cmd[0] = 0x00;
Lokkus 0:29277ae50860 46 _i2c.read(_i2c_address, cmd, 1);
Lokkus 0:29277ae50860 47 return (int)( cmd[0]);
Lokkus 0:29277ae50860 48 }
Lokkus 0:29277ae50860 49
Lokkus 0:29277ae50860 50
Lokkus 0:29277ae50860 51 // read a register per, pass first reg value, reading 2 bytes increments register
Lokkus 0:29277ae50860 52 // Reads MSB first then LSB
Lokkus 0:29277ae50860 53 int MAG3110::readVal(char regAddr)
Lokkus 0:29277ae50860 54 {
Lokkus 0:29277ae50860 55 char cmd[2];
Lokkus 0:29277ae50860 56
Lokkus 0:29277ae50860 57 cmd[0] = regAddr;
Lokkus 0:29277ae50860 58 _i2c.write(_i2c_address, cmd, 1);
Lokkus 0:29277ae50860 59
Lokkus 0:29277ae50860 60 cmd[0] = 0x00;
Lokkus 0:29277ae50860 61 cmd[1] = 0x00;
Lokkus 0:29277ae50860 62 _i2c.read(_i2c_address, cmd, 2);
Lokkus 0:29277ae50860 63 return (int)( (cmd[1]|(cmd[0] << 8))); //concatenate the MSB and LSB
Lokkus 0:29277ae50860 64 }
Lokkus 0:29277ae50860 65
Lokkus 0:29277ae50860 66
Lokkus 0:29277ae50860 67 float MAG3110::getHeading()
Lokkus 0:29277ae50860 68 {
Lokkus 0:29277ae50860 69 int xVal = readVal(MAG_OUT_X_MSB);
Lokkus 0:29277ae50860 70 int yVal = readVal(MAG_OUT_Y_MSB);
Lokkus 0:29277ae50860 71 return (atan2((double)(yVal - _avgY),(double)(xVal - _avgX)))*180/PI;
Lokkus 0:29277ae50860 72 }
Lokkus 0:29277ae50860 73
Lokkus 0:29277ae50860 74 void MAG3110::getValues(int *xVal, int *yVal, int *zVal)
Lokkus 0:29277ae50860 75 {
Lokkus 0:29277ae50860 76 *xVal = readVal(MAG_OUT_X_MSB);
Lokkus 0:29277ae50860 77 *yVal = readVal(MAG_OUT_Y_MSB);
Lokkus 0:29277ae50860 78 *zVal = readVal(MAG_OUT_Z_MSB);
Lokkus 0:29277ae50860 79 }
Lokkus 0:29277ae50860 80
Lokkus 0:29277ae50860 81
Lokkus 0:29277ae50860 82 void MAG3110::setCalibration(int minX, int maxX, int minY, int maxY )
Lokkus 0:29277ae50860 83 {
Lokkus 0:29277ae50860 84 _avgX=(maxX+minX)/2;
Lokkus 0:29277ae50860 85 _avgY=(maxY+minY)/2;
Lokkus 0:29277ae50860 86 }
Lokkus 0:29277ae50860 87
Lokkus 0:29277ae50860 88
Lokkus 0:29277ae50860 89
Lokkus 0:29277ae50860 90
Lokkus 0:29277ae50860 91