David Wahl / KellerDruck_pressure

Dependents:   TestBenchSerenity-proto_F429ZI TestBenchFlow HSPFLOW1 TestBenchFlow1 ... more

Committer:
dmwahl
Date:
Thu Apr 05 16:04:45 2018 +0000
Revision:
7:6bca43eedca6
Parent:
6:deb4008b136e
Child:
8:0d45e94faf0f
Added readP function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dmwahl 6:deb4008b136e 1 ///-----------------------------------------------------------------
dmwahl 6:deb4008b136e 2 /// Description: Read from Keller-Druck I2C pressure sensor
dmwahl 6:deb4008b136e 3 /// Author: David Wahl
dmwahl 6:deb4008b136e 4 /// Date: 28-FEB-2018
dmwahl 6:deb4008b136e 5 /// Notes: Initial release
dmwahl 6:deb4008b136e 6 ///
dmwahl 6:deb4008b136e 7 /// Revision History:
dmwahl 6:deb4008b136e 8 /// Name: Date: Description:
dmwahl 6:deb4008b136e 9 ///-----------------------------------------------------------------
dmwahl 6:deb4008b136e 10
dmwahl 6:deb4008b136e 11
dmwahl 3:1a0add40e308 12 // Sample code
dmwahl 5:3ac90d95062a 13 /*
dmwahl 5:3ac90d95062a 14 #include <mbed.h>
dmwahl 5:3ac90d95062a 15 #include "keller_pressure.h"
dmwahl 5:3ac90d95062a 16
dmwahl 5:3ac90d95062a 17 DigitalOut myled(LED1);
dmwahl 5:3ac90d95062a 18 Serial pc(SERIAL_TX, SERIAL_RX);
dmwahl 5:3ac90d95062a 19
dmwahl 5:3ac90d95062a 20 // an I2C sub-class that provides a constructed default
dmwahl 5:3ac90d95062a 21 class I2CPreInit : public I2C
dmwahl 5:3ac90d95062a 22 {
dmwahl 5:3ac90d95062a 23 public:
dmwahl 5:3ac90d95062a 24 I2CPreInit(PinName sda, PinName scl, int freq) : I2C(sda, scl) {
dmwahl 5:3ac90d95062a 25 frequency(freq);
dmwahl 5:3ac90d95062a 26 };
dmwahl 5:3ac90d95062a 27 };
dmwahl 5:3ac90d95062a 28 //I2CPreInit gI2C1(I2C_SDA, I2C_SCL, I2C frequency);
dmwahl 6:deb4008b136e 29 I2CPreInit i2c(PB_9, PB_8, 100000);
dmwahl 5:3ac90d95062a 30 KELLER_PRESSURE pumpP(i2c, 0x40);
dmwahl 5:3ac90d95062a 31
dmwahl 5:3ac90d95062a 32 int main()
dmwahl 5:3ac90d95062a 33 {
dmwahl 6:deb4008b136e 34 pc.baud(115200);
dmwahl 5:3ac90d95062a 35 pc.printf("Starting up...\n\r");
dmwahl 5:3ac90d95062a 36 if (pumpP.isAvailable()) {
dmwahl 5:3ac90d95062a 37 pc.printf("ACK\r\n");
dmwahl 5:3ac90d95062a 38 pumpP.readPT();
dmwahl 5:3ac90d95062a 39 pc.printf("Pmin: %.03f Pmax: %.03f\r\n", pumpP.pmin, pumpP.pmax);
dmwahl 5:3ac90d95062a 40 pc.printf("Year: %d Month: %d Day: %d Mode: %d\r\n", pumpP.year, pumpP.month, pumpP.day, pumpP.mode);
dmwahl 5:3ac90d95062a 41 pc.printf("Status: 0x%x\r\n", pumpP.getStatus());
dmwahl 5:3ac90d95062a 42 pc.printf("%.02fkPa %.02fpsi %.02fC\r\n", pumpP.pressureKPA, pumpP.pressurePSI, pumpP.temperatureC);
dmwahl 5:3ac90d95062a 43 }
dmwahl 5:3ac90d95062a 44 while (1) {
dmwahl 5:3ac90d95062a 45 // Main loop
dmwahl 5:3ac90d95062a 46 if (pumpP.isAvailable()) {
dmwahl 5:3ac90d95062a 47 pumpP.readPT();
dmwahl 5:3ac90d95062a 48 pc.printf("%.02fkPa %.02fpsi %.02fC\r\n", pumpP.pressureKPA, pumpP.pressurePSI, pumpP.temperatureC);
dmwahl 5:3ac90d95062a 49 }
dmwahl 5:3ac90d95062a 50 wait(1);
dmwahl 5:3ac90d95062a 51 }
dmwahl 5:3ac90d95062a 52 }
dmwahl 5:3ac90d95062a 53 */
dmwahl 3:1a0add40e308 54 // End sample code
dmwahl 3:1a0add40e308 55
dmwahl 0:fc5c10fc5a05 56 #include "keller_pressure.h"
dmwahl 3:1a0add40e308 57 union {
dmwahl 3:1a0add40e308 58 char c[4];
dmwahl 3:1a0add40e308 59 float f;
dmwahl 3:1a0add40e308 60 } u;
dmwahl 0:fc5c10fc5a05 61
dmwahl 3:1a0add40e308 62 //===========================================================================
dmwahl 0:fc5c10fc5a05 63 // Default constructor, input is the I2C address followed by min/max pressures (psi)
dmwahl 0:fc5c10fc5a05 64 KELLER_PRESSURE::KELLER_PRESSURE(I2C &i2c, int i2cAddress) : i2c(i2c), mi2cAddress(i2cAddress << 1)
dmwahl 3:1a0add40e308 65 //===========================================================================
dmwahl 0:fc5c10fc5a05 66 {
dmwahl 0:fc5c10fc5a05 67 readUserInfo();
dmwahl 0:fc5c10fc5a05 68 };
dmwahl 0:fc5c10fc5a05 69
dmwahl 3:1a0add40e308 70 //===========================================================================
dmwahl 0:fc5c10fc5a05 71 KELLER_PRESSURE::~KELLER_PRESSURE()
dmwahl 3:1a0add40e308 72 //===========================================================================
dmwahl 0:fc5c10fc5a05 73 {
dmwahl 0:fc5c10fc5a05 74 }
dmwahl 0:fc5c10fc5a05 75
dmwahl 3:1a0add40e308 76 //===========================================================================
dmwahl 0:fc5c10fc5a05 77 // Write out a single address byte to I2C bus, if the sensor returns an ACK the function returns true.
dmwahl 0:fc5c10fc5a05 78 bool KELLER_PRESSURE::isAvailable()
dmwahl 3:1a0add40e308 79 //===========================================================================
dmwahl 0:fc5c10fc5a05 80 {
dmwahl 0:fc5c10fc5a05 81 uint8_t i = false;
dmwahl 0:fc5c10fc5a05 82 i2c.start();
dmwahl 0:fc5c10fc5a05 83 i = i2c.write(mi2cAddress|I2C_WRITE);
dmwahl 0:fc5c10fc5a05 84 i2c.stop();
dmwahl 0:fc5c10fc5a05 85 if (i == 1) {
dmwahl 0:fc5c10fc5a05 86 return true;
dmwahl 0:fc5c10fc5a05 87 } else {
dmwahl 0:fc5c10fc5a05 88 return false;
dmwahl 0:fc5c10fc5a05 89 }
dmwahl 0:fc5c10fc5a05 90 }
dmwahl 0:fc5c10fc5a05 91
dmwahl 3:1a0add40e308 92 //===========================================================================
dmwahl 3:1a0add40e308 93 // Read out status byte from sensor. First byte after any read request is status,
dmwahl 3:1a0add40e308 94 // following bytes are pressure/temperature.
dmwahl 0:fc5c10fc5a05 95 char KELLER_PRESSURE::getStatus()
dmwahl 3:1a0add40e308 96 //===========================================================================
dmwahl 0:fc5c10fc5a05 97 {
dmwahl 0:fc5c10fc5a05 98 char result = 0xFF;
dmwahl 0:fc5c10fc5a05 99 i2c.start();
dmwahl 0:fc5c10fc5a05 100 i2c.write(mi2cAddress|I2C_READ);
dmwahl 0:fc5c10fc5a05 101 result = i2c.read(0);
dmwahl 0:fc5c10fc5a05 102 i2c.stop();
dmwahl 0:fc5c10fc5a05 103 return result;
dmwahl 0:fc5c10fc5a05 104 }
dmwahl 0:fc5c10fc5a05 105
dmwahl 3:1a0add40e308 106 //===========================================================================
dmwahl 3:1a0add40e308 107 // Read pressure and temperature. Return 1 if error, 0 if OK.
dmwahl 3:1a0add40e308 108 // Byte 1: status, Bytes 2-3: pressure, Bytes 4-5: temperature
dmwahl 3:1a0add40e308 109 char KELLER_PRESSURE::readPT()
dmwahl 3:1a0add40e308 110 //===========================================================================
dmwahl 0:fc5c10fc5a05 111 {
dmwahl 3:1a0add40e308 112 char error = 0;
dmwahl 0:fc5c10fc5a05 113 char data[5];
dmwahl 3:1a0add40e308 114
dmwahl 3:1a0add40e308 115 error |= _read_multibyte(KELLER_PRESSURE_REQUEST_MEASUREMENT, data, 5);
dmwahl 0:fc5c10fc5a05 116 status = data[0];
dmwahl 0:fc5c10fc5a05 117 pressure = (data[1] << 8) | data[2];
dmwahl 0:fc5c10fc5a05 118 temperature = (data[3] << 8) | data[4];
dmwahl 1:805ee7853062 119
dmwahl 0:fc5c10fc5a05 120 pressureBAR = ((pressure - 16384)*(pmax-pmin))/32768+pmin;
dmwahl 0:fc5c10fc5a05 121 pressurePSI = pressureBAR*14.5038;
dmwahl 0:fc5c10fc5a05 122 pressureKPA = pressureBAR*100;
dmwahl 1:805ee7853062 123
dmwahl 0:fc5c10fc5a05 124 temperatureC = (temperature - 384)*0.003125-50;
dmwahl 0:fc5c10fc5a05 125 temperatureF = (temperatureC*1.8+32);
dmwahl 3:1a0add40e308 126 return error;
dmwahl 0:fc5c10fc5a05 127 }
dmwahl 0:fc5c10fc5a05 128
dmwahl 3:1a0add40e308 129 //===========================================================================
dmwahl 7:6bca43eedca6 130 // Read pressure only. Return 1 if error, 0 if OK.
dmwahl 7:6bca43eedca6 131 // Byte 1: status, Bytes 2-3: pressure
dmwahl 7:6bca43eedca6 132 char KELLER_PRESSURE::readP()
dmwahl 7:6bca43eedca6 133 //===========================================================================
dmwahl 7:6bca43eedca6 134 {
dmwahl 7:6bca43eedca6 135 char error = 0;
dmwahl 7:6bca43eedca6 136 char data[3];
dmwahl 7:6bca43eedca6 137
dmwahl 7:6bca43eedca6 138 error |= _read_multibyte(KELLER_PRESSURE_REQUEST_MEASUREMENT, data, 3);
dmwahl 7:6bca43eedca6 139 status = data[0];
dmwahl 7:6bca43eedca6 140 pressure = (data[1] << 8) | data[2];
dmwahl 7:6bca43eedca6 141
dmwahl 7:6bca43eedca6 142 pressureBAR = ((pressure - 16384)*(pmax-pmin))/32768+pmin;
dmwahl 7:6bca43eedca6 143 pressurePSI = pressureBAR*14.5038;
dmwahl 7:6bca43eedca6 144 pressureKPA = pressureBAR*100;
dmwahl 7:6bca43eedca6 145
dmwahl 7:6bca43eedca6 146 return error;
dmwahl 7:6bca43eedca6 147 }
dmwahl 7:6bca43eedca6 148
dmwahl 7:6bca43eedca6 149 //===========================================================================
dmwahl 3:1a0add40e308 150 char KELLER_PRESSURE::readUserInfo()
dmwahl 3:1a0add40e308 151 //===========================================================================
dmwahl 0:fc5c10fc5a05 152 {
dmwahl 3:1a0add40e308 153 char error = 0;
dmwahl 0:fc5c10fc5a05 154 char data[3];
dmwahl 4:c298ec31dd93 155
dmwahl 3:1a0add40e308 156 error |= _read_multibyte(KELLER_PRESSURE_CUST_ID0, data, 3);
dmwahl 0:fc5c10fc5a05 157 Cust_ID0 = (data[1] << 8) | data[2];
dmwahl 0:fc5c10fc5a05 158
dmwahl 3:1a0add40e308 159 error |= _read_multibyte(KELLER_PRESSURE_CUST_ID1, data, 3);
dmwahl 0:fc5c10fc5a05 160 Cust_ID1 = (data[1] << 8) | data[2];
dmwahl 0:fc5c10fc5a05 161
dmwahl 1:805ee7853062 162 // Scaling0 contains date/mode information
dmwahl 3:1a0add40e308 163 error |= _read_multibyte(KELLER_PRESSURE_SCALING0, data, 3);
dmwahl 0:fc5c10fc5a05 164 Scaling0 = (data[1] << 8) | data[2];
dmwahl 0:fc5c10fc5a05 165
dmwahl 1:805ee7853062 166 //Scaling1 and Scaling2 contain lower pressure limit
dmwahl 3:1a0add40e308 167 error |= _read_multibyte(KELLER_PRESSURE_SCALING1, data, 3);
dmwahl 0:fc5c10fc5a05 168 Scaling1 = (data[1] << 8) | data[2];
dmwahl 1:805ee7853062 169 u.c[3] = data[1];
dmwahl 1:805ee7853062 170 u.c[2] = data[2];
dmwahl 0:fc5c10fc5a05 171
dmwahl 3:1a0add40e308 172 error |= _read_multibyte(KELLER_PRESSURE_SCALING2, data, 3);
dmwahl 0:fc5c10fc5a05 173 Scaling2 = (data[1] << 8) | data[2];
dmwahl 1:805ee7853062 174 u.c[1] = data[1];
dmwahl 1:805ee7853062 175 u.c[0] = data[2];
dmwahl 1:805ee7853062 176 pmin = u.f;
dmwahl 0:fc5c10fc5a05 177
dmwahl 1:805ee7853062 178 //Scaling3 and Scaling4 contain upper pressure limit
dmwahl 3:1a0add40e308 179 error |= _read_multibyte(KELLER_PRESSURE_SCALING3, data, 3);
dmwahl 0:fc5c10fc5a05 180 Scaling3 = (data[1] << 8) | data[2];
dmwahl 1:805ee7853062 181 u.c[3] = data[1];
dmwahl 1:805ee7853062 182 u.c[2] = data[2];
dmwahl 0:fc5c10fc5a05 183
dmwahl 3:1a0add40e308 184 error |= _read_multibyte(KELLER_PRESSURE_SCALING4, data, 3);
dmwahl 0:fc5c10fc5a05 185 Scaling4 = (data[1] << 8) | data[2];
dmwahl 1:805ee7853062 186 u.c[1] = data[1];
dmwahl 1:805ee7853062 187 u.c[0] = data[2];
dmwahl 1:805ee7853062 188 pmax = u.f;
dmwahl 0:fc5c10fc5a05 189
dmwahl 1:805ee7853062 190 // Read out date of manufacture information and sensor mode
dmwahl 0:fc5c10fc5a05 191 year = ((Scaling0 & KELLER_PRESSURE_SCALING0_YEAR_MASK) >> 11) + 2010;
dmwahl 0:fc5c10fc5a05 192 month = (Scaling0 & KELLER_PRESSURE_SCALING0_MONTH_MASK) >> 7;
dmwahl 0:fc5c10fc5a05 193 day = (Scaling0 & KELLER_PRESSURE_SCALING0_DAY_MASK) >> 2;
dmwahl 0:fc5c10fc5a05 194 mode = (Scaling0 & KELLER_PRESSURE_SCALING0_MODE_MASK);
dmwahl 0:fc5c10fc5a05 195
dmwahl 3:1a0add40e308 196 return error;
dmwahl 0:fc5c10fc5a05 197 }
dmwahl 0:fc5c10fc5a05 198
dmwahl 3:1a0add40e308 199 //===========================================================================
dmwahl 3:1a0add40e308 200 char KELLER_PRESSURE::_write(char regAddress, char data)
dmwahl 3:1a0add40e308 201 //===========================================================================
dmwahl 0:fc5c10fc5a05 202 {
dmwahl 3:1a0add40e308 203 char error = 0;
dmwahl 3:1a0add40e308 204 char data_write[2] = {regAddress, data};
dmwahl 3:1a0add40e308 205 error |= i2c.write(mi2cAddress|I2C_WRITE, data_write, 1, false);
dmwahl 3:1a0add40e308 206 return error;
dmwahl 0:fc5c10fc5a05 207 }
dmwahl 0:fc5c10fc5a05 208
dmwahl 3:1a0add40e308 209 //===========================================================================
dmwahl 3:1a0add40e308 210 char KELLER_PRESSURE::_read_multibyte(char regAddress, char* data, char count)
dmwahl 3:1a0add40e308 211 //===========================================================================
dmwahl 0:fc5c10fc5a05 212 {
dmwahl 3:1a0add40e308 213 char error = 0;
dmwahl 3:1a0add40e308 214 error |= i2c.write(mi2cAddress|I2C_WRITE, &regAddress, 1, false);
dmwahl 3:1a0add40e308 215 for (int i = 0; i < 50; i++) {
dmwahl 3:1a0add40e308 216 if(getStatus() == KELLER_PRESSURE_MEASUREMENT_DONE) {
dmwahl 3:1a0add40e308 217 break;
dmwahl 3:1a0add40e308 218 }
dmwahl 4:c298ec31dd93 219 wait_us(200);
dmwahl 3:1a0add40e308 220 if (i == 49) {
dmwahl 4:c298ec31dd93 221 error |= 1; // Timout after 50 attempts
dmwahl 3:1a0add40e308 222 }
dmwahl 0:fc5c10fc5a05 223 }
dmwahl 3:1a0add40e308 224 error |= i2c.read(mi2cAddress|I2C_READ, data, count, false);
dmwahl 3:1a0add40e308 225 return error;
dmwahl 0:fc5c10fc5a05 226 }