d

Fork of HMC5883L by GM AT

Committer:
fadi_lad
Date:
Sun Feb 05 23:07:34 2017 +0000
Revision:
1:17f3539e91b0
Parent:
0:cad18db1e431
V1 bracelet

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