diff --git a/conf/airframes/ENAC/fixed-wing/weasel.xml b/conf/airframes/ENAC/fixed-wing/weasel.xml index 827a08b350..d911596b30 100644 --- a/conf/airframes/ENAC/fixed-wing/weasel.xml +++ b/conf/airframes/ENAC/fixed-wing/weasel.xml @@ -10,6 +10,8 @@ + + @@ -40,6 +42,8 @@ + + diff --git a/conf/modules/airspeed_ads1114.xml b/conf/modules/airspeed_ads1114.xml new file mode 100644 index 0000000000..b75f51a072 --- /dev/null +++ b/conf/modules/airspeed_ads1114.xml @@ -0,0 +1,18 @@ + + + + + +
+ +
+ + + + + + + +
+ + diff --git a/conf/modules/baro_board.xml b/conf/modules/baro_board.xml index 32ce2698ad..4ace2ff541 100644 --- a/conf/modules/baro_board.xml +++ b/conf/modules/baro_board.xml @@ -12,6 +12,7 @@ + diff --git a/sw/airborne/boards/umarim/baro_board.c b/sw/airborne/boards/umarim/baro_board.c index c5f2a97398..a63fa457f1 100644 --- a/sw/airborne/boards/umarim/baro_board.c +++ b/sw/airborne/boards/umarim/baro_board.c @@ -55,7 +55,7 @@ void baro_init( void ) { ads1114_init(); baro.status = BS_UNINITIALIZED; baro.absolute = 0; - baro.differential = 0; /* not handled on this board */ + baro.differential = 0; /* not handled on this board, use extra module (ex: airspeed_ads1114) */ #ifdef USE_BARO_AS_ALTIMETER baro_alt = 0.; baro_alt_offset = 0.; @@ -66,7 +66,7 @@ void baro_init( void ) { void baro_periodic( void ) { #ifdef USE_BARO_AS_ALTIMETER - if (baro.status == BS_UNINITIALIZED && ads1114_data_available) { + if (baro.status == BS_UNINITIALIZED && BARO_ABS_ADS.data_available) { // IIR filter to compute an initial offset baro_alt_offset = (OFFSET_FILTER * baro_alt_offset + (float)baro.absolute) / (OFFSET_FILTER + 1); // decrease init counter @@ -75,7 +75,7 @@ void baro_periodic( void ) { } #endif // Read the ADC - ads1114_read(); + ads1114_read(&BARO_ABS_ADS); } void baro_downlink_raw( void ) diff --git a/sw/airborne/boards/umarim/baro_board.h b/sw/airborne/boards/umarim/baro_board.h index 26d27b29d2..e74b52c77d 100644 --- a/sw/airborne/boards/umarim/baro_board.h +++ b/sw/airborne/boards/umarim/baro_board.h @@ -35,6 +35,11 @@ #define BARO_FILTER_GAIN 5 +/* There is no differential pressure on the board but + * it can be available from an external sensor + * */ +#define DIFF_FILTER_GAIN 5 + #ifdef USE_BARO_AS_ALTIMETER extern float baro_alt; extern float baro_alt_offset; @@ -43,15 +48,45 @@ extern float baro_alt_offset; extern void baro_downlink_raw( void ); +#define BARO_ABS_ADS ads1114_1 + +#define BaroAbs(_ads, _handler) { \ + if (_ads.data_available) { \ + baro.absolute = (baro.absolute + BARO_FILTER_GAIN*Ads1114GetValue(_ads)) / (BARO_FILTER_GAIN+1); \ + if (baro.status == BS_RUNNING) { \ + _handler(); \ + _ads.data_available = FALSE; \ + } \ + } \ +} + +#ifndef BaroDiff // Allow custom redefinition ? + +#if USE_BARO_DIFF + +#ifndef BARO_DIFF_ADS +#define BARO_DIFF_ADS ads1114_2 +#endif +#define BaroDiff(_ads, _handler) { \ + if (_ads.data_available) { \ + baro.differential = (baro.differential + DIFF_FILTER_GAIN*Ads1114GetValue(_ads)) / (DIFF_FILTER_GAIN+1); \ + if (baro.status == BS_RUNNING) { \ + _handler(); \ + _ads.data_available = FALSE; \ + } \ + } \ +} + +#else // Not using differential with ADS1114 +#define BaroDiff(_a, _h) {} +#endif + +#endif // ifndef BaroDiff + #define BaroEvent(_b_abs_handler, _b_diff_handler) { \ Ads1114Event(); \ - if (ads1114_data_available) { \ - baro.absolute = (baro.absolute + BARO_FILTER_GAIN*Ads1114GetValue()) / (BARO_FILTER_GAIN+1); \ - if (baro.status == BS_RUNNING) { \ - _b_abs_handler(); \ - ads1114_data_available = FALSE; \ - } \ - } \ + BaroAbs(BARO_ABS_ADS,_b_abs_handler); \ + BaroDiff(BARO_DIFF_ADS,_b_diff_handler); \ } #endif // BOARDS_UMARIM_BARO_H diff --git a/sw/airborne/modules/sensors/airspeed_ads1114.c b/sw/airborne/modules/sensors/airspeed_ads1114.c new file mode 100644 index 0000000000..b472beb4ad --- /dev/null +++ b/sw/airborne/modules/sensors/airspeed_ads1114.c @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2011 Gautier Hattenberger + * + * This file is part of paparazzi. + * + * paparazzi is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * paparazzi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with paparazzi; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +/* + * Module to extend the baro_board module with an airspeed sensor + * Init and event functions are handled by the baro_board module + */ + +#include "modules/sensors/airspeed_ads1114.h" +#include "subsystems/sensors/baro.h" +#include "baro_board.h" + +void airspeed_periodic(void) { + ads1114_read(&BARO_DIFF_ADS); +} + + + diff --git a/sw/airborne/modules/sensors/airspeed_ads1114.h b/sw/airborne/modules/sensors/airspeed_ads1114.h new file mode 100644 index 0000000000..90bbce344f --- /dev/null +++ b/sw/airborne/modules/sensors/airspeed_ads1114.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2011 Gautier Hattenberger + * + * This file is part of paparazzi. + * + * paparazzi is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * paparazzi is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with paparazzi; see the file COPYING. If not, write to + * the Free Software Foundation, 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +/* + * Module to extend the baro_board module with an airspeed sensor + */ + +#ifndef AIRSPEED_ADS1114_H +#define AIRSPEED_ADS1114_H + +extern void airspeed_periodic(void); + +#endif diff --git a/sw/airborne/peripherals/ads1114.c b/sw/airborne/peripherals/ads1114.c index 0c91981d26..3e6950ea71 100644 --- a/sw/airborne/peripherals/ads1114.c +++ b/sw/airborne/peripherals/ads1114.c @@ -27,28 +27,44 @@ #include "peripherals/ads1114.h" -struct i2c_transaction ads1114_trans; - -bool_t ads1114_config_done; -bool_t ads1114_data_available; +#if USE_ADS1114_1 +struct ads1114_periph ads1114_1; +#endif +#if USE_ADS1114_2 +struct ads1114_periph ads1114_2; +#endif void ads1114_init( void ) { - /* configure the ads1114 */ - ads1114_trans.buf[0] = ADS1114_POINTER_CONFIG_REG; - ads1114_trans.buf[1] = ADS1114_CONFIG_MSB; - ads1114_trans.buf[2] = ADS1114_CONFIG_LSB; - I2CTransmit(ADS1114_I2C_DEVICE, ads1114_trans, ADS1114_I2C_ADDR, 3); - ads1114_config_done = FALSE; - ads1114_data_available = FALSE; + /* configure the ads1114_1 */ +#if USE_ADS1114_1 + ads1114_1.i2c_addr = ADS1114_1_I2C_ADDR; + ads1114_1.trans.buf[0] = ADS1114_POINTER_CONFIG_REG; + ads1114_1.trans.buf[1] = ADS1114_1_CONFIG_MSB; + ads1114_1.trans.buf[2] = ADS1114_1_CONFIG_LSB; + I2CTransmit(ADS1114_I2C_DEVICE, ads1114_1.trans, ADS1114_1_I2C_ADDR, 3); + ads1114_1.config_done = FALSE; + ads1114_1.data_available = FALSE; +#endif + + /* configure the ads1114_2 */ +#if USE_ADS1114_2 + ads1114_2.i2c_addr = ADS1114_2_I2C_ADDR; + ads1114_2.trans.buf[0] = ADS1114_POINTER_CONFIG_REG; + ads1114_2.trans.buf[1] = ADS1114_2_CONFIG_MSB; + ads1114_2.trans.buf[2] = ADS1114_2_CONFIG_LSB; + I2CTransmit(ADS1114_I2C_DEVICE, ads1114_2.trans, ADS1114_2_I2C_ADDR, 3); + ads1114_2.config_done = FALSE; + ads1114_2.data_available = FALSE; +#endif } -void ads1114_read( void ) { +void ads1114_read( struct ads1114_periph * p ) { // Config done with success // start new reading when previous is done (and read if success) - if (ads1114_config_done && ads1114_trans.status == I2CTransDone) { - ads1114_trans.buf[0] = ADS1114_POINTER_CONV_REG; - I2CTransceive(ADS1114_I2C_DEVICE, ads1114_trans, ADS1114_I2C_ADDR, 1, 2); + if (p->config_done && p->trans.status == I2CTransDone) { + p->trans.buf[0] = ADS1114_POINTER_CONV_REG; + I2CTransceive(ADS1114_I2C_DEVICE, p->trans, p->i2c_addr, 1, 2); } } diff --git a/sw/airborne/peripherals/ads1114.h b/sw/airborne/peripherals/ads1114.h index 866fce50db..550cd7dfb4 100644 --- a/sw/airborne/peripherals/ads1114.h +++ b/sw/airborne/peripherals/ads1114.h @@ -32,66 +32,136 @@ /* I2C slave address */ -#define ADS1114_I2C_ADDR 0x90 // slave address byte (I2c address(7bits) + R/W @ 0) +#ifndef ADS1114_1_I2C_ADDR +#define ADS1114_1_I2C_ADDR 0x90 // slave address byte (I2c address(7bits) + R/W @ 0) +#endif +#ifndef ADS1114_2_I2C_ADDR +#define ADS1114_2_I2C_ADDR 0x92 // slave address byte (I2c address(7bits) + R/W @ 0) +#endif /* I2C conf register */ #define ADS1114_POINTER_CONV_REG 0x00 // access to the Conversion register (16bits) #define ADS1114_POINTER_CONFIG_REG 0x01 // access to the Configuration register (16bits) -/* ADS1114 default conf */ -#ifndef ADS1114_OS -#define ADS1114_OS 0x0 // Operational status +/* ADS1114_1 default conf */ +#ifndef ADS1114_1_OS +#define ADS1114_1_OS 0x0 // Operational status #endif -#ifndef ADS1114_MUX -#define ADS1114_MUX 0x0 // Input multiplexer +#ifndef ADS1114_1_MUX +#define ADS1114_1_MUX 0x0 // Input multiplexer #endif -#ifndef ADS1114_PGA -#define ADS1114_PGA 0x3 // Programable gain amplifier (= 4 with a Full Scale of +/- 1.024V) +#ifndef ADS1114_1_PGA +#define ADS1114_1_PGA 0x3 // Programable gain amplifier (= 4 with a Full Scale of +/- 1.024V) #endif -#ifndef ADS1114_MODE -#define ADS1114_MODE 0x0 // Continuous conversion mode +#ifndef ADS1114_1_MODE +#define ADS1114_1_MODE 0x0 // Continuous conversion mode #endif -#ifndef ADS1114_DR -#define ADS1114_DR 0x4 // Data rate (128 SPS) +#ifndef ADS1114_1_DR +#define ADS1114_1_DR 0x4 // Data rate (128 SPS) #endif -#ifndef ADS1114_COMP_MODE -#define ADS1114_COMP_MODE 0x0 // Comparator mode +#ifndef ADS1114_1_COMP_MODE +#define ADS1114_1_COMP_MODE 0x0 // Comparator mode #endif -#ifndef ADS1114_COMP_POL -#define ADS1114_COMP_POL 0x0 // Comparator polarity +#ifndef ADS1114_1_COMP_POL +#define ADS1114_1_COMP_POL 0x0 // Comparator polarity #endif -#ifndef ADS1114_COMP_LAT -#define ADS1114_COMP_LAT 0x0 // Latching comparator +#ifndef ADS1114_1_COMP_LAT +#define ADS1114_1_COMP_LAT 0x0 // Latching comparator #endif -#ifndef ADS1114_COMP_QUE -#define ADS1114_COMP_QUE 0x3 // Comparator queue (disable) +#ifndef ADS1114_1_COMP_QUE +#define ADS1114_1_COMP_QUE 0x3 // Comparator queue (disable) #endif -#define ADS1114_CONFIG_MSB ((ADS1114_OS<<7)|(ADS1114_MUX<<4)|(ADS1114_PGA<<1)|(ADS1114_MODE)) -#define ADS1114_CONFIG_LSB ((ADS1114_DR<<5)|(ADS1114_COMP_MODE<<4)|(ADS1114_COMP_POL<<3)|(ADS1114_COMP_LAT<<2)|(ADS1114_COMP_QUE)) +#define ADS1114_1_CONFIG_MSB ((ADS1114_1_OS<<7)|(ADS1114_1_MUX<<4)|(ADS1114_1_PGA<<1)|(ADS1114_1_MODE)) +#define ADS1114_1_CONFIG_LSB ((ADS1114_1_DR<<5)|(ADS1114_1_COMP_MODE<<4)|(ADS1114_1_COMP_POL<<3)|(ADS1114_1_COMP_LAT<<2)|(ADS1114_1_COMP_QUE)) + +/* ADS1114_1 default conf */ +#ifndef ADS1114_2_OS +#define ADS1114_2_OS 0x0 // Operational status +#endif +#ifndef ADS1114_2_MUX +#define ADS1114_2_MUX 0x0 // Input multiplexer +#endif +#ifndef ADS1114_2_PGA +#define ADS1114_2_PGA 0x3 // Programable gain amplifier (= 4 with a Full Scale of +/- 1.024V) +#endif +#ifndef ADS1114_2_MODE +#define ADS1114_2_MODE 0x0 // Continuous conversion mode +#endif +#ifndef ADS1114_2_DR +#define ADS1114_2_DR 0x4 // Data rate (128 SPS) +#endif +#ifndef ADS1114_2_COMP_MODE +#define ADS1114_2_COMP_MODE 0x0 // Comparator mode +#endif +#ifndef ADS1114_2_COMP_POL +#define ADS1114_2_COMP_POL 0x0 // Comparator polarity +#endif +#ifndef ADS1114_2_COMP_LAT +#define ADS1114_2_COMP_LAT 0x0 // Latching comparator +#endif +#ifndef ADS1114_2_COMP_QUE +#define ADS1114_2_COMP_QUE 0x3 // Comparator queue (disable) +#endif + +#define ADS1114_2_CONFIG_MSB ((ADS1114_2_OS<<7)|(ADS1114_2_MUX<<4)|(ADS1114_2_PGA<<1)|(ADS1114_2_MODE)) +#define ADS1114_2_CONFIG_LSB ((ADS1114_2_DR<<5)|(ADS1114_2_COMP_MODE<<4)|(ADS1114_2_COMP_POL<<3)|(ADS1114_2_COMP_LAT<<2)|(ADS1114_2_COMP_QUE)) /* Default I2C device */ +// FIXME all ads on the same device for now #ifndef ADS1114_I2C_DEVICE #define ADS1114_I2C_DEVICE i2c1 #endif -extern struct i2c_transaction ads1114_trans; -extern bool_t ads1114_config_done; -extern bool_t ads1114_data_available; +struct ads1114_periph { + struct i2c_transaction trans; + uint8_t i2c_addr; + bool_t config_done; + bool_t data_available; +}; + +#if USE_ADS1114_1 +extern struct ads1114_periph ads1114_1; +#endif + +#if USE_ADS1114_2 +extern struct ads1114_periph ads1114_2; +#endif extern void ads1114_init(void); -extern void ads1114_read(void); +extern void ads1114_read(struct ads1114_periph * p); -#define Ads1114Event() { \ - if (!ads1114_config_done) { \ - if (ads1114_trans.status == I2CTransSuccess) { ads1114_config_done = TRUE; ads1114_trans.status = I2CTransDone; } \ - if (ads1114_trans.status == I2CTransFailed) { ads1114_trans.status = I2CTransDone; } \ +// Generic Event Macro +#define _Ads1114Event(_p) {\ + if (!_p.config_done) { \ + if (_p.trans.status == I2CTransSuccess) { _p.config_done = TRUE; _p.trans.status = I2CTransDone; } \ + if (_p.trans.status == I2CTransFailed) { _p.trans.status = I2CTransDone; } \ } else { \ - if (ads1114_trans.status == I2CTransSuccess) { ads1114_data_available = TRUE; ads1114_trans.status = I2CTransDone; } \ - if (ads1114_trans.status == I2CTransFailed) { ads1114_trans.status = I2CTransDone; } \ - }\ + if (_p.trans.status == I2CTransSuccess) { _p.data_available = TRUE; _p.trans.status = I2CTransDone; } \ + if (_p.trans.status == I2CTransFailed) { _p.trans.status = I2CTransDone; } \ + } \ } -#define Ads1114GetValue() ((int16_t)(((int16_t)ads1114_trans.buf[0]<<8)|ads1114_trans.buf[1])) +#if USE_ADS1114_1 +#define Ads1114_1Event() _Ads1114Event(ads1114_1) +#else +#define Ads1114_1Event() {} +#endif + +#if USE_ADS1114_2 +#define Ads1114_2Event() _Ads1114Event(ads1114_2) +#else +#define Ads1114_2Event() {} +#endif + +// Final event macro +#define Ads1114Event() { \ + Ads1114_1Event(); \ + Ads1114_2Event(); \ +} + +// Get value macro +// @param ads1114 periph +#define Ads1114GetValue(_p) ((int16_t)(((int16_t)_p.trans.buf[0]<<8)|_p.trans.buf[1])) #endif // ADS_1114_H