From 09eb58d7055c3598de0f82a5a6416bbbf53b8d24 Mon Sep 17 00:00:00 2001 From: Yury Vostrenkov Date: Sat, 7 Mar 2020 20:51:07 +0300 Subject: [PATCH] Improved ADC performance --- Inc/analog.h | 4 +--- Inc/common_defines.h | 2 +- Inc/main.h | 2 +- MDK-ARM/FreeJoy.bin | Bin 24432 -> 24540 bytes Src/analog.c | 21 ++++++++++++++++++++- Src/periphery.c | 2 +- Src/stm32f10x_it.c | 26 ++++++++++++++++++-------- 7 files changed, 42 insertions(+), 15 deletions(-) diff --git a/Inc/analog.h b/Inc/analog.h index 8fa79fc..637fef0 100644 --- a/Inc/analog.h +++ b/Inc/analog.h @@ -16,9 +16,7 @@ #define DEADBAND_BUF_SIZE 8 #define DEADBAND_HOLD_VALUE 2000 -#define ADC_PERIOD_MS 2 -#define SENSORS_PERIOD_MS 2 - +#define PREBUF_SIZE 8 extern tle_t sensors[MAX_AXIS_NUM]; diff --git a/Inc/common_defines.h b/Inc/common_defines.h index e83242b..736b265 100644 --- a/Inc/common_defines.h +++ b/Inc/common_defines.h @@ -11,7 +11,7 @@ //#define DEBUG -#define FIRMWARE_VERSION 0x1413 // v1.4.1b3 +#define FIRMWARE_VERSION 0x1414 // v1.4.1b4 #define USED_PINS_NUM 30 // constant for BluePill and BlackPill boards #define MAX_AXIS_NUM 8 // max 8 #define MAX_BUTTONS_NUM 128 // power of 2, max 128 diff --git a/Inc/main.h b/Inc/main.h index 2499307..9e7a5aa 100644 --- a/Inc/main.h +++ b/Inc/main.h @@ -18,7 +18,7 @@ static const dev_config_t init_config = { - .firmware_version = 0x1413, // do not change + .firmware_version = 0x1414, // do not change /* Name of device in devices dispatcher diff --git a/MDK-ARM/FreeJoy.bin b/MDK-ARM/FreeJoy.bin index 797400971c4fd0e7b827fddad384b8389217886b..1ce076bd68f0f9b19f0ba81d34fb3d7151cda037 100644 GIT binary patch delta 3304 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 diff --git a/Src/analog.c b/Src/analog.c index 037a230..cfa861f 100644 --- a/Src/analog.c +++ b/Src/analog.c @@ -34,6 +34,7 @@ analog_data_t input_data[MAX_AXIS_NUM]; analog_data_t scaled_axis_data[MAX_AXIS_NUM]; analog_data_t raw_axis_data[MAX_AXIS_NUM]; analog_data_t out_axis_data[MAX_AXIS_NUM]; +analog_data_t tmp_axis_data[PREBUF_SIZE][MAX_AXIS_NUM]; analog_data_t FILTER_LEVEL_1_COEF[FILTER_BUF_SIZE] = {40, 30, 15, 10, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; analog_data_t FILTER_LEVEL_2_COEF[FILTER_BUF_SIZE] = {30, 20, 10, 10, 10, 6, 6, 4, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; @@ -462,7 +463,7 @@ void AxesInit (dev_config_t * p_dev_config) if (p_dev_config->pins[i] == AXIS_ANALOG) // Configure ADC channels { /* ADC1 regular channel configuration */ - ADC_RegularChannelConfig(ADC1, channel_config[i].channel, i+1, ADC_SampleTime_239Cycles5); + ADC_RegularChannelConfig(ADC1, channel_config[i].channel, i+1, ADC_SampleTime_71Cycles5); axis_num++; } @@ -506,8 +507,12 @@ void AxesInit (dev_config_t * p_dev_config) */ void ADC_Conversion (void) { + static uint8_t num_of_conv = 0; + analog_data_t tmp = 0; + if (adc_cnt > 0) { + DMA1_Channel1->CMAR = (uint32_t) &tmp_axis_data[num_of_conv++]; DMA_SetCurrDataCounter(DMA1_Channel1, MAX_AXIS_NUM); DMA_Cmd(DMA1_Channel1, ENABLE); ADC_Cmd(ADC1, ENABLE); @@ -519,6 +524,20 @@ void ADC_Conversion (void) ADC_Cmd(ADC1, DISABLE); DMA_Cmd(DMA1_Channel1, DISABLE); + + if (num_of_conv > PREBUF_SIZE - 1) + { + num_of_conv = 0; + for (uint8_t i=0; i= ADC_PERIOD_MS) { adc_millis = millis; - - + AxesProcess(&dev_config); - + // Disable periphery before ADC conversion RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,DISABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3|RCC_APB1Periph_TIM4, DISABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,DISABLE); - - ADC_Conversion(); + + for (uint8_t i=0; i= ENCODER_PERIOD_MS) + { + encoder_millis = millis; + EncoderProcess(buttons_state, &dev_config); + } } }