Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
QMC5883L.cpp@43:f459f6efaf5c, 2022-05-31 (annotated)
- Committer:
- pmic
- Date:
- Tue May 31 17:51:34 2022 +0200
- Revision:
- 43:f459f6efaf5c
Introduced QMC5883L driver
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |