David Wahl / KellerDruck_pressure

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

Committer:
dmwahl
Date:
Wed May 10 17:13:47 2017 +0000
Revision:
2:d6c82c96dae7
Parent:
1:805ee7853062
Added sample code

Who changed what in which revision?

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