From efaeb6d19f1199aa30304ac42beb199dcb016ccd Mon Sep 17 00:00:00 2001 From: Monideep Bora Date: Fri, 28 Apr 2023 10:46:41 +0200 Subject: [PATCH 1/3] diff gain working --- cores/wiring_analog.c | 50 +++++++++++++++++++++++++++++++++++++++++++ cores/wiring_analog.h | 2 ++ keywords.txt | 1 + 3 files changed, 53 insertions(+) diff --git a/cores/wiring_analog.c b/cores/wiring_analog.c index 5fc4b102..11ffe9d9 100644 --- a/cores/wiring_analog.c +++ b/cores/wiring_analog.c @@ -216,6 +216,56 @@ if( channel < NUM_ANALOG_INPUTS ) return value; } +uint32_t analogRead_special( uint8_t channel ) +{ +uint32_t value; + +value = 0xFFFFFFFF; +if( channel < NUM_ANALOG_INPUTS ) + { + XMC_ADC_t *adc = &mapping_adc[ channel ]; + +#if(XMC_VADC_GROUP_AVAILABLE == 1U) + // ADC grouping + if( !(adc->enabled) ) + { + XMC_VADC_CHANNEL_CONFIG_t vadc_gobal_channel_config; + memset( &vadc_gobal_channel_config, 0, sizeof( XMC_VADC_CHANNEL_CONFIG_t ) ); + vadc_gobal_channel_config.input_class = XMC_VADC_CHANNEL_CONV_GROUP_CLASS1; + vadc_gobal_channel_config.result_reg_number = adc->result_reg_num; + vadc_gobal_channel_config.alias_channel = XMC_VADC_CHANNEL_ALIAS_DISABLED; + + XMC_VADC_RESULT_CONFIG_t vadc_gobal_result_config = { .g_rcr = 0 }; + /* Configure a channel belonging to the aforesaid conversion kernel */ + XMC_VADC_GROUP_ChannelInit( adc->group, adc->channel_num, &vadc_gobal_channel_config ); + /* Configure a result resource belonging to the aforesaid conversion kernel */ + XMC_VADC_GROUP_ResultInit( adc->group, adc->result_reg_num, &vadc_gobal_result_config ); + /* Add channel into the Background Request Source Channel Select Register */ + XMC_VADC_GLOBAL_BackgroundAddChannelToSequence( VADC, (uint32_t)adc->group_num, + (uint32_t)adc->channel_num ); + + XMC_VADC_GLOBAL_SHS_SetGainFactor(SHS0,3,XMC_VADC_GROUP_INDEX_0,(uint32_t)adc->channel_num); + } + /* Start conversion manually using load event trigger*/ + XMC_VADC_GLOBAL_BackgroundTriggerConversion( VADC ); + value = XMC_VADC_GROUP_GetResult( adc->group, adc->result_reg_num ); +#else + // XMC1100 no ADC grouping + if( !(adc->enabled) ) + /* Add a channel to the background source. */ + VADC->BRSSEL[ ADC_CONVERSION_GROUP ] = (uint32_t)( 1U << adc->channel_num ); + XMC_VADC_GLOBAL_SHS_SetGainFactor(SHS0,1,XMC_VADC_GROUP_INDEX_0,(uint32_t)adc->channel_num); + // Generates conversion request + XMC_VADC_GLOBAL_BackgroundTriggerConversion( VADC ); + + // Wait until conversion is ready + while( ( ( value = XMC_VADC_GLOBAL_GetDetailedResult( VADC ) ) & VADC_GLOBRES_VF_Msk) == 0u ); +#endif + value = ( ( value & VADC_GLOBRES_RESULT_Msk) >> ( ADC_MAX_READ_RESOLUTION - _readResolution ) ); + } +return value; +} + /* Helper function for analogWrite and setAnalogWriteFrequency to scan mapping tables to determine for a given pin which PWM4, PWM8 or DAC diff --git a/cores/wiring_analog.h b/cores/wiring_analog.h index 3da40ccc..3032429d 100644 --- a/cores/wiring_analog.h +++ b/cores/wiring_analog.h @@ -85,6 +85,8 @@ extern "C" { */ extern uint32_t analogRead( uint8_t channel ) ; + extern uint32_t analogRead_special( uint8_t channel ) ; + /* * \brief Set the resolution of analogRead return values in number of bits. * \note Default is 10 bits (range from 0 to 1023). diff --git a/keywords.txt b/keywords.txt index 4a2f3bb9..04c1762b 100644 --- a/keywords.txt +++ b/keywords.txt @@ -16,6 +16,7 @@ getAnalogReadBits KEYWORD2 getAnalogWriteBits KEYWORD2 getAnalogReadMaximum KEYWORD2 getAnalogWriteMaximum KEYWORD2 +analogRead_special KEYWORD2 ####################################### # Instances (KEYWORD2) From e73be6f6f9046745dffc845d5aeef8719d083812 Mon Sep 17 00:00:00 2001 From: Monideep Bora Date: Tue, 2 May 2023 16:04:22 +0200 Subject: [PATCH 2/3] final changes for ADC gain stage enable --- cores/wiring_analog.c | 23 ++++++++++++++++++----- cores/wiring_analog.h | 16 +++++++++++++++- keywords.txt | 2 +- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/cores/wiring_analog.c b/cores/wiring_analog.c index 11ffe9d9..cf3d5080 100644 --- a/cores/wiring_analog.c +++ b/cores/wiring_analog.c @@ -216,8 +216,19 @@ if( channel < NUM_ANALOG_INPUTS ) return value; } -uint32_t analogRead_special( uint8_t channel ) +/* analogRead_variableGain takes parameter of ADC channel number and gain value + return 0xFFFFFFFF for invalid channel + + gain value gain factor + 0 1 + 1 3 + 2 6 + 3 12 +*/ + +uint32_t analogRead_variableGain( uint8_t channel, uint8_t gain_value ) { +#if(XMC_VADC_SHS_AVAILABLE == 1U) uint32_t value; value = 0xFFFFFFFF; @@ -243,8 +254,8 @@ if( channel < NUM_ANALOG_INPUTS ) /* Add channel into the Background Request Source Channel Select Register */ XMC_VADC_GLOBAL_BackgroundAddChannelToSequence( VADC, (uint32_t)adc->group_num, (uint32_t)adc->channel_num ); - - XMC_VADC_GLOBAL_SHS_SetGainFactor(SHS0,3,XMC_VADC_GROUP_INDEX_0,(uint32_t)adc->channel_num); + /* Set the gain factor of the Sample and hold module*/ + XMC_VADC_GLOBAL_SHS_SetGainFactor( SHS0, gain_value, (uint32_t)adc->group_num, (uint32_t)adc->channel_num ); } /* Start conversion manually using load event trigger*/ XMC_VADC_GLOBAL_BackgroundTriggerConversion( VADC ); @@ -254,7 +265,8 @@ if( channel < NUM_ANALOG_INPUTS ) if( !(adc->enabled) ) /* Add a channel to the background source. */ VADC->BRSSEL[ ADC_CONVERSION_GROUP ] = (uint32_t)( 1U << adc->channel_num ); - XMC_VADC_GLOBAL_SHS_SetGainFactor(SHS0,1,XMC_VADC_GROUP_INDEX_0,(uint32_t)adc->channel_num); + /* Set the gain factor of the Sample and hold module */ + XMC_VADC_GLOBAL_SHS_SetGainFactor( SHS0, gain_value, XMC_VADC_GROUP_INDEX_0, (uint32_t)adc->channel_num ); // Generates conversion request XMC_VADC_GLOBAL_BackgroundTriggerConversion( VADC ); @@ -262,8 +274,9 @@ if( channel < NUM_ANALOG_INPUTS ) while( ( ( value = XMC_VADC_GLOBAL_GetDetailedResult( VADC ) ) & VADC_GLOBRES_VF_Msk) == 0u ); #endif value = ( ( value & VADC_GLOBRES_RESULT_Msk) >> ( ADC_MAX_READ_RESOLUTION - _readResolution ) ); - } return value; + } +#endif } diff --git a/cores/wiring_analog.h b/cores/wiring_analog.h index 3032429d..156561bf 100644 --- a/cores/wiring_analog.h +++ b/cores/wiring_analog.h @@ -85,7 +85,21 @@ extern "C" { */ extern uint32_t analogRead( uint8_t channel ) ; - extern uint32_t analogRead_special( uint8_t channel ) ; + /* + * \brief Reads the value from the specified analogue channel and add variable gain at input. + * + * \param channel + * \param gain_factor + * + * gain value gain factor + * 0 1 + * 1 3 + * 2 6 + * 3 12 + * + * \return Read value from selected channel, or 0xFFFFFFFF for error. + */ + extern uint32_t analogRead_variableGain( uint8_t channel, uint8_t gain_value ) ; /* * \brief Set the resolution of analogRead return values in number of bits. diff --git a/keywords.txt b/keywords.txt index 04c1762b..bdde5779 100644 --- a/keywords.txt +++ b/keywords.txt @@ -16,7 +16,7 @@ getAnalogReadBits KEYWORD2 getAnalogWriteBits KEYWORD2 getAnalogReadMaximum KEYWORD2 getAnalogWriteMaximum KEYWORD2 -analogRead_special KEYWORD2 +analogRead_variableGain KEYWORD2 ####################################### # Instances (KEYWORD2) From 448e285fe4027b4d1778c67e0c56e0e69a7781f1 Mon Sep 17 00:00:00 2001 From: Monideep Bora Date: Fri, 5 May 2023 10:38:25 +0200 Subject: [PATCH 3/3] added macros for ADC variable gain --- cores/wiring_analog.c | 3 ++- cores/wiring_analog.h | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/cores/wiring_analog.c b/cores/wiring_analog.c index cf3d5080..6e1576b4 100644 --- a/cores/wiring_analog.c +++ b/cores/wiring_analog.c @@ -223,7 +223,8 @@ return value; 0 1 1 3 2 6 - 3 12 + 3 12 + Also, refer to macros in wiring_analog.h */ uint32_t analogRead_variableGain( uint8_t channel, uint8_t gain_value ) diff --git a/cores/wiring_analog.h b/cores/wiring_analog.h index 156561bf..10162ee1 100644 --- a/cores/wiring_analog.h +++ b/cores/wiring_analog.h @@ -26,6 +26,15 @@ extern "C" { #endif +/********************************************************************************************************************* + * MACROS + ********************************************************************************************************************/ +// ADC gain macros +#define ADC_VAR_GAIN_FACTOR_1 0 +#define ADC_VAR_GAIN_FACTOR_3 1 +#define ADC_VAR_GAIN_FACTOR_6 2 +#define ADC_VAR_GAIN_FACTOR_12 3 + //**************************************************************************** // @External Prototypes //****************************************************************************