Skip to content

Commit

Permalink
Merge pull request #822 from paparazzi/stm32_fix_adc
Browse files Browse the repository at this point in the history
[stm32] fix adc

very hack-ish fix for when using multiple ADs, e.g. AD1 and AD2
Before this "fix" e.g. AD1_1 and AD2_1 had the same value (0).
  • Loading branch information
flixr committed Sep 8, 2014
2 parents a1953a9 + 172c67c commit 48fd4b2
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 27 deletions.
3 changes: 3 additions & 0 deletions sw/airborne/arch/lpc21/mcu_periph/adc_arch.h
Expand Up @@ -32,6 +32,9 @@

#include BOARD_CONFIG

/** 8 ADCs for bank 0, others for bank 2 */
#define NB_ADC 8

#define AdcBank0(x) (x)
#define AdcBank1(x) (x+NB_ADC)

Expand Down
34 changes: 23 additions & 11 deletions sw/airborne/arch/stm32/mcu_periph/adc_arch.c
Expand Up @@ -282,19 +282,23 @@ void adc_init( void ) {
* That's why "adc_channel_map" has this descending order.
*/

nb_adc1_channels = NB_ADC1_CHANNELS;
nb_adc1_channels = 0;
#if USE_AD1
#ifdef AD1_1_CHANNEL
adc_channel_map[AD1_1] = AD1_1_CHANNEL;
nb_adc1_channels++;
#endif
#ifdef AD1_2_CHANNEL
adc_channel_map[AD1_2] = AD1_2_CHANNEL;
nb_adc1_channels++;
#endif
#ifdef AD1_3_CHANNEL
adc_channel_map[AD1_3] = AD1_3_CHANNEL;
nb_adc1_channels++;
#endif
#ifdef AD1_4_CHANNEL
adc_channel_map[AD1_4] = AD1_4_CHANNEL;
nb_adc1_channels++;
#endif
// initialize buffer pointers with 0 (not set). Buffer null pointers will be ignored in interrupt
// handler, which is important as there are no buffers registered at the time the ADC trigger
Expand All @@ -304,19 +308,23 @@ void adc_init( void ) {
#endif // USE_AD1


nb_adc2_channels = NB_ADC2_CHANNELS;
nb_adc2_channels = 0;
#if USE_AD2
#ifdef AD2_1_CHANNEL
adc_channel_map[AD2_1] = AD2_1_CHANNEL;
adc_channel_map[AD2_1 - nb_adc1_channels] = AD2_1_CHANNEL;
nb_adc2_channels++;
#endif
#ifdef AD2_2_CHANNEL
adc_channel_map[AD2_2] = AD2_2_CHANNEL;
adc_channel_map[AD2_2 - nb_adc1_channels] = AD2_2_CHANNEL;
nb_adc2_channels++;
#endif
#ifdef AD2_3_CHANNEL
adc_channel_map[AD2_3] = AD2_3_CHANNEL;
adc_channel_map[AD2_3 - nb_adc1_channels] = AD2_3_CHANNEL;
nb_adc2_channels++;
#endif
#ifdef AD2_4_CHANNEL
adc_channel_map[AD2_4] = AD2_4_CHANNEL;
adc_channel_map[AD2_4 - nb_adc1_channels] = AD2_4_CHANNEL;
nb_adc2_channels++;
#endif
// initialize buffer pointers with 0 (not set). Buffer null pointers will be ignored in interrupt
// handler, which is important as there are no buffers registered at the time the ADC trigger
Expand All @@ -326,19 +334,23 @@ void adc_init( void ) {
#endif // USE_AD2


nb_adc3_channels = NB_ADC3_CHANNELS;
nb_adc3_channels = 0;
#if USE_AD3
#ifdef AD3_1_CHANNEL
adc_channel_map[AD3_1] = AD3_1_CHANNEL;
adc_channel_map[AD3_1 - nb_adc1_channels - nb_adc2_channels] = AD3_1_CHANNEL;
nb_adc3_channels++;
#endif
#ifdef AD3_2_CHANNEL
adc_channel_map[AD3_2] = AD3_2_CHANNEL;
adc_channel_map[AD3_2 - nb_adc1_channels - nb_adc2_channels] = AD3_2_CHANNEL;
nb_adc3_channels++;
#endif
#ifdef AD3_3_CHANNEL
adc_channel_map[AD3_3] = AD3_3_CHANNEL;
adc_channel_map[AD3_3 - nb_adc1_channels - nb_adc2_channels] = AD3_3_CHANNEL;
nb_adc3_channels++;
#endif
#ifdef AD3_4_CHANNEL
adc_channel_map[AD3_4] = AD3_4_CHANNEL;
adc_channel_map[AD3_4 - nb_adc1_channels - nb_adc2_channels] = AD3_4_CHANNEL;
nb_adc3_channels++;
#endif
// initialize buffer pointers with 0 (not set). Buffer null pointers will be ignored in interrupt
// handler, which is important as there are no buffers registered at the time the ADC trigger
Expand Down
14 changes: 5 additions & 9 deletions sw/airborne/arch/stm32/mcu_periph/adc_arch.h
Expand Up @@ -32,8 +32,6 @@

#include BOARD_CONFIG

// NB_ADCx_CHANNELS

enum adc1_channels {
#ifdef AD1_1_CHANNEL
AD1_1,
Expand All @@ -47,12 +45,12 @@ enum adc1_channels {
#ifdef AD1_4_CHANNEL
AD1_4,
#endif
NB_ADC1_CHANNELS
ADC1_END
};

enum adc2_channels {
#ifdef AD2_1_CHANNEL
AD2_1,
AD2_1 = ADC1_END,
#endif
#ifdef AD2_2_CHANNEL
AD2_2,
Expand All @@ -63,12 +61,12 @@ enum adc2_channels {
#ifdef AD2_4_CHANNEL
AD2_4,
#endif
NB_ADC2_CHANNELS
ADC2_END
};

enum adc3_channels {
#ifdef AD3_1_CHANNEL
AD3_1,
AD3_1 = ADC2_END,
#endif
#ifdef AD3_2_CHANNEL
AD3_2,
Expand All @@ -79,11 +77,9 @@ enum adc3_channels {
#ifdef AD3_4_CHANNEL
AD3_4,
#endif
NB_ADC3_CHANNELS
ADC3_END
};

#define NB_ADC (NB_ADC1_CHANNELS+NB_ADC2_CHANNELS+NB_ADC3_CHANNELS)

#if USE_ADC_WATCHDOG

/* Watchdog callback type definition
Expand Down
7 changes: 0 additions & 7 deletions sw/airborne/mcu_periph/adc.h
Expand Up @@ -37,13 +37,6 @@
#include <inttypes.h>
#include "mcu_periph/adc_arch.h"

/* Allow driver implementation to define
* number of available ADCs implicitly
*/
#ifndef NB_ADC
#define NB_ADC 8
#endif

#define MAX_AV_NB_SAMPLE 0x20
#define DEFAULT_AV_NB_SAMPLE 0x20

Expand Down
1 change: 1 addition & 0 deletions sw/airborne/test/mcu_periph/test_adc.c
Expand Up @@ -33,6 +33,7 @@ static inline void main_init( void );
static inline void main_periodic_task( void );
static inline void main_event_task( void );

#define NB_ADC 8
#define ADC_NB_SAMPLES 16

static struct adc_buf buf_adc[NB_ADC];
Expand Down

0 comments on commit 48fd4b2

Please sign in to comment.