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.
Dependencies: mbed Rejestrator
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 }
Generated on Sat Jul 30 2022 15:40:23 by
