Library and demo program for MS4525DO differential pressure sensor based pitot tube, using I2C interface
Temperature values are correct. But I dont trust the PSI and airspeed (especially airspeed).
Code blended and ported from a combination of the following sources:
- https://forum.arduino.cc/index.php?topic=309653.0
- https://github.com/PX4/Firmware/blob/master/src/modules/commander/airspeed_calibration.cpp
- https://github.com/PX4/Firmware/tree/master/src/drivers/differential_pressure/ms4525
MS4525DO/MS4525DO.h
- Committer:
- epremeaux
- Date:
- 2019-09-13
- Revision:
- 0:5965bf423184
File content as of revision 0:5965bf423184:
#ifndef MS4525DO_H
#define MS4525DO_H
#include "mbed.h"
#define I2C_ADDRESS_MS4525DO 0x28 /**< 7-bit address =0x28. 8-bit is 0x50. Depends on the order code (this is for code "I") */
/* Register address */
#define ADDR_READ_MR 0x00 /* write to this address to start conversion */
// MS4525D sensor full scale range and units
const int16_t MS4525FullScaleRange = 1; // 1 psi
// MS4525D Sensor type (A or B) comment out the wrong type assignments
// Type A (10% to 90%)
const int16_t MS4525MinScaleCounts = 1638;
const int16_t MS4525FullScaleCounts = 14746;
const int16_t MS4525Span=MS4525FullScaleCounts-MS4525MinScaleCounts;
//MS4525D sensor pressure style, differential or otherwise. Comment out the wrong one.
//Differential
const int16_t MS4525ZeroCounts=(MS4525MinScaleCounts+MS4525FullScaleCounts)/2;
class MS4525DO
{
public:
// instance methods
// explicit I2C pin names
MS4525DO(PinName sda, PinName sck, char slave_adr = I2C_ADDRESS_MS4525DO);
// pin names as an object (ideal when sharing the bus)
MS4525DO(I2C &i2c_obj, char slave_adr = I2C_ADDRESS_MS4525DO);
virtual ~MS4525DO();
// public functions
void initialize(void);
int measure(void); // returns status of measurement
float getPSI(void); // returns the PSI of last measurement
float getTemperature(void); // returns temperature of last measurement
float getAirSpeed(void); // calculates and returns the airspeed
int calibrate(void); // attempts to calibrate and returns a status code
private:
I2C *i2c_p;
I2C &i2c;
char address;
char _status;
float psi;
float temperature;
float airspeed;
uint16_t P_dat; // 14 bit pressure data
uint16_t T_dat; // 11 bit temperature data
// private functions
int collect(void);
char fetch_pressure(uint16_t &P_dat, uint16_t &T_dat);
}; // end of the class
/** airspeed scaling factors; out = (in * Vscale) + offset */
struct airspeed_scale {
float offset_pa;
float scale;
};
#endif
Emery Premeaux