Calculates atmospheric pressure. Calibrated for 0 at room atmosphere.

Dependents:   pressurebyme

Committer:
Parkz
Date:
Thu Nov 07 14:08:31 2013 +0000
Revision:
0:89572af84e82
Calculates pressure using MPL115A1. Calibrated to show 0 for room atmosphere.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Parkz 0:89572af84e82 1 #ifndef MPL115A1_H
Parkz 0:89572af84e82 2 #define MPL115A1_H
Parkz 0:89572af84e82 3 // MPL115A1 register address map
Parkz 0:89572af84e82 4 #define MPL115A1_STARTPRES 0x20 // start pressure measurement
Parkz 0:89572af84e82 5 #define MPL115A1_PRESH 0x00 // 80
Parkz 0:89572af84e82 6 #define MPL115A1_PRESL 0x02 // 82
Parkz 0:89572af84e82 7 #define MPL115A1_A0MSB 0x08 // 88
Parkz 0:89572af84e82 8 #define MPL115A1_A0LSB 0x0A // 8A
Parkz 0:89572af84e82 9 #define MPL115A1_B1MSB 0x0C // 8C
Parkz 0:89572af84e82 10 #define MPL115A1_B1LSB 0x0E // 8E
Parkz 0:89572af84e82 11 #define MPL115A1_B2MSB 0x10 // 90
Parkz 0:89572af84e82 12 #define MPL115A1_B2LSB 0x12 // 92
Parkz 0:89572af84e82 13 #define MPL115A1_C12MSB 0x14 // 94
Parkz 0:89572af84e82 14 #define MPL115A1_C12LSB 0x16 // 96
Parkz 0:89572af84e82 15 #define MPL115A1_C11MSB 0x18 // 98
Parkz 0:89572af84e82 16 #define MPL115A1_C11LSB 0x1A // 9A
Parkz 0:89572af84e82 17 #define MPL115A1_C22MSB 0x1C // 9C
Parkz 0:89572af84e82 18 #define MPL115A1_C22LSB 0x1E // 9E
Parkz 0:89572af84e82 19 SPI spi(p5,p6,p7);
Parkz 0:89572af84e82 20 DigitalOut sdn(p8);
Parkz 0:89572af84e82 21 DigitalOut cs(p9);
Parkz 0:89572af84e82 22 long int uiPadc;
Parkz 0:89572af84e82 23 unsigned char uiPH, uiPL;
Parkz 0:89572af84e82 24 unsigned int readRegister(uint8_t address);
Parkz 0:89572af84e82 25 void writeRegister(uint8_t address, char data);
Parkz 0:89572af84e82 26 float calculatePressurekPa()
Parkz 0:89572af84e82 27 {
Parkz 0:89572af84e82 28 // read pressure, temperature and coefficients, calculate and return absolute pressure [kPa]
Parkz 0:89572af84e82 29 float p;
Parkz 0:89572af84e82 30 writeRegister(MPL115A1_STARTPRES, 0x00); // start temperature and pressure conversions
Parkz 0:89572af84e82 31 wait_ms(2); // AN: data is typically ready after 3ms, DS for both: max. 1ms
Parkz 0:89572af84e82 32
Parkz 0:89572af84e82 33 // read raw pressure
Parkz 0:89572af84e82 34 uiPH = readRegister(MPL115A1_PRESH);
Parkz 0:89572af84e82 35 uiPL = readRegister(MPL115A1_PRESL);
Parkz 0:89572af84e82 36
Parkz 0:89572af84e82 37 uiPadc = (unsigned int) uiPH << 8;
Parkz 0:89572af84e82 38 uiPadc += (unsigned int) uiPL & 0x00FF;
Parkz 0:89572af84e82 39 uiPadc-=28800;
Parkz 0:89572af84e82 40 uiPadc= -uiPadc;
Parkz 0:89572af84e82 41 p=uiPadc/128;
Parkz 0:89572af84e82 42 return p;
Parkz 0:89572af84e82 43
Parkz 0:89572af84e82 44
Parkz 0:89572af84e82 45 }
Parkz 0:89572af84e82 46 unsigned int readRegister(uint8_t address)
Parkz 0:89572af84e82 47 {
Parkz 0:89572af84e82 48 // returns the contents of any 1 byte register from any address
Parkz 0:89572af84e82 49 // sets the MSB for every address byte (READ mode)
Parkz 0:89572af84e82 50
Parkz 0:89572af84e82 51 unsigned int byte;
Parkz 0:89572af84e82 52
Parkz 0:89572af84e82 53 address |= 0x80;
Parkz 0:89572af84e82 54
Parkz 0:89572af84e82 55 cs = 0;
Parkz 0:89572af84e82 56 spi.write(address);
Parkz 0:89572af84e82 57 byte = spi.write(0x00);
Parkz 0:89572af84e82 58 cs = 1;
Parkz 0:89572af84e82 59
Parkz 0:89572af84e82 60 return byte;
Parkz 0:89572af84e82 61 }
Parkz 0:89572af84e82 62 void writeRegister(uint8_t address, char data)
Parkz 0:89572af84e82 63 {
Parkz 0:89572af84e82 64 //write any data byte to any single address
Parkz 0:89572af84e82 65 //adds a 0 to the MSB of the address byte (WRITE mode)
Parkz 0:89572af84e82 66
Parkz 0:89572af84e82 67 address &= 0x7F;
Parkz 0:89572af84e82 68
Parkz 0:89572af84e82 69 cs = 0;
Parkz 0:89572af84e82 70 wait_ms(1);
Parkz 0:89572af84e82 71 spi.write(address);
Parkz 0:89572af84e82 72 wait_ms(1);
Parkz 0:89572af84e82 73 spi.write(data);
Parkz 0:89572af84e82 74 wait_ms(1);
Parkz 0:89572af84e82 75 cs = 1;
Parkz 0:89572af84e82 76 }
Parkz 0:89572af84e82 77 #endif