From efaeb6d19f1199aa30304ac42beb199dcb016ccd Mon Sep 17 00:00:00 2001 From: Monideep Bora Date: Fri, 28 Apr 2023 10:46:41 +0200 Subject: [PATCH] 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)