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