Kim Youngsik / Mbed 2 deprecated 0SAS_FCC_V12

Dependencies:   MPU6050 mbed

Fork of 0SAS_FCC_V11 by Kim Youngsik

Committer:
skyyoungsik
Date:
Mon Apr 16 07:16:00 2018 +0000
Revision:
0:a1ad0eb8b619
zg

Who changed what in which revision?

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