MEMS pressure sensor by STMicroelectronics. FIFO Hardware digital filter as default.

Fork of LPS25H by Kenji Arai

Committer:
renanbmx123
Date:
Sun Oct 14 02:00:36 2018 +0000
Revision:
2:92691fd6cb75
Parent:
1:9db35e42ddbc
altitude calculation add

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:8fc511bd51af 1 /*
kenjiArai 0:8fc511bd51af 2 * mbed library program
kenjiArai 0:8fc511bd51af 3 * LPS25H MEMS pressure sensor: 260-1260 hPa absolute digital output barometer
kenjiArai 0:8fc511bd51af 4 * made by STMicroelectronics
kenjiArai 0:8fc511bd51af 5 * http://www.st-japan.co.jp/web/catalog/sense_power/FM89/SC1316/PF255230
kenjiArai 0:8fc511bd51af 6 *
kenjiArai 1:9db35e42ddbc 7 * Copyright (c) 2015,'17 Kenji Arai / JH1PJL
kenjiArai 0:8fc511bd51af 8 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:8fc511bd51af 9 * http://mbed.org/users/kenjiArai/
kenjiArai 0:8fc511bd51af 10 * Created: Feburary 21st, 2015
kenjiArai 1:9db35e42ddbc 11 * Revised: August 21st, 2017
kenjiArai 0:8fc511bd51af 12 */
kenjiArai 0:8fc511bd51af 13 /*
kenjiArai 1:9db35e42ddbc 14 *---------------- REFERENCE ---------------------------------------------------
kenjiArai 0:8fc511bd51af 15 * Original Information
kenjiArai 1:9db35e42ddbc 16 * http://www.st.com/content/st_com/ja/products/
kenjiArai 1:9db35e42ddbc 17 * mems-and-sensors/pressure-sensors/lps25h.html
kenjiArai 0:8fc511bd51af 18 * AN4450 Application Note (as follows)
kenjiArai 1:9db35e42ddbc 19 * en.DM00108837.pdf
kenjiArai 1:9db35e42ddbc 20 * Device kit (not avairable)
kenjiArai 0:8fc511bd51af 21 * http://akizukidenshi.com/catalog/g/gK-08338/
kenjiArai 0:8fc511bd51af 22 */
kenjiArai 0:8fc511bd51af 23
kenjiArai 0:8fc511bd51af 24 #ifndef LPS25H_H
kenjiArai 0:8fc511bd51af 25 #define LPS25H_H
kenjiArai 0:8fc511bd51af 26
kenjiArai 0:8fc511bd51af 27 #include "mbed.h"
kenjiArai 0:8fc511bd51af 28
kenjiArai 0:8fc511bd51af 29 // LPS25H Address
kenjiArai 0:8fc511bd51af 30 // 7bit address = 0b101110x(0x5c or 0x5d depends on SA0/SDO)
kenjiArai 0:8fc511bd51af 31 #define LPS25H_G_CHIP_ADDR (0x5c << 1) // SA0(=SDO pin) = Ground
kenjiArai 0:8fc511bd51af 32 #define LPS25H_V_CHIP_ADDR (0x5d << 1) // SA0(=SDO pin) = Vdd
kenjiArai 0:8fc511bd51af 33
kenjiArai 0:8fc511bd51af 34 // MODE Selection
kenjiArai 0:8fc511bd51af 35 #define FIFO_HW_FILTER 1
kenjiArai 0:8fc511bd51af 36 #define FIFO_BYPASS 0
kenjiArai 0:8fc511bd51af 37
kenjiArai 0:8fc511bd51af 38 // LPS25H ID
kenjiArai 0:8fc511bd51af 39 #define I_AM_LPS25H 0xbd
kenjiArai 0:8fc511bd51af 40
kenjiArai 0:8fc511bd51af 41 // Register's definition
kenjiArai 0:8fc511bd51af 42 #define LPS25H_WHO_AM_I 0x0f
kenjiArai 0:8fc511bd51af 43 #define LPS25H_RES_CONF 0x10
kenjiArai 0:8fc511bd51af 44
kenjiArai 0:8fc511bd51af 45 #define LPS25H_CTRL_REG1 0x20
kenjiArai 0:8fc511bd51af 46 #define LPS25H_CTRL_REG2 0x21
kenjiArai 0:8fc511bd51af 47 #define LPS25H_CTRL_REG3 0x22
kenjiArai 0:8fc511bd51af 48 #define LPS25H_CTRL_REG4 0x23
kenjiArai 0:8fc511bd51af 49
kenjiArai 0:8fc511bd51af 50 #define LPS25H_STATUS_REG 0x27
kenjiArai 0:8fc511bd51af 51 #define LPS25H_PRESS_POUT_XL 0x28
kenjiArai 0:8fc511bd51af 52 #define LPS25H_PRESS_OUT_L 0x29
kenjiArai 0:8fc511bd51af 53 #define LPS25H_PRESS_OUT_H 0x2a
kenjiArai 0:8fc511bd51af 54 #define LPS25H_TEMP_OUT_L 0x2b
kenjiArai 0:8fc511bd51af 55 #define LPS25H_TEMP_OUT_H 0x2c
kenjiArai 0:8fc511bd51af 56
kenjiArai 0:8fc511bd51af 57 #define LPS25H_FIFO_CTRL 0x2e
kenjiArai 0:8fc511bd51af 58 #define LPS25H_FIFO_STATUS 0x2e
kenjiArai 0:8fc511bd51af 59
kenjiArai 0:8fc511bd51af 60 // Control Reg.
kenjiArai 0:8fc511bd51af 61 #define PD (0UL << 7)
kenjiArai 0:8fc511bd51af 62 #define ACTIVE (1UL << 7)
kenjiArai 0:8fc511bd51af 63 #define ODR_ONESHOT (0UL << 4)
kenjiArai 0:8fc511bd51af 64 #define ODR_1HZ (1UL << 4)
kenjiArai 0:8fc511bd51af 65 #define ODR_7HZ (1UL << 4)
kenjiArai 0:8fc511bd51af 66 #define ODR_12R5HZ (2UL << 4)
kenjiArai 0:8fc511bd51af 67 #define ODR_25HZ (3UL << 4)
kenjiArai 0:8fc511bd51af 68 #define BDU_SET (1UL << 2)
kenjiArai 0:8fc511bd51af 69 #define CR_STD_SET (ACTIVE + ODR_7HZ + BDU_SET)
kenjiArai 0:8fc511bd51af 70
kenjiArai 0:8fc511bd51af 71 // FIFO Control
kenjiArai 0:8fc511bd51af 72 #define FIFO_MEAN_MODE 0xc0
kenjiArai 0:8fc511bd51af 73 #define FIFO_SAMPLE_2 0x01
kenjiArai 0:8fc511bd51af 74 #define FIFO_SAMPLE_4 0x03
kenjiArai 0:8fc511bd51af 75 #define FIFO_SAMPLE_8 0x07
kenjiArai 0:8fc511bd51af 76 #define FIFO_SAMPLE_16 0x0f
kenjiArai 0:8fc511bd51af 77 #define FIFO_SAMPLE_32 0x1f
kenjiArai 0:8fc511bd51af 78
kenjiArai 0:8fc511bd51af 79 /** Interface for STMicronics MEMS pressure sensor
kenjiArai 0:8fc511bd51af 80 * Chip: LPS25H
kenjiArai 0:8fc511bd51af 81 *
kenjiArai 0:8fc511bd51af 82 * @code
kenjiArai 0:8fc511bd51af 83 * #include "mbed.h"
kenjiArai 0:8fc511bd51af 84 * #include "LPS25H.h"
kenjiArai 0:8fc511bd51af 85 *
kenjiArai 0:8fc511bd51af 86 * // I2C Communication
kenjiArai 0:8fc511bd51af 87 * LPS25H baro(p_sda, p_scl, LPS25H_G_CHIP_ADDR);
kenjiArai 0:8fc511bd51af 88 * // If you connected I2C line not only this device but also other devices,
kenjiArai 0:8fc511bd51af 89 * // you need to declare following method.
kenjiArai 0:8fc511bd51af 90 * I2C i2c(dp5,dp27); // SDA, SCL
kenjiArai 0:8fc511bd51af 91 * LPS25H baro(i2c, LPS25H_G_CHIP_ADDR);
kenjiArai 0:8fc511bd51af 92 *
kenjiArai 0:8fc511bd51af 93 * int main() {
kenjiArai 0:8fc511bd51af 94 * while( trure){
kenjiArai 0:8fc511bd51af 95 * baro.get();
kenjiArai 1:9db35e42ddbc 96 * printf("Presere: 0x%6.1f, Temperature: 0x%+4.1f\r\n",
kenjiArai 1:9db35e42ddbc 97 * baro.pressue(), baro.temperature());
kenjiArai 0:8fc511bd51af 98 * wait(1.0);
kenjiArai 0:8fc511bd51af 99 * }
kenjiArai 0:8fc511bd51af 100 * }
kenjiArai 0:8fc511bd51af 101 * @endcode
kenjiArai 0:8fc511bd51af 102 */
kenjiArai 0:8fc511bd51af 103
kenjiArai 0:8fc511bd51af 104 class LPS25H
kenjiArai 0:8fc511bd51af 105 {
kenjiArai 0:8fc511bd51af 106 public:
kenjiArai 0:8fc511bd51af 107 /** Configure data pin
kenjiArai 0:8fc511bd51af 108 * @param data SDA and SCL pins
kenjiArai 1:9db35e42ddbc 109 * @param device address LPS25H(SA0=0 or 1), LPS25H_G_CHIP_ADDR or _V_
kenjiArai 1:9db35e42ddbc 110 * @param Operation mode FIFO_HW_FILTER(default) or FIFO_BYPASS
kenjiArai 0:8fc511bd51af 111 */
renanbmx123 2:92691fd6cb75 112 LPS25H(PinName p_sda, PinName p_scl);
renanbmx123 2:92691fd6cb75 113
renanbmx123 2:92691fd6cb75 114 // LPS25H(PinName p_sda, PinName p_scl, uint8_t addr, uint8_t mode);
kenjiArai 0:8fc511bd51af 115
kenjiArai 0:8fc511bd51af 116 /** Configure data pin (with other devices on I2C line)
kenjiArai 0:8fc511bd51af 117 * @param I2C previous definition
kenjiArai 1:9db35e42ddbc 118 * @param device address LPS25H(SA0=0 or 1), LPS25H_G_CHIP_ADDR or _V_
kenjiArai 1:9db35e42ddbc 119 * @param Operation mode FIFO_HW_FILTER(default) or FIFO_BYPASS
kenjiArai 0:8fc511bd51af 120 */
renanbmx123 2:92691fd6cb75 121 // LPS25H(I2C& p_i2c, uint8_t addr);
renanbmx123 2:92691fd6cb75 122 // LPS25H(I2C& p_i2c, uint8_t addr, uint8_t mode);
kenjiArai 0:8fc511bd51af 123
kenjiArai 0:8fc511bd51af 124 /** Start convertion & data save
kenjiArai 0:8fc511bd51af 125 * @param none
kenjiArai 0:8fc511bd51af 126 * @return none
kenjiArai 0:8fc511bd51af 127 */
kenjiArai 0:8fc511bd51af 128 void get(void);
kenjiArai 0:8fc511bd51af 129
kenjiArai 0:8fc511bd51af 130 /** Read pressure data
kenjiArai 0:8fc511bd51af 131 * @param none
renanbmx123 2:92691fd6cb75 132 * @return pressure in hpa
kenjiArai 0:8fc511bd51af 133 */
kenjiArai 0:8fc511bd51af 134 float pressure(void);
kenjiArai 0:8fc511bd51af 135
kenjiArai 0:8fc511bd51af 136 /** Read temperature data
kenjiArai 0:8fc511bd51af 137 * @param none
kenjiArai 0:8fc511bd51af 138 * @return temperature
kenjiArai 0:8fc511bd51af 139 */
kenjiArai 0:8fc511bd51af 140 float temperature(void);
kenjiArai 0:8fc511bd51af 141
kenjiArai 0:8fc511bd51af 142 /** Read a ID number
kenjiArai 0:8fc511bd51af 143 * @param none
kenjiArai 0:8fc511bd51af 144 * @return if STM MEMS LPS25H, it should be I_AM_ LPS25H
kenjiArai 0:8fc511bd51af 145 */
renanbmx123 2:92691fd6cb75 146 /** Read altitude data
renanbmx123 2:92691fd6cb75 147 * @param none
renanbmx123 2:92691fd6cb75 148 * @return altitude in metters
renanbmx123 2:92691fd6cb75 149 */
renanbmx123 2:92691fd6cb75 150 float altitude(void);
renanbmx123 2:92691fd6cb75 151
renanbmx123 2:92691fd6cb75 152 /** Read temperature data
renanbmx123 2:92691fd6cb75 153 * @param none
renanbmx123 2:92691fd6cb75 154 * @return temperature
renanbmx123 2:92691fd6cb75 155 */
renanbmx123 2:92691fd6cb75 156
renanbmx123 2:92691fd6cb75 157 //uint8_t read_id(void);
kenjiArai 0:8fc511bd51af 158
kenjiArai 0:8fc511bd51af 159 /** Read Data Ready flag
kenjiArai 0:8fc511bd51af 160 * @param none
kenjiArai 0:8fc511bd51af 161 * @return 1 = Ready
kenjiArai 0:8fc511bd51af 162 */
kenjiArai 0:8fc511bd51af 163 uint8_t data_ready(void);
kenjiArai 0:8fc511bd51af 164
kenjiArai 0:8fc511bd51af 165 /** Set I2C clock frequency
kenjiArai 0:8fc511bd51af 166 * @param freq.
kenjiArai 0:8fc511bd51af 167 * @return none
kenjiArai 0:8fc511bd51af 168 */
kenjiArai 0:8fc511bd51af 169 void frequency(int hz);
kenjiArai 0:8fc511bd51af 170
kenjiArai 0:8fc511bd51af 171 /** Read register (general purpose)
kenjiArai 0:8fc511bd51af 172 * @param register's address
kenjiArai 0:8fc511bd51af 173 * @return register data
kenjiArai 0:8fc511bd51af 174 */
kenjiArai 0:8fc511bd51af 175 uint8_t read_reg(uint8_t addr);
kenjiArai 0:8fc511bd51af 176
kenjiArai 0:8fc511bd51af 177 /** Write register (general purpose)
kenjiArai 0:8fc511bd51af 178 * @param register's address
kenjiArai 0:8fc511bd51af 179 * @param data
kenjiArai 0:8fc511bd51af 180 * @return none
kenjiArai 0:8fc511bd51af 181 */
kenjiArai 0:8fc511bd51af 182 void write_reg(uint8_t addr, uint8_t data);
kenjiArai 0:8fc511bd51af 183
kenjiArai 0:8fc511bd51af 184 protected:
kenjiArai 1:9db35e42ddbc 185 I2C *_i2c_p;
kenjiArai 1:9db35e42ddbc 186 I2C &_i2c;
kenjiArai 0:8fc511bd51af 187
kenjiArai 0:8fc511bd51af 188 void init(void);
kenjiArai 0:8fc511bd51af 189
kenjiArai 0:8fc511bd51af 190 private:
kenjiArai 0:8fc511bd51af 191 char dt[6]; // working buffer
kenjiArai 0:8fc511bd51af 192 uint8_t LPS25H_addr; // Sensor address
renanbmx123 2:92691fd6cb75 193 //uint8_t LPS25H_id; // ID
kenjiArai 0:8fc511bd51af 194 uint8_t LPS25H_ready; // Device is on I2C line = 1, not = 0
kenjiArai 0:8fc511bd51af 195 uint8_t LPS25H_mode; // Operation mode
kenjiArai 0:8fc511bd51af 196 uint32_t press; // pressure raw data
renanbmx123 2:92691fd6cb75 197 //int16_t temp; // temperature raw data
renanbmx123 2:92691fd6cb75 198 int32_t alt;
kenjiArai 0:8fc511bd51af 199 };
kenjiArai 0:8fc511bd51af 200
kenjiArai 0:8fc511bd51af 201 #endif // LPS25H_H