configure sensors on FRDM KL46Z and send data through Serial port. Need host(PC) software to interact with. Sampling rate can vary by proper instruction

Dependencies:   EventFramework mbed

Committer:
xmnan
Date:
Sat Feb 15 07:52:46 2014 +0000
Revision:
0:2b49a387e831
original version.; Utilize EventFrameWork; sensors: MMA8451Q MAG3110 TSISensor lightSensor + analog input

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xmnan 0:2b49a387e831 1
xmnan 0:2b49a387e831 2 #include "MAG3110.h"
xmnan 0:2b49a387e831 3 #include "mbed.h"
xmnan 0:2b49a387e831 4
xmnan 0:2b49a387e831 5 /******************************************************************************
xmnan 0:2b49a387e831 6 * Constructors
xmnan 0:2b49a387e831 7 ******************************************************************************/
xmnan 0:2b49a387e831 8 MAG3110::MAG3110(PinName sda, PinName scl,float dateRate, int overSample): _i2c(sda, scl),
xmnan 0:2b49a387e831 9 _i2c_address(0x0E<<1), _pc(NULL), _debug(false)
xmnan 0:2b49a387e831 10 {
xmnan 0:2b49a387e831 11 Setdr(dateRate);
xmnan 0:2b49a387e831 12 Setosr(overSample);
xmnan 0:2b49a387e831 13 begin();
xmnan 0:2b49a387e831 14 }
xmnan 0:2b49a387e831 15
xmnan 0:2b49a387e831 16 MAG3110::MAG3110(PinName sda, PinName scl): _i2c(sda, scl),
xmnan 0:2b49a387e831 17 _i2c_address(0x0E<<1), _pc(NULL), _debug(false),dr(MAG_3110_SAMPLE80),osr(MAG_3110_OVERSAMPLE2)
xmnan 0:2b49a387e831 18 {
xmnan 0:2b49a387e831 19 begin();
xmnan 0:2b49a387e831 20 }
xmnan 0:2b49a387e831 21
xmnan 0:2b49a387e831 22 MAG3110::MAG3110(PinName sda, PinName scl, Serial *pc): _i2c(sda, scl),
xmnan 0:2b49a387e831 23 _i2c_address(0x0E<<1), _pc(pc), _debug(true),dr(MAG_3110_SAMPLE80),osr(MAG_3110_OVERSAMPLE2)
xmnan 0:2b49a387e831 24 {
xmnan 0:2b49a387e831 25 begin();
xmnan 0:2b49a387e831 26 }
xmnan 0:2b49a387e831 27
xmnan 0:2b49a387e831 28 void MAG3110::begin()
xmnan 0:2b49a387e831 29 {
xmnan 0:2b49a387e831 30
xmnan 0:2b49a387e831 31 char cmd[2];
xmnan 0:2b49a387e831 32
xmnan 0:2b49a387e831 33 cmd[0] = MAG_CTRL_REG2;
xmnan 0:2b49a387e831 34 cmd[1] = 0x80;
xmnan 0:2b49a387e831 35 _i2c.write(_i2c_address, cmd, 2);
xmnan 0:2b49a387e831 36
xmnan 0:2b49a387e831 37 cmd[0] = MAG_CTRL_REG1;
xmnan 0:2b49a387e831 38 // cmd[1] = MAG_3110_SAMPLE80+MAG_3110_OVERSAMPLE2+MAG_3110_ACTIVE;
xmnan 0:2b49a387e831 39 cmd[1] = dr+osr+MAG_3110_ACTIVE;
xmnan 0:2b49a387e831 40 _i2c.write(_i2c_address, cmd, 2);
xmnan 0:2b49a387e831 41
xmnan 0:2b49a387e831 42 // No adjustment initially
xmnan 0:2b49a387e831 43 _avgX = 0;
xmnan 0:2b49a387e831 44 _avgY = 0;
xmnan 0:2b49a387e831 45 }
xmnan 0:2b49a387e831 46
xmnan 0:2b49a387e831 47 // Read a single byte form 8 bit register, return as int
xmnan 0:2b49a387e831 48 int MAG3110::readReg(char regAddr)
xmnan 0:2b49a387e831 49 {
xmnan 0:2b49a387e831 50 char cmd[1];
xmnan 0:2b49a387e831 51
xmnan 0:2b49a387e831 52 cmd[0] = regAddr;
xmnan 0:2b49a387e831 53 _i2c.write(_i2c_address, cmd, 1);
xmnan 0:2b49a387e831 54
xmnan 0:2b49a387e831 55 cmd[0] = 0x00;
xmnan 0:2b49a387e831 56 _i2c.read(_i2c_address, cmd, 1);
xmnan 0:2b49a387e831 57 return (int)( cmd[0]);
xmnan 0:2b49a387e831 58 }
xmnan 0:2b49a387e831 59
xmnan 0:2b49a387e831 60
xmnan 0:2b49a387e831 61 // read a register per, pass first reg value, reading 2 bytes increments register
xmnan 0:2b49a387e831 62 // Reads MSB first then LSB
xmnan 0:2b49a387e831 63 int MAG3110::readVal(char regAddr)
xmnan 0:2b49a387e831 64 {
xmnan 0:2b49a387e831 65 char cmd[2];
xmnan 0:2b49a387e831 66
xmnan 0:2b49a387e831 67 cmd[0] = regAddr;
xmnan 0:2b49a387e831 68 _i2c.write(_i2c_address, cmd, 1);
xmnan 0:2b49a387e831 69
xmnan 0:2b49a387e831 70 cmd[0] = 0x00;
xmnan 0:2b49a387e831 71 cmd[1] = 0x00;
xmnan 0:2b49a387e831 72 _i2c.read(_i2c_address, cmd, 2);
xmnan 0:2b49a387e831 73 return (int)( (cmd[1]|(cmd[0] << 8))); //concatenate the MSB and LSB
xmnan 0:2b49a387e831 74 }
xmnan 0:2b49a387e831 75
xmnan 0:2b49a387e831 76
xmnan 0:2b49a387e831 77 float MAG3110::getHeading()
xmnan 0:2b49a387e831 78 {
xmnan 0:2b49a387e831 79 int xVal = readVal(MAG_OUT_X_MSB);
xmnan 0:2b49a387e831 80 int yVal = readVal(MAG_OUT_Y_MSB);
xmnan 0:2b49a387e831 81 return (atan2((double)(yVal - _avgY),(double)(xVal - _avgX)))*180/PI;
xmnan 0:2b49a387e831 82 }
xmnan 0:2b49a387e831 83
xmnan 0:2b49a387e831 84 void MAG3110::getValues(int *xVal, int *yVal, int *zVal)
xmnan 0:2b49a387e831 85 {
xmnan 0:2b49a387e831 86 *xVal = readVal(MAG_OUT_X_MSB);
xmnan 0:2b49a387e831 87 *yVal = readVal(MAG_OUT_Y_MSB);
xmnan 0:2b49a387e831 88 *zVal = readVal(MAG_OUT_Z_MSB);
xmnan 0:2b49a387e831 89 }
xmnan 0:2b49a387e831 90
xmnan 0:2b49a387e831 91
xmnan 0:2b49a387e831 92 void MAG3110::setCalibration(int minX, int maxX, int minY, int maxY )
xmnan 0:2b49a387e831 93 {
xmnan 0:2b49a387e831 94 _avgX=(maxX+minX)/2;
xmnan 0:2b49a387e831 95 _avgY=(maxY+minY)/2;
xmnan 0:2b49a387e831 96 }
xmnan 0:2b49a387e831 97
xmnan 0:2b49a387e831 98 void MAG3110::Setdr(float dateRate)
xmnan 0:2b49a387e831 99 {
xmnan 0:2b49a387e831 100 if (dateRate==80)
xmnan 0:2b49a387e831 101 dr=MAG_3110_SAMPLE80;
xmnan 0:2b49a387e831 102 else if(dateRate==40)
xmnan 0:2b49a387e831 103 dr=MAG_3110_SAMPLE40;
xmnan 0:2b49a387e831 104 else if(dateRate==20)
xmnan 0:2b49a387e831 105 dr=MAG_3110_SAMPLE20;
xmnan 0:2b49a387e831 106 else if(dateRate==10)
xmnan 0:2b49a387e831 107 dr=MAG_3110_SAMPLE10;
xmnan 0:2b49a387e831 108 else if(dateRate==5)
xmnan 0:2b49a387e831 109 dr=MAG_3110_SAMPLE5;
xmnan 0:2b49a387e831 110 else if(dateRate==2.5)
xmnan 0:2b49a387e831 111 dr=MAG_3110_SAMPLE2_5;
xmnan 0:2b49a387e831 112 else if(dateRate==1.25)
xmnan 0:2b49a387e831 113 dr=MAG_3110_SAMPLE1_25;
xmnan 0:2b49a387e831 114 else if(dateRate==0.625)
xmnan 0:2b49a387e831 115 dr=MAG_3110_SAMPLE0_625;
xmnan 0:2b49a387e831 116 else
xmnan 0:2b49a387e831 117 dr=MAG_3110_SAMPLE80;
xmnan 0:2b49a387e831 118 }
xmnan 0:2b49a387e831 119
xmnan 0:2b49a387e831 120 void MAG3110::Setosr(int overSample)
xmnan 0:2b49a387e831 121 {
xmnan 0:2b49a387e831 122 switch(overSample)
xmnan 0:2b49a387e831 123 {
xmnan 0:2b49a387e831 124 case 16:osr=MAG_3110_OVERSAMPLE1;break;
xmnan 0:2b49a387e831 125 case 32:osr=MAG_3110_OVERSAMPLE2;break;
xmnan 0:2b49a387e831 126 case 64:osr=MAG_3110_OVERSAMPLE3;break;
xmnan 0:2b49a387e831 127 case 128:osr=MAG_3110_OVERSAMPLE4;break;
xmnan 0:2b49a387e831 128 default:osr=MAG_3110_OVERSAMPLE2;break;
xmnan 0:2b49a387e831 129 }
xmnan 0:2b49a387e831 130 }
xmnan 0:2b49a387e831 131
xmnan 0:2b49a387e831 132 void MAG3110::Overwrite_dr_osr(float dateRate,int overSample)
xmnan 0:2b49a387e831 133 {
xmnan 0:2b49a387e831 134 char cmd[2];
xmnan 0:2b49a387e831 135 Setdr(dateRate);
xmnan 0:2b49a387e831 136 Setosr(overSample);
xmnan 0:2b49a387e831 137 cmd[0] = MAG_CTRL_REG1;
xmnan 0:2b49a387e831 138 cmd[1] = dr+osr+MAG_3110_ACTIVE;
xmnan 0:2b49a387e831 139 _i2c.write(_i2c_address, cmd, 2);
xmnan 0:2b49a387e831 140 }