Calculates atmospheric pressure. Calibrated for 0 at room atmosphere.
mpl115a1.h@0:89572af84e82, 2013-11-07 (annotated)
- 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?
User | Revision | Line number | New 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 |