David Wahl / KellerDruck_pressure

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

Committer:
dmwahl
Date:
Mon Jun 05 21:01:56 2017 +0000
Revision:
4:c298ec31dd93
Parent:
3:1a0add40e308
Child:
5:3ac90d95062a
Increased wait time between attempts to read out measurement values

Who changed what in which revision?

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