HMC58X3 Library

Fork of HMC58X3 by Yifei Teng

Files at this revision

API Documentation at this revision

Comitter:
tyftyftyf
Date:
Sat Nov 02 17:23:23 2013 +0000
Parent:
1:72ecf7399250
Child:
3:1e0e0c47287a
Commit message:
Initial commit

Changed in this revision

HMC58X3.cpp Show annotated file Show diff for this revision Revisions of this file
HMC58X3.h Show annotated file Show diff for this revision Revisions of this file
--- a/HMC58X3.cpp	Mon Jun 24 19:44:55 2013 +0000
+++ b/HMC58X3.cpp	Sat Nov 02 17:23:23 2013 +0000
@@ -42,18 +42,7 @@
 /*!
     Counts/milli-gauss per gain for the self test bias current.
 */
-#if defined(ISHMC5843)
-const int counts_per_milligauss[8]= {
-    1620,
-    1300,
-    970,
-    780,
-    530,
-    460,
-    390,
-    280
-};
-#else // HMC5883L
+
 const int counts_per_milligauss[8]= {
     1370,
     1090,
@@ -64,12 +53,15 @@
     330,
     230
 };
-#endif
+
 
 
 
 /* PUBLIC METHODS */
 
+HMC58X3::HMC58X3():i2c(I2C_SDA,I2C_SCL){
+}
+
 //HMC58X3::HMC58X3(PinName sda, PinName scl): i2c(sda, scl)
 HMC58X3::HMC58X3(I2C i2c_):i2c(i2c_)
 {
@@ -85,7 +77,7 @@
 {
     // note that we don't initialize Wire here.
     // You'll have to do that in setup() in your Arduino program
-    wait_ms(5); // you need to wait at least 5ms after power on to initialize
+    wait_ms(10); // you need to wait at least 5ms after power on to initialize
     if (setmode) {
         setMode(0);
     }
@@ -160,11 +152,11 @@
 */
 bool HMC58X3::calibrate(unsigned char gain,unsigned int n_samples)
 {
-    int xyz[3];                     // 16 bit integer values for each axis.
-    long int xyz_total[3]= {0,0,0}; // 32 bit totals so they won't overflow.
+    int16_t xyz[3];                     // 16 bit integer values for each axis.
+    long xyz_total[3]= {0,0,0}; // 32 bit totals so they won't overflow.
     bool bret=true;                 // Function return value.  Will return false if the wrong identifier is returned, saturation is detected or response is out of range to self test bias.
     char id[3];                     // Three identification registers should return 'H43'.
-    long int low_limit, high_limit;
+    long low_limit, high_limit;
     /*
         Make sure we are talking to the correct device.
         Hard to believe Honeywell didn't change the identifier.
@@ -287,25 +279,26 @@
 void HMC58X3::writeReg(unsigned char reg, unsigned char val)
 {
     i2c.start();
+    i2c.write(HMC58X3_ADDR<<1);
     i2c.write(reg);        // send register address
     i2c.write(val);        // send value to write
     i2c.stop(); //end transmission
 }
 
 
-void HMC58X3::getValues(int *x,int *y,int *z)
+void HMC58X3::getValues(int16_t *x,int16_t *y,int16_t *z)
 {
     float fx,fy,fz;
     getValues(&fx,&fy,&fz);
-    *x= (int) (fx + 0.5);
-    *y= (int) (fy + 0.5);
-    *z= (int) (fz + 0.5);
+    *x= (int16_t) (fx + 0.5);
+    *y= (int16_t) (fy + 0.5);
+    *z= (int16_t) (fz + 0.5);
 }
 
 
 void HMC58X3::getValues(float *x,float *y,float *z)
 {
-    int xr,yr,zr;
+    int16_t xr,yr,zr;
 
     getRaw(&xr, &yr, &zr);
     *x= ((float) xr) / x_scale;
@@ -314,15 +307,15 @@
 }
 
 
-void HMC58X3::getRaw(int *x,int *y,int *z)
+void HMC58X3::getRaw(int16_t *x,int16_t *y,int16_t *z)
 {
 
     char cmd[2];
     char data[6];
     cmd[0] = 0x03;
 
-    i2c.write(I2C_ADDRESS, cmd, 1, true); // set the pointer to the start of x
-    i2c.read(I2C_ADDRESS, data, 6, false);
+    i2c.write(HMC58X3_ADDR<<1, cmd, 1, true); // set the pointer to the start of x
+    i2c.read((HMC58X3_ADDR<<1)+1, data, 6, false);
 
     // read out the 3 values, 2 bytes each.
     *x = int16_t(((unsigned char)data[0] << 8) | (unsigned char)data[1]);
@@ -354,8 +347,11 @@
 void HMC58X3::getID(char id[3])
 {
     i2c.start();
+    i2c.write(HMC58X3_ADDR<<1);
     i2c.write(HMC58X3_R_IDA);             // Will start reading registers starting from Identification Register A.
 
+    i2c.start();
+    i2c.write((HMC58X3_ADDR<<1)+1);
     id[0] = i2c.read(0);
     id[1] = i2c.read(0);
     id[2] = i2c.read(0);
--- a/HMC58X3.h	Mon Jun 24 19:44:55 2013 +0000
+++ b/HMC58X3.h	Sat Nov 02 17:23:23 2013 +0000
@@ -79,20 +79,24 @@
 #define HMC58X3_R_IDB 11
 #define HMC58X3_R_IDC 12
 
+#define I2C_SDA p28
+#define I2C_SCL p27
+
 class HMC58X3
 {
 
 
 public:
     //HMC58X3(PinName sda, PinName scl);
+    HMC58X3();
     HMC58X3(I2C i2c_);
     void init(bool setmode);
     void init(int address, bool setmode);
-    void getValues(int *x,int *y,int *z);
+    void getValues(int16_t *x,int16_t *y,int16_t *z);
     void getValues(float *x,float *y,float *z);
     void getValues(float *xyz);
-    void getRaw(int *x,int *y,int *z);
-    void getRaw(int *xyz);
+    void getRaw(int16_t *x,int16_t *y,int16_t *z);
+    void getRaw(int16_t *xyz);
     void calibrate(unsigned char gain);     // Original calibrate with a few weaknesses.
     bool calibrate(unsigned char gain,unsigned int n_samples);
     void setMode(unsigned char mode);