[peripherals] ms5611 driver now also supports ms5607

The MS5607 has half the resolution of the MS5611.
- added ms5607_calc function for it
- added an extra parameter to init (set it to TRUE if the baro is really a MS5611)
- the baro_board wrappers take a BB_MS5611_TYPE_MS5607 define (set to TRUE for bebop)
This commit is contained in:
Felix Ruess
2015-03-25 14:33:35 +01:00
parent 05afa012f8
commit 47c5350564
11 changed files with 90 additions and 20 deletions
+7 -2
View File
@@ -46,7 +46,7 @@
#endif
/* default i2c address
/** default i2c address
* when CSB is set to GND addr is 0xEE
* when CSB is set to VCC addr is 0xEC
*
@@ -56,13 +56,18 @@
#define BB_MS5611_SLAVE_ADDR 0xEE
#endif
/// set to TRUE if baro is actually a MS5607
#ifndef BB_MS5611_TYPE_MS5607
#define BB_MS5611_TYPE_MS5607 FALSE
#endif
PRINT_CONFIG_VAR(BB_MS5611_TYPE_MS5607)
struct Ms5611_I2c bb_ms5611;
void baro_init(void)
{
ms5611_i2c_init(&bb_ms5611, &BB_MS5611_I2C_DEV, BB_MS5611_SLAVE_ADDR);
ms5611_i2c_init(&bb_ms5611, &BB_MS5611_I2C_DEV, BB_MS5611_SLAVE_ADDR, BB_MS5611_TYPE_MS5607);
#ifdef BARO_LED
LED_OFF(BARO_LED);
+5 -1
View File
@@ -45,13 +45,17 @@
#endif
#endif
/// set to TRUE if baro is actually a MS5607
#ifndef BB_MS5611_TYPE_MS5607
#define BB_MS5611_TYPE_MS5607 FALSE
#endif
struct Ms5611_Spi bb_ms5611;
void baro_init(void)
{
ms5611_spi_init(&bb_ms5611, &BB_MS5611_SPI_DEV, BB_MS5611_SLAVE_IDX);
ms5611_spi_init(&bb_ms5611, &BB_MS5611_SPI_DEV, BB_MS5611_SLAVE_IDX, BB_MS5611_TYPE_MS5607);
#ifdef BARO_LED
LED_OFF(BARO_LED);
+4 -1
View File
@@ -21,12 +21,15 @@
/**
* @file boards/bebop/baro_board.h
* Paparazzi Bebop Baro Sensor implementation using the ms5611.
* Paparazzi Bebop Baro Sensor implementation for the MS5607.
* Actually uses the MS5611 driver, but sets BB_MS5611_TYPE_MS5607 to TRUE.
*/
#ifndef BOARDS_BEBOP_BARO_H
#define BOARDS_BEBOP_BARO_H
#define BB_MS5611_TYPE_MS5607 TRUE
// only for printing the baro type during compilation
#ifndef BARO_BOARD
#define BARO_BOARD BARO_MS5611_I2C
@@ -59,7 +59,7 @@ float baro_ms5611_sigma2;
void baro_ms5611_init(void)
{
ms5611_i2c_init(&baro_ms5611, &MS5611_I2C_DEV, MS5611_SLAVE_ADDR);
ms5611_i2c_init(&baro_ms5611, &MS5611_I2C_DEV, MS5611_SLAVE_ADDR, FALSE);
baro_ms5611_enabled = TRUE;
baro_ms5611_alt_valid = FALSE;
@@ -58,7 +58,7 @@ float baro_ms5611_sigma2;
void baro_ms5611_init(void)
{
ms5611_spi_init(&baro_ms5611, &MS5611_SPI_DEV, MS5611_SLAVE_IDX);
ms5611_spi_init(&baro_ms5611, &MS5611_SPI_DEV, MS5611_SLAVE_IDX, FALSE);
baro_ms5611_enabled = TRUE;
baro_ms5611_alt_valid = FALSE;
+45 -2
View File
@@ -23,7 +23,7 @@
/**
* @file peripherals/ms5611.c
*
* MS5611 barometer driver common functions (I2C and SPI).
* MS5611 and MS5607 barometer driver common functions (I2C and SPI).
*/
#include "peripherals/ms5611.h"
@@ -61,7 +61,7 @@ bool_t ms5611_prom_crc_ok(uint16_t *prom)
}
/**
* Calculate temperature and compensated pressure.
* Calculate temperature and compensated pressure for MS5611.
* @return TRUE if measurement was valid, FALSE otherwise
*/
bool_t ms5611_calc(struct Ms5611Data *ms)
@@ -101,3 +101,46 @@ bool_t ms5611_calc(struct Ms5611Data *ms)
}
return FALSE;
}
/**
* Calculate temperature and compensated pressure for MS5607.
* MS5607 basically has half the resolution of the MS5611.
* @return TRUE if measurement was valid, FALSE otherwise
*/
bool_t ms5607_calc(struct Ms5611Data *ms)
{
int64_t dt, tempms, off, sens, t2, off2, sens2;
/* difference between actual and ref temperature */
dt = ms->d2 - (int64_t)ms->c[5] * (1 << 8);
/* actual temperature */
tempms = 2000 + ((int64_t)dt * ms->c[6]) / (1 << 23);
/* offset at actual temperature */
off = ((int64_t)ms->c[2] * (1 << 17)) + ((int64_t)ms->c[4] * dt) / (1 << 6);
/* sensitivity at actual temperature */
sens = ((int64_t)ms->c[1] * (1 << 16)) + ((int64_t)ms->c[3] * dt) / (1 << 7);
/* second order temperature compensation */
if (tempms < 2000) {
t2 = (dt * dt) / (1 << 31);
off2 = 61 * ((int64_t)(tempms - 2000) * (tempms - 2000)) / (1 << 4);
sens2 = 2 * ((int64_t)(tempms - 2000) * (tempms - 2000));
if (tempms < -1500) {
off2 = off2 + 15 * (int64_t)(tempms + 1500) * (tempms + 1500);
sens2 = sens2 + 8 * ((int64_t)(tempms + 1500) * (tempms + 1500));
}
tempms = tempms - t2;
off = off - off2;
sens = sens - sens2;
}
/* temperature compensated pressure in Pascal (0.01mbar) */
uint32_t p = (((int64_t)ms->d1 * sens) / (1 << 21) - off) / (1 << 15);
/* if temp and pressare are in valid bounds, copy and return TRUE (valid) */
if ((tempms > -4000) && (tempms < 8500) && (p > 1000) && (p < 120000)) {
/* temperature in deg Celsius with 0.01 degC resolultion */
ms->temperature = (int32_t)tempms;
ms->pressure = p;
return TRUE;
}
return FALSE;
}
+1
View File
@@ -58,5 +58,6 @@ struct Ms5611Data {
extern bool_t ms5611_prom_crc_ok(uint16_t *prom);
extern bool_t ms5611_calc(struct Ms5611Data *ms);
extern bool_t ms5607_calc(struct Ms5611Data *ms);
#endif /* MS5611_H */
+9 -4
View File
@@ -22,7 +22,7 @@
/**
* @file peripherals/ms5611_i2c.c
* Measurement Specialties (Intersema) MS5611-01BA pressure/temperature sensor interface for I2C.
* Measurement Specialties (Intersema) MS5611-01BA and MS5607-02BA03 pressure/temperature sensor interface for I2C.
*
*/
@@ -30,7 +30,8 @@
#include "peripherals/ms5611_i2c.h"
void ms5611_i2c_init(struct Ms5611_I2c *ms, struct i2c_periph *i2c_p, uint8_t addr)
void ms5611_i2c_init(struct Ms5611_I2c *ms, struct i2c_periph *i2c_p, uint8_t addr,
bool_t is_ms5607)
{
/* set i2c_peripheral */
ms->i2c_p = i2c_p;
@@ -44,6 +45,7 @@ void ms5611_i2c_init(struct Ms5611_I2c *ms, struct i2c_periph *i2c_p, uint8_t ad
ms->initialized = FALSE;
ms->status = MS5611_STATUS_UNINIT;
ms->prom_cnt = 0;
ms->is_ms5607 = is_ms5607;
}
void ms5611_i2c_start_configure(struct Ms5611_I2c *ms)
@@ -152,8 +154,11 @@ void ms5611_i2c_event(struct Ms5611_I2c *ms)
ms->status = MS5611_STATUS_IDLE;
} else {
/* calculate temp and pressure from measurements and set available if valid */
if (ms5611_calc(&(ms->data))) {
ms->data_available = TRUE;
if (ms->is_ms5607) {
ms->data_available = ms5607_calc(&(ms->data));
}
else {
ms->data_available = ms5611_calc(&(ms->data));
}
ms->status = MS5611_STATUS_IDLE;
}
+4 -2
View File
@@ -22,7 +22,7 @@
/**
* @file peripherals/ms5611_i2c.h
*
* Measurement Specialties (Intersema) MS5611-01BA pressure/temperature sensor interface for I2C.
* Measurement Specialties (Intersema) MS5611-01BA and MS5607-02BA03 pressure/temperature sensor interface for I2C.
*/
#ifndef MS5611_I2C_H
@@ -37,6 +37,7 @@ struct Ms5611_I2c {
struct i2c_periph *i2c_p;
struct i2c_transaction i2c_trans;
enum Ms5611Status status;
bool_t is_ms5607; ///< TRUE if MS5607, FALSE if MS5611
bool_t initialized; ///< config done flag
volatile bool_t data_available; ///< data ready flag
struct Ms5611Data data;
@@ -44,7 +45,8 @@ struct Ms5611_I2c {
};
// Functions
extern void ms5611_i2c_init(struct Ms5611_I2c *ms, struct i2c_periph *i2c_p, uint8_t addr);
extern void ms5611_i2c_init(struct Ms5611_I2c *ms, struct i2c_periph *i2c_p, uint8_t addr,
bool_t is_ms5607);
extern void ms5611_i2c_start_configure(struct Ms5611_I2c *ms);
extern void ms5611_i2c_start_conversion(struct Ms5611_I2c *ms);
extern void ms5611_i2c_periodic_check(struct Ms5611_I2c *ms);
+9 -4
View File
@@ -22,7 +22,7 @@
/**
* @file peripherals/ms5611_spi.c
* Measurement Specialties (Intersema) MS5611-01BA pressure/temperature sensor interface for SPI.
* Measurement Specialties (Intersema) MS5611-01BA and MS5607-02BA03 pressure/temperature sensor interface for SPI.
*
*/
@@ -30,7 +30,8 @@
#include "peripherals/ms5611_spi.h"
void ms5611_spi_init(struct Ms5611_Spi *ms, struct spi_periph *spi_p, uint8_t slave_idx)
void ms5611_spi_init(struct Ms5611_Spi *ms, struct spi_periph *spi_p, uint8_t slave_idx,
bool_t is_ms5607)
{
/* set spi_peripheral */
ms->spi_p = spi_p;
@@ -58,6 +59,7 @@ void ms5611_spi_init(struct Ms5611_Spi *ms, struct spi_periph *spi_p, uint8_t sl
ms->initialized = FALSE;
ms->status = MS5611_STATUS_UNINIT;
ms->prom_cnt = 0;
ms->is_ms5607 = is_ms5607;
}
void ms5611_spi_start_configure(struct Ms5611_Spi *ms)
@@ -164,8 +166,11 @@ void ms5611_spi_event(struct Ms5611_Spi *ms)
ms->status = MS5611_STATUS_IDLE;
} else {
/* calculate temp and pressure from measurements and set available if valid */
if (ms5611_calc(&(ms->data))) {
ms->data_available = TRUE;
if (ms->is_ms5607) {
ms->data_available = ms5607_calc(&(ms->data));
}
else {
ms->data_available = ms5611_calc(&(ms->data));
}
ms->status = MS5611_STATUS_IDLE;
}
+4 -2
View File
@@ -22,7 +22,7 @@
/**
* @file peripherals/ms5611_spi.h
*
* Measurement Specialties (Intersema) MS5611-01BA pressure/temperature sensor interface for SPI.
* Measurement Specialties (Intersema) MS5611-01BA and MS5607-02BA03 pressure/temperature sensor interface for SPI.
*/
#ifndef MS5611_SPI_H
@@ -39,6 +39,7 @@ struct Ms5611_Spi {
volatile uint8_t tx_buf[1];
volatile uint8_t rx_buf[4];
enum Ms5611Status status;
bool_t is_ms5607; ///< TRUE if MS5607, FALSE if MS5611
bool_t initialized; ///< config done flag
volatile bool_t data_available; ///< data ready flag
struct Ms5611Data data;
@@ -46,7 +47,8 @@ struct Ms5611_Spi {
};
// Functions
extern void ms5611_spi_init(struct Ms5611_Spi *ms, struct spi_periph *spi_p, uint8_t addr);
extern void ms5611_spi_init(struct Ms5611_Spi *ms, struct spi_periph *spi_p, uint8_t addr,
bool_t is_ms5607);
extern void ms5611_spi_start_configure(struct Ms5611_Spi *ms);
extern void ms5611_spi_start_conversion(struct Ms5611_Spi *ms);
extern void ms5611_spi_periodic_check(struct Ms5611_Spi *ms);