mirror of
https://github.com/thooge/esp32-nmea2000-obp60.git
synced 2025-12-16 07:23:07 +01:00
intermediate: support for QMP6988
This commit is contained in:
152
lib/iictask/QMP6988.h
Normal file
152
lib/iictask/QMP6988.h
Normal file
@@ -0,0 +1,152 @@
|
||||
#ifndef __QMP6988_H
|
||||
#define __QMP6988_H
|
||||
|
||||
#include "Arduino.h"
|
||||
#include "Wire.h"
|
||||
|
||||
#define QMP6988_SLAVE_ADDRESS_L (0x70)
|
||||
#define QMP6988_SLAVE_ADDRESS_H (0x56)
|
||||
|
||||
#define QMP6988_U16_t unsigned short
|
||||
#define QMP6988_S16_t short
|
||||
#define QMP6988_U32_t unsigned int
|
||||
#define QMP6988_S32_t int
|
||||
#define QMP6988_U64_t unsigned long long
|
||||
#define QMP6988_S64_t long long
|
||||
|
||||
#define QMP6988_CHIP_ID 0x5C
|
||||
|
||||
#define QMP6988_CHIP_ID_REG 0xD1
|
||||
#define QMP6988_RESET_REG 0xE0 /* Device reset register */
|
||||
#define QMP6988_DEVICE_STAT_REG 0xF3 /* Device state register */
|
||||
#define QMP6988_CTRLMEAS_REG 0xF4 /* Measurement Condition Control Register */
|
||||
/* data */
|
||||
#define QMP6988_PRESSURE_MSB_REG 0xF7 /* Pressure MSB Register */
|
||||
#define QMP6988_TEMPERATURE_MSB_REG 0xFA /* Temperature MSB Reg */
|
||||
|
||||
/* compensation calculation */
|
||||
#define QMP6988_CALIBRATION_DATA_START \
|
||||
0xA0 /* QMP6988 compensation coefficients */
|
||||
#define QMP6988_CALIBRATION_DATA_LENGTH 25
|
||||
|
||||
#define SHIFT_RIGHT_4_POSITION 4
|
||||
#define SHIFT_LEFT_2_POSITION 2
|
||||
#define SHIFT_LEFT_4_POSITION 4
|
||||
#define SHIFT_LEFT_5_POSITION 5
|
||||
#define SHIFT_LEFT_8_POSITION 8
|
||||
#define SHIFT_LEFT_12_POSITION 12
|
||||
#define SHIFT_LEFT_16_POSITION 16
|
||||
|
||||
/* power mode */
|
||||
#define QMP6988_SLEEP_MODE 0x00
|
||||
#define QMP6988_FORCED_MODE 0x01
|
||||
#define QMP6988_NORMAL_MODE 0x03
|
||||
|
||||
#define QMP6988_CTRLMEAS_REG_MODE__POS 0
|
||||
#define QMP6988_CTRLMEAS_REG_MODE__MSK 0x03
|
||||
#define QMP6988_CTRLMEAS_REG_MODE__LEN 2
|
||||
|
||||
/* oversampling */
|
||||
#define QMP6988_OVERSAMPLING_SKIPPED 0x00
|
||||
#define QMP6988_OVERSAMPLING_1X 0x01
|
||||
#define QMP6988_OVERSAMPLING_2X 0x02
|
||||
#define QMP6988_OVERSAMPLING_4X 0x03
|
||||
#define QMP6988_OVERSAMPLING_8X 0x04
|
||||
#define QMP6988_OVERSAMPLING_16X 0x05
|
||||
#define QMP6988_OVERSAMPLING_32X 0x06
|
||||
#define QMP6988_OVERSAMPLING_64X 0x07
|
||||
|
||||
#define QMP6988_CTRLMEAS_REG_OSRST__POS 5
|
||||
#define QMP6988_CTRLMEAS_REG_OSRST__MSK 0xE0
|
||||
#define QMP6988_CTRLMEAS_REG_OSRST__LEN 3
|
||||
|
||||
#define QMP6988_CTRLMEAS_REG_OSRSP__POS 2
|
||||
#define QMP6988_CTRLMEAS_REG_OSRSP__MSK 0x1C
|
||||
#define QMP6988_CTRLMEAS_REG_OSRSP__LEN 3
|
||||
|
||||
/* filter */
|
||||
#define QMP6988_FILTERCOEFF_OFF 0x00
|
||||
#define QMP6988_FILTERCOEFF_2 0x01
|
||||
#define QMP6988_FILTERCOEFF_4 0x02
|
||||
#define QMP6988_FILTERCOEFF_8 0x03
|
||||
#define QMP6988_FILTERCOEFF_16 0x04
|
||||
#define QMP6988_FILTERCOEFF_32 0x05
|
||||
|
||||
#define QMP6988_CONFIG_REG 0xF1 /*IIR filter co-efficient setting Register*/
|
||||
#define QMP6988_CONFIG_REG_FILTER__POS 0
|
||||
#define QMP6988_CONFIG_REG_FILTER__MSK 0x07
|
||||
#define QMP6988_CONFIG_REG_FILTER__LEN 3
|
||||
|
||||
#define SUBTRACTOR 8388608
|
||||
|
||||
typedef struct _qmp6988_cali_data {
|
||||
QMP6988_S32_t COE_a0;
|
||||
QMP6988_S16_t COE_a1;
|
||||
QMP6988_S16_t COE_a2;
|
||||
QMP6988_S32_t COE_b00;
|
||||
QMP6988_S16_t COE_bt1;
|
||||
QMP6988_S16_t COE_bt2;
|
||||
QMP6988_S16_t COE_bp1;
|
||||
QMP6988_S16_t COE_b11;
|
||||
QMP6988_S16_t COE_bp2;
|
||||
QMP6988_S16_t COE_b12;
|
||||
QMP6988_S16_t COE_b21;
|
||||
QMP6988_S16_t COE_bp3;
|
||||
} qmp6988_cali_data_t;
|
||||
|
||||
typedef struct _qmp6988_fk_data {
|
||||
float a0, b00;
|
||||
float a1, a2, bt1, bt2, bp1, b11, bp2, b12, b21, bp3;
|
||||
} qmp6988_fk_data_t;
|
||||
|
||||
typedef struct _qmp6988_ik_data {
|
||||
QMP6988_S32_t a0, b00;
|
||||
QMP6988_S32_t a1, a2;
|
||||
QMP6988_S64_t bt1, bt2, bp1, b11, bp2, b12, b21, bp3;
|
||||
} qmp6988_ik_data_t;
|
||||
|
||||
typedef struct _qmp6988_data {
|
||||
uint8_t slave;
|
||||
uint8_t chip_id;
|
||||
uint8_t power_mode;
|
||||
float temperature;
|
||||
float pressure;
|
||||
float altitude;
|
||||
qmp6988_cali_data_t qmp6988_cali;
|
||||
qmp6988_ik_data_t ik;
|
||||
} qmp6988_data_t;
|
||||
|
||||
class QMP6988 {
|
||||
private:
|
||||
qmp6988_data_t qmp6988;
|
||||
uint8_t slave_addr;
|
||||
TwoWire* device_wire;
|
||||
void delayMS(unsigned int ms);
|
||||
|
||||
// read calibration data from otp
|
||||
int getCalibrationData();
|
||||
QMP6988_S32_t getPressure02e(qmp6988_ik_data_t* ik, QMP6988_S32_t dp,
|
||||
QMP6988_S16_t tx);
|
||||
QMP6988_S16_t convTx02e(qmp6988_ik_data_t* ik, QMP6988_S32_t dt);
|
||||
|
||||
void softwareReset();
|
||||
|
||||
public:
|
||||
uint8_t init(uint8_t slave_addr = 0x56, TwoWire* wire_in = &Wire);
|
||||
uint8_t deviceCheck();
|
||||
|
||||
float calcAltitude(float pressure, float temp);
|
||||
float calcPressure();
|
||||
float calcTemperature();
|
||||
|
||||
void setpPowermode(int power_mode);
|
||||
void setFilter(unsigned char filter);
|
||||
void setOversamplingP(unsigned char oversampling_p);
|
||||
void setOversamplingT(unsigned char oversampling_t);
|
||||
|
||||
uint8_t writeReg(uint8_t slave, uint8_t reg_add, uint8_t reg_dat);
|
||||
uint8_t readData(uint16_t slave, uint8_t reg_add, unsigned char* Read,
|
||||
uint8_t num);
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user