J&W / Mbed 2 deprecated Rejestrator

Dependencies:   mbed Rejestrator

Dependents:   Rejestrator

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MAG3110.cpp Source File

MAG3110.cpp

00001 
00002 #include "MAG3110.h"
00003 #include "mbed.h"
00004 /* 
00005  Mag regs: FF FC 5B 02 8A 0C EA C4 02 00 00 00 00 00 00 00 19 00 5F FF .
00006 64601 650 3306
00007 
00008 FF 
00009 x FB B9 
00010 y 01 21 
00011 z 0D 44 
00012 id C4 
00013 System mode 02 
00014 off x 00 00 
00015 off y 00 00 
00016 off z 00 00 
00017 temp 00 
00018 ctrl reg1 19 
00019 ctrl reg2 00 
00020 BF FF .
00021 */
00022 
00023 /******************************************************************************
00024  * Constructors
00025  ******************************************************************************/
00026 MAG3110::MAG3110(PinName sda, PinName scl, int i2c_adr): _i2c(sda, scl), 
00027     _i2c_address(i2c_adr<<1)
00028 { 
00029     begin();
00030 }
00031 
00032 void MAG3110::begin(void)
00033 {
00034     char cmd[2];
00035 
00036     cmd[0] = MAG_CTRL_REG2;
00037     cmd[1] = MAG_3110_MAG_RST;
00038     _i2c.write(_i2c_address, cmd, 2);
00039 
00040     cmd[0] = MAG_CTRL_REG1;
00041     cmd[1] = MAG_3110_SAMPLE80 + MAG_3110_OVERSAMPLE3 + MAG_3110_ACTIVE;
00042     _i2c.write(_i2c_address, cmd, 2);
00043     
00044     cmd[0] = MAG_WHO_AM_I;
00045     _i2c.write(_i2c_address, cmd, 1);
00046     cmd[0] = 0x00;
00047     _i2c.read(_i2c_address, cmd, 1);
00048 //    if (cmd[0] == MAG_3110_WHO_AM_I_VALUE)
00049     
00050     // No adjustment initially
00051     _avgX = 0;
00052     _avgY = 0;
00053 }
00054 
00055 // Read a single byte form 8 bit register, return as int
00056 int MAG3110::readReg(char regAddr)
00057 {
00058     char cmd[1];
00059 
00060     cmd[0] = regAddr;
00061     _i2c.write(_i2c_address, cmd, 1);
00062 
00063     cmd[0] = 0x00;
00064     _i2c.read(_i2c_address, cmd, 1);
00065     return (int)( cmd[0]);
00066 }
00067 
00068 
00069 // read a register per, pass first reg value, reading 2 bytes increments register
00070 // Reads MSB first then LSB
00071 int16_t MAG3110::readVal(char regAddr)
00072 {
00073     char cmd[2];
00074 
00075     cmd[0] = regAddr;
00076     _i2c.write(_i2c_address, cmd, 1);
00077 
00078     cmd[0] = 0x00;
00079     cmd[1] = 0x00;
00080     _i2c.read(_i2c_address, cmd, 2);
00081     return (int)( (cmd[1]|(cmd[0] << 8))); //concatenate the MSB and LSB
00082 }
00083 
00084 
00085 int MAG3110::readAll(char *buffer)
00086 {
00087     char cmd[2];
00088 
00089     cmd[0] = 0;
00090     _i2c.write(_i2c_address, cmd, 1);
00091 
00092     _i2c.read(_i2c_address, buffer, 20);
00093     return (int)buffer[0]; //status
00094 }
00095     
00096 float MAG3110::getHeading()
00097 {
00098     int xVal = readVal(MAG_OUT_X_MSB);
00099     int yVal = readVal(MAG_OUT_Y_MSB);
00100     return (atan2((double)(yVal - _avgY),(double)(xVal - _avgX)))*180./PI;
00101 }
00102 
00103 void MAG3110::getValues(int *xVal, int *yVal, int *zVal)
00104 {
00105     *xVal = readVal(MAG_OUT_X_MSB);
00106     *yVal = readVal(MAG_OUT_Y_MSB);
00107     *zVal = readVal(MAG_OUT_Z_MSB);
00108 }
00109 
00110 
00111 void MAG3110::setCalibration(int minX, int maxX, int minY, int maxY )
00112 {
00113     _avgX=(maxX+minX)/2;
00114     _avgY=(maxY+minY)/2;
00115 }
00116 
00117 
00118 int8_t MAG3110::getTemperature(void)
00119 {
00120     return (int8_t)readVal(MAG_DIE_TEMP);
00121 }