V 1.1

Fork of HMC5883L by GM AT

Committer:
fadi_lad
Date:
Tue Jan 03 09:22:45 2017 +0000
Revision:
1:b39752f2d354
Parent:
0:cad18db1e431
V 1.1 bracelet connect?

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gmatjuara 0:cad18db1e431 1 #include "HMC5883L.h"
gmatjuara 0:cad18db1e431 2
fadi_lad 1:b39752f2d354 3 HMC5883L::HMC5883L(PinName sda, PinName scl): i2c(sda, scl)
fadi_lad 1:b39752f2d354 4 {
gmatjuara 0:cad18db1e431 5 //100KHz, as specified by the datasheet.
fadi_lad 1:b39752f2d354 6 char rx;
gmatjuara 0:cad18db1e431 7
gmatjuara 0:cad18db1e431 8
fadi_lad 1:b39752f2d354 9 i2c.frequency(100000);
fadi_lad 1:b39752f2d354 10 //Testar depois com 400KHz
fadi_lad 1:b39752f2d354 11 //==========================================================================================================
fadi_lad 1:b39752f2d354 12 // Read chip_id
fadi_lad 1:b39752f2d354 13 //==========================================================================================================
fadi_lad 1:b39752f2d354 14 rx = Read(HMC5883L_IDENT_A);
fadi_lad 1:b39752f2d354 15 if (rx != 0x48)//ID do chip
fadi_lad 1:b39752f2d354 16 printf("\ninvalid chip id %d\r\n", rx);
fadi_lad 1:b39752f2d354 17
fadi_lad 1:b39752f2d354 18 //==========================================================================================================
fadi_lad 1:b39752f2d354 19 // Let's set the Configuration Register A
fadi_lad 1:b39752f2d354 20 //==========================================================================================================
fadi_lad 1:b39752f2d354 21 // This register set's the number of samples averaged per measurement output, the rate at which data is written
fadi_lad 1:b39752f2d354 22 // to all three data output registers and the measurement flow of the device.
fadi_lad 1:b39752f2d354 23 // -------------------------------------------------------
fadi_lad 1:b39752f2d354 24 // |CRA7 CRA6 CRA5 CRA4 CRA3 CRA2 CRA1 CRA0 |
fadi_lad 1:b39752f2d354 25 // |(1) MA1(1) MA0(1) DO2(1) DO1(0) DO0(0) MS1(0) MS0(0)| -> This is the default value
fadi_lad 1:b39752f2d354 26 // -------------------------------------------------------
fadi_lad 1:b39752f2d354 27 // CRA7 -> we have to clear this bit for correct operation (0)
fadi_lad 1:b39752f2d354 28 // CRA6 to CRA5 -> Let's select the maximum number of samples averaged per measurement output (11)
fadi_lad 1:b39752f2d354 29 // CRA4 to CRA2 -> Also let's select the maximum data output rate (110)
fadi_lad 1:b39752f2d354 30 // CRA1 to CRA0 -> The measurement flow is defined to normal (00)
fadi_lad 1:b39752f2d354 31 // -------------------------------------------------------
fadi_lad 1:b39752f2d354 32 // |CRA7 CRA6 CRA5 CRA4 CRA3 CRA2 CRA1 CRA0 |
fadi_lad 1:b39752f2d354 33 // |(0) MA1(1) MA0(1) DO2(1) DO1(1) DO0(0) MS1(0) MS0(0)| -> This is the new value, 0x78 in hex
fadi_lad 1:b39752f2d354 34 // -------------------------------------------------------
fadi_lad 1:b39752f2d354 35 //Write(HMC5883L_CONFIG_A,0x78);
fadi_lad 1:b39752f2d354 36 //Write(HMC5883L_CONFIG_A,0x70);
fadi_lad 1:b39752f2d354 37
fadi_lad 1:b39752f2d354 38 //==========================================================================================================
fadi_lad 1:b39752f2d354 39 // The Configuration Register B is set to 0010 0000 by default, this is a +/- 1.3 Ga sensor field range and
fadi_lad 1:b39752f2d354 40 // the gain of LSB/gauss is 1090. This is the maximum value, so let's leave it like that.
fadi_lad 1:b39752f2d354 41 //==========================================================================================================
fadi_lad 1:b39752f2d354 42 //Datasheet page 13. I will explain later
fadi_lad 1:b39752f2d354 43 //Write(HMC5883L_CONFIG_B,0x20);
fadi_lad 1:b39752f2d354 44 //Write(HMC5883L_CONFIG_B,0xA0);
fadi_lad 1:b39752f2d354 45
fadi_lad 1:b39752f2d354 46 //==========================================================================================================
fadi_lad 1:b39752f2d354 47 // Let's set the Mode Register
fadi_lad 1:b39752f2d354 48 //==========================================================================================================
fadi_lad 1:b39752f2d354 49 // This register set's the operation mode, from continuous-measurements mode, single-measurement mode and idle mode.
fadi_lad 1:b39752f2d354 50 // We will set to Continuouse-measurement mode, so the device continuously performs measurements and places the
fadi_lad 1:b39752f2d354 51 // result in the data register
fadi_lad 1:b39752f2d354 52 // ---------------------------------------------
fadi_lad 1:b39752f2d354 53 // |MR7 MR6 MR5 MR4 MR3 MR2 MR1 MR0 | -> This is the new value, 0x78 in hex, we are going to change
fadi_lad 1:b39752f2d354 54 // |(1) (0) (0) (0) (0) (0) MD1(0) MD0(1)| the MD1 and MD0 to 00 and clear the MR7 for correct operation.
fadi_lad 1:b39752f2d354 55 // --------------------------------------------- The final value is 0000 0000 (0x00).
fadi_lad 1:b39752f2d354 56 Write(HMC5883L_MODE,0x00);
gmatjuara 0:cad18db1e431 57 }
gmatjuara 0:cad18db1e431 58
gmatjuara 0:cad18db1e431 59
fadi_lad 1:b39752f2d354 60 void HMC5883L::Write(char reg_address, char data)
fadi_lad 1:b39752f2d354 61 {
fadi_lad 1:b39752f2d354 62 char tx[2];
fadi_lad 1:b39752f2d354 63 tx[0]=reg_address;
fadi_lad 1:b39752f2d354 64 tx[1]=data;
fadi_lad 1:b39752f2d354 65
fadi_lad 1:b39752f2d354 66 i2c.write(HMC5883L_I2C_WRITE,tx,2);
fadi_lad 1:b39752f2d354 67 }
fadi_lad 1:b39752f2d354 68
fadi_lad 1:b39752f2d354 69 char HMC5883L::Read(char data)
fadi_lad 1:b39752f2d354 70 {
fadi_lad 1:b39752f2d354 71 char tx = data;
fadi_lad 1:b39752f2d354 72 char rx;
fadi_lad 1:b39752f2d354 73
fadi_lad 1:b39752f2d354 74 i2c.write(HMC5883L_I2C_WRITE, &tx, 1);
fadi_lad 1:b39752f2d354 75 i2c.read(HMC5883L_I2C_READ, &rx, 1);
fadi_lad 1:b39752f2d354 76 return rx;
fadi_lad 1:b39752f2d354 77 }
fadi_lad 1:b39752f2d354 78
fadi_lad 1:b39752f2d354 79 void HMC5883L::MultiByteRead(char address, char* output, int size)
fadi_lad 1:b39752f2d354 80 {
fadi_lad 1:b39752f2d354 81 i2c.write(HMC5883L_I2C_WRITE, &address, 1); //tell it where to read from
fadi_lad 1:b39752f2d354 82 i2c.read(HMC5883L_I2C_READ, output, size); //tell it where to store the data read
gmatjuara 0:cad18db1e431 83 }
gmatjuara 0:cad18db1e431 84
fadi_lad 1:b39752f2d354 85 float HMC5883L::getMx()
fadi_lad 1:b39752f2d354 86 {
fadi_lad 1:b39752f2d354 87 //return (x * m_Scale);
fadi_lad 1:b39752f2d354 88 char lsb_byte = 0;
fadi_lad 1:b39752f2d354 89 signed short msb_byte;
fadi_lad 1:b39752f2d354 90
fadi_lad 1:b39752f2d354 91 lsb_byte = Read(HMC5883L_X_MSB);
fadi_lad 1:b39752f2d354 92 msb_byte = lsb_byte << 8;
fadi_lad 1:b39752f2d354 93 msb_byte |= Read(HMC5883L_X_LSB);
fadi_lad 1:b39752f2d354 94 return (float)msb_byte;
fadi_lad 1:b39752f2d354 95 /*
fadi_lad 1:b39752f2d354 96 char tx[1];
fadi_lad 1:b39752f2d354 97 char rx[2];
gmatjuara 0:cad18db1e431 98
gmatjuara 0:cad18db1e431 99
fadi_lad 1:b39752f2d354 100 tx[0]=HMC5883L_X_MSB;
fadi_lad 1:b39752f2d354 101 i2c.write(HMC5883L_I2C_READ,tx,1);
fadi_lad 1:b39752f2d354 102 i2c.read(HMC5883L_I2C_READ,rx,2);
fadi_lad 1:b39752f2d354 103 return ((int)rx[0]<<8|(int)rx[1]);
fadi_lad 1:b39752f2d354 104 */
fadi_lad 1:b39752f2d354 105
fadi_lad 1:b39752f2d354 106 }
gmatjuara 0:cad18db1e431 107
fadi_lad 1:b39752f2d354 108 float HMC5883L::getMy()
fadi_lad 1:b39752f2d354 109 {
fadi_lad 1:b39752f2d354 110 //return (y * m_Scale);
fadi_lad 1:b39752f2d354 111
fadi_lad 1:b39752f2d354 112 char lsb_byte = 0;
fadi_lad 1:b39752f2d354 113 signed short msb_byte;
fadi_lad 1:b39752f2d354 114
fadi_lad 1:b39752f2d354 115 lsb_byte = Read(HMC5883L_Y_MSB);
fadi_lad 1:b39752f2d354 116 msb_byte = lsb_byte << 8;
fadi_lad 1:b39752f2d354 117 msb_byte |= Read(HMC5883L_Y_LSB);
fadi_lad 1:b39752f2d354 118 return (float)msb_byte;
gmatjuara 0:cad18db1e431 119 }
gmatjuara 0:cad18db1e431 120
gmatjuara 0:cad18db1e431 121
fadi_lad 1:b39752f2d354 122 float HMC5883L::getMz()
fadi_lad 1:b39752f2d354 123 {
fadi_lad 1:b39752f2d354 124 //return (z * m_Scale);
gmatjuara 0:cad18db1e431 125
fadi_lad 1:b39752f2d354 126 char lsb_byte = 0;
fadi_lad 1:b39752f2d354 127 signed short msb_byte;
gmatjuara 0:cad18db1e431 128
fadi_lad 1:b39752f2d354 129 lsb_byte = Read(HMC5883L_Z_MSB);
fadi_lad 1:b39752f2d354 130 msb_byte = lsb_byte << 8;
fadi_lad 1:b39752f2d354 131 msb_byte |= Read(HMC5883L_Z_LSB);
fadi_lad 1:b39752f2d354 132 return (float)msb_byte;
fadi_lad 1:b39752f2d354 133 }