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
Diff: MS4525DO/MS4525DO.h
- Revision:
- 0:5965bf423184
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/MS4525DO/MS4525DO.h Fri Sep 13 08:41:37 2019 +0000
@@ -0,0 +1,73 @@
+
+#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