Michael Ernst Peter / Mbed OS Test_GPS

Dependencies:   Eigen

Committer:
pmic
Date:
Tue May 31 17:51:34 2022 +0200
Revision:
43:f459f6efaf5c
Introduced QMC5883L driver

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pmic 43:f459f6efaf5c 1 #include "QMC5883L.h"
pmic 43:f459f6efaf5c 2
pmic 43:f459f6efaf5c 3 QMC5883L::QMC5883L(I2C& i2c): i2c(i2c)
pmic 43:f459f6efaf5c 4 {
pmic 43:f459f6efaf5c 5 init();
pmic 43:f459f6efaf5c 6 }
pmic 43:f459f6efaf5c 7
pmic 43:f459f6efaf5c 8 void QMC5883L::readMag()
pmic 43:f459f6efaf5c 9 {
pmic 43:f459f6efaf5c 10 mag_val[0] = getMagXvalue();
pmic 43:f459f6efaf5c 11 mag_val[1] = getMagYvalue();
pmic 43:f459f6efaf5c 12 mag_val[2] = getMagZvalue();
pmic 43:f459f6efaf5c 13 }
pmic 43:f459f6efaf5c 14
pmic 43:f459f6efaf5c 15 float QMC5883L::magX()
pmic 43:f459f6efaf5c 16 {
pmic 43:f459f6efaf5c 17 return scale * static_cast<float>( mag_val[0] );
pmic 43:f459f6efaf5c 18 }
pmic 43:f459f6efaf5c 19
pmic 43:f459f6efaf5c 20 float QMC5883L::magY()
pmic 43:f459f6efaf5c 21 {
pmic 43:f459f6efaf5c 22 return scale * static_cast<float>( mag_val[1] );
pmic 43:f459f6efaf5c 23 }
pmic 43:f459f6efaf5c 24
pmic 43:f459f6efaf5c 25 float QMC5883L::magZ()
pmic 43:f459f6efaf5c 26 {
pmic 43:f459f6efaf5c 27 return scale * static_cast<float>( mag_val[2] );
pmic 43:f459f6efaf5c 28 }
pmic 43:f459f6efaf5c 29
pmic 43:f459f6efaf5c 30 void QMC5883L::init()
pmic 43:f459f6efaf5c 31 {
pmic 43:f459f6efaf5c 32 scale = 1.97e-4f; // 31.05.2022, based on experiment so it fits the former mag scaling (norm approx. 0.31)
pmic 43:f459f6efaf5c 33 QMC5883L_WriteByte(CONTROL_A, 0x1D); // OSR: 512, RNG: 8G, ODR: 200 Hz, MODE: cont. (betaflight and inav)
pmic 43:f459f6efaf5c 34 //QMC5883L_WriteByte(CONTROL_A, 0x59); // OSR: 256, RNG: 8G, ODR: 100 Hz, MODE: cont.
pmic 43:f459f6efaf5c 35 QMC5883L_WriteByte(SET_RESET, 0x01);
pmic 43:f459f6efaf5c 36 thread_sleep_for(10);
pmic 43:f459f6efaf5c 37 }
pmic 43:f459f6efaf5c 38
pmic 43:f459f6efaf5c 39 int16_t QMC5883L::getMagXvalue()
pmic 43:f459f6efaf5c 40 {
pmic 43:f459f6efaf5c 41 uint8_t LoByte, HiByte;
pmic 43:f459f6efaf5c 42 LoByte = QMC5883L_ReadByte(OUT_Y_LSB); // x and y are swapped
pmic 43:f459f6efaf5c 43 HiByte = QMC5883L_ReadByte(OUT_Y_MSB);
pmic 43:f459f6efaf5c 44 return((HiByte<<8) | LoByte);
pmic 43:f459f6efaf5c 45 }
pmic 43:f459f6efaf5c 46
pmic 43:f459f6efaf5c 47
pmic 43:f459f6efaf5c 48 int16_t QMC5883L::getMagYvalue()
pmic 43:f459f6efaf5c 49 {
pmic 43:f459f6efaf5c 50 uint8_t LoByte, HiByte;
pmic 43:f459f6efaf5c 51 LoByte = QMC5883L_ReadByte(OUT_X_LSB); // x and y are swapped
pmic 43:f459f6efaf5c 52 HiByte = QMC5883L_ReadByte(OUT_X_MSB);
pmic 43:f459f6efaf5c 53 return ((HiByte<<8) | LoByte);
pmic 43:f459f6efaf5c 54 }
pmic 43:f459f6efaf5c 55
pmic 43:f459f6efaf5c 56 int16_t QMC5883L::getMagZvalue()
pmic 43:f459f6efaf5c 57 {
pmic 43:f459f6efaf5c 58 uint8_t LoByte, HiByte;
pmic 43:f459f6efaf5c 59 LoByte = QMC5883L_ReadByte(OUT_Z_LSB);
pmic 43:f459f6efaf5c 60 HiByte = QMC5883L_ReadByte(OUT_Z_MSB);
pmic 43:f459f6efaf5c 61 return ((HiByte<<8) | LoByte);
pmic 43:f459f6efaf5c 62 }
pmic 43:f459f6efaf5c 63
pmic 43:f459f6efaf5c 64 uint8_t QMC5883L::QMC5883L_ReadByte(uint8_t QMC5883L_reg)
pmic 43:f459f6efaf5c 65 {
pmic 43:f459f6efaf5c 66 char data_out[1], data_in[1];
pmic 43:f459f6efaf5c 67 data_out[0] = QMC5883L_reg;
pmic 43:f459f6efaf5c 68 i2c.write(QMC5883L_ADDRESS, data_out, 1, 1);
pmic 43:f459f6efaf5c 69 i2c.read(QMC5883L_ADDRESS, data_in, 1, 0);
pmic 43:f459f6efaf5c 70 return (data_in[0]);
pmic 43:f459f6efaf5c 71 }
pmic 43:f459f6efaf5c 72
pmic 43:f459f6efaf5c 73 void QMC5883L::QMC5883L_WriteByte(uint8_t QMC5883L_reg, uint8_t QMC5883L_data)
pmic 43:f459f6efaf5c 74 {
pmic 43:f459f6efaf5c 75 char data_out[2];
pmic 43:f459f6efaf5c 76 data_out[0] = QMC5883L_reg;
pmic 43:f459f6efaf5c 77 data_out[1] = QMC5883L_data;
pmic 43:f459f6efaf5c 78 i2c.write(QMC5883L_ADDRESS, data_out, 2, 0);
pmic 43:f459f6efaf5c 79 }