153 lines
4.4 KiB
C++
153 lines
4.4 KiB
C++
#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
|