diff --git a/sw/airborne/booz/arch/lpc21/booz2_analog_hw.c b/sw/airborne/booz/arch/lpc21/booz2_analog_hw.c index bcc6cfab95..a80d917ed0 100644 --- a/sw/airborne/booz/arch/lpc21/booz2_analog_hw.c +++ b/sw/airborne/booz/arch/lpc21/booz2_analog_hw.c @@ -23,12 +23,19 @@ #include "booz2_analog.h" -#include "armVIC.h" -#include "sys_time.h" - #include "booz2_analog_baro.h" #include "booz2_battery.h" +#ifndef USE_EXTRA_ADC +/* Default mode + * Bust OFF + * Only one ADC can be read on each bank + * Baro and Bat are read on interrupt + */ + +#include "armVIC.h" +#include "sys_time.h" + void ADC0_ISR ( void ) __attribute__((naked)); void ADC1_ISR ( void ) __attribute__((naked)); @@ -112,3 +119,111 @@ void ADC1_ISR ( void ) { ISR_EXIT(); // recover registers and return } +#else // USE_EXTRA_ADC +/* Extra ADCs are read + * Bust ON + * Baro and Bat values are updated by hand + * Four ADCs can be configured + * ADC_1 is available on the cam connector + */ + +#include "LPC21xx.h" +#include "sys_time.h" + +uint16_t booz2_adc_1; +uint16_t booz2_adc_2; +uint16_t booz2_adc_3; +uint16_t booz2_adc_4; + +void booz2_analog_init_hw( void ) { + + /* AD0 */ + /* PCLK/4 ( 3.75MHz) - BURST - ON */ + AD0CR = 0x03 << 8 | 1 << 16 | 1 << 21; + /* disable global interrupt */ + ClearBit(AD0INTEN,8); + + /* AD1 */ + /* PCLK/4 ( 3.75MHz) - BURST - ON */ + AD1CR = 0x03 << 8 | 1 << 16 | 1 << 21; + /* disable global interrupt */ + ClearBit(AD1INTEN,8); + + /* select P0.29 as AD0.2 for bat meas*/ + PINSEL1 |= 0x01 << 26; + /* sample AD0.2 */ + AD0CR |= 1 << 2; + + + /* select P0.10 as AD1.2 for baro*/ + ANALOG_BARO_PINSEL |= ANALOG_BARO_PINSEL_VAL << ANALOG_BARO_PINSEL_BIT; + /* sample AD1.2 */ + AD1CR |= 1 << 2; + /* turn on DAC pins */ + PINSEL1 |= 2 << 18; + +#ifdef USE_ADC_1 + /* select P0.13 as AD1.4 adc 1 */ + PINSEL0 |= 0x03 << 26; + AD1CR |= 1 << 4; +#endif +#ifdef USE_ADC_2 + /* select P0.4 as AD0.6 adc 2 */ + PINSEL0 |= 0x03 << 8; + AD0CR |= 1 << 6; +#endif +#ifdef USE_ADC_3 + /* select P0.5 as AD0.7 adc 3 */ + PINSEL0 |= 0x03 << 10; + AD0CR |= 1 << 7; +#endif +#ifdef USE_ADC_4 + /* select P0.6 as AD1.0 adc 4 */ + PINSEL0 |= 0x03 << 12; + AD1CR |= 1 << 0; +#endif + + booz2_adc_1 = 0; + booz2_adc_2 = 0; + booz2_adc_3 = 0; + booz2_adc_4 = 0; +} + +void booz2_analog_baro_read(void) { + uint32_t tmp = AD1DR2; + uint16_t tmp2 = (uint16_t)(tmp >> 6) & 0x03FF; + Booz2BaroISRHandler(tmp2); +} + +void booz2_analog_bat_read(void) { + uint32_t tmp = AD0DR2; + uint16_t tmp2 = (uint16_t)(tmp >> 6) & 0x03FF; + Booz2BatteryISRHandler(tmp2); +} + +void booz2_analog_extra_adc_read(void) { + uint32_t tmp,tmp2; +#ifdef USE_ADC_1 + tmp = AD1DR4; + tmp2 = (uint16_t)(tmp >> 6) & 0x03FF; + booz2_adc_1 = tmp2; +#endif +#ifdef USE_ADC_2 + tmp = AD0DR6; + tmp2 = (uint16_t)(tmp >> 6) & 0x03FF; + booz2_adc_2 = tmp2; +#endif +#ifdef USE_ADC_3 + tmp = AD0DR7; + tmp2 = (uint16_t)(tmp >> 6) & 0x03FF; + booz2_adc_3 = tmp2; +#endif +#ifdef USE_ADC_4 + tmp = AD1DR0; + tmp2 = (uint16_t)(tmp >> 6) & 0x03FF; + booz2_adc_4 = tmp2; +#endif +} + +#endif + diff --git a/sw/airborne/booz/booz2_analog.c b/sw/airborne/booz/booz2_analog.c index dc4f9b60cd..bb10efaa22 100644 --- a/sw/airborne/booz/booz2_analog.c +++ b/sw/airborne/booz/booz2_analog.c @@ -23,6 +23,8 @@ #include "booz2_analog.h" +#include "std.h" + // battery on AD0.3 on P0.30 // baro on AD0.1 on P0.28 @@ -36,3 +38,13 @@ void booz2_analog_init( void ) { } +#ifdef USE_EXTRA_ADC +// Read manually baro (100Hz) and bat (10Hz) +void booz2_analog_periodic( void ) { + // baro + RunOnceEvery(5,booz2_analog_baro_read()); + // bat + RunOnceEvery(50,booz2_analog_bat_read()); +} +#endif + diff --git a/sw/airborne/booz/booz2_analog.h b/sw/airborne/booz/booz2_analog.h index 9f5d9694d6..5068205107 100644 --- a/sw/airborne/booz/booz2_analog.h +++ b/sw/airborne/booz/booz2_analog.h @@ -26,6 +26,22 @@ extern void booz2_analog_init( void ); +#ifdef USE_EXTRA_ADC +#include "std.h" + +extern uint16_t booz2_adc_1; +extern uint16_t booz2_adc_2; +extern uint16_t booz2_adc_3; +extern uint16_t booz2_adc_4; + +extern void booz2_analog_periodic( void ); + +extern void booz2_analog_baro_read(void); +extern void booz2_analog_bat_read(void); +extern void booz2_analog_extra_adc_read(void); +#endif + + #include "booz2_analog_hw.h" #endif /* BOOZ2_ANALOG_H */ diff --git a/sw/airborne/booz/booz2_main.c b/sw/airborne/booz/booz2_main.c index 3c7c49dba6..9866b69603 100644 --- a/sw/airborne/booz/booz2_main.c +++ b/sw/airborne/booz/booz2_main.c @@ -57,10 +57,6 @@ #include "booz2_pwm_hw.h" #endif -#ifdef BOOZ2_SONAR -#include "booz2_sonar.h" -#endif - #include "booz2_main.h" #ifdef SITL @@ -127,16 +123,12 @@ STATIC_INLINE void booz2_main_init( void ) { booz2_gps_init(); #endif -#ifdef BOOZ2_SONAR - booz2_sonar_init(); -#endif - - int_enable(); - #ifdef USE_MODULES modules_init(); #endif + int_enable(); + #if defined BOOZ_START_DELAY && ! defined SITL delay_done = FALSE; init_done_time = T0TC; @@ -192,7 +184,7 @@ STATIC_INLINE void booz2_main_periodic( void ) { booz_gps_periodic(); #endif -#ifdef BOOZ2_SONAR +#ifdef USE_EXTRA_ADC booz2_analog_periodic(); #endif @@ -218,10 +210,6 @@ STATIC_INLINE void booz2_main_event( void ) { Booz2AnalogBaroEvent(on_baro_event); -#ifdef BOOZ2_SONAR - Booz2SonarEvent(booz_ins_update_sonar); -#endif - #ifdef USE_GPS Booz2GpsEvent(on_gps_event); #endif diff --git a/sw/airborne/booz/booz2_telemetry.h b/sw/airborne/booz/booz2_telemetry.h index 1131b4553a..6beaf6c67f 100644 --- a/sw/airborne/booz/booz2_telemetry.h +++ b/sw/airborne/booz/booz2_telemetry.h @@ -729,9 +729,9 @@ extern uint8_t telemetry_mode_Main_DefaultChannel; ); \ } +//TODO replace by BOOZ_EXTRA_ADC #ifdef BOOZ2_SONAR -#include "booz2_sonar.h" -#define PERIODIC_SEND_BOOZ2_SONAR(_chan) DOWNLINK_SEND_BOOZ2_SONAR(_chan,&booz2_sonar_1,&booz2_sonar_2,&booz2_sonar_3,&booz2_sonar_4); +#define PERIODIC_SEND_BOOZ2_SONAR(_chan) DOWNLINK_SEND_BOOZ2_SONAR(_chan,&booz2_adc_1,&booz2_adc_2,&booz2_adc_3,&booz2_adc_4); #else #define PERIODIC_SEND_BOOZ2_SONAR(_chan) {} #endif