diff --git a/include/adc_dma.h b/include/adc_dma.h index c0750d071f91f3336dfbefcc2dc3e2058bcfe186..898830f6e720575277306d67d865f3c0afe0ddb9 100755 --- a/include/adc_dma.h +++ b/include/adc_dma.h @@ -7,8 +7,10 @@ extern "C" { #include "stm32f1xx.h" -typedef enum {ADC_CH1,ADC_CH2,ADC_CH3,ADC_CH4,ADC_CH5,ADC_CH6,ADC_CH7,ADC_CH8, - ADC_CH9,ADC_CH10,ADC_CH11,ADC_CH12,ADC_CH13,ADC_CH14,ADC_CH16,ADC_CH18} adc_ch_t; +#define ADC_NUM_CHANNELS 16 + +typedef enum {ADC_CH1=0,ADC_CH2=1,ADC_CH3=2,ADC_CH4=3,ADC_CH5=4,ADC_CH6=5,ADC_CH7=6,ADC_CH8=7, + ADC_CH9=8,ADC_CH10=9,ADC_CH11=10,ADC_CH12=11,ADC_CH13=12,ADC_CH14=13,ADC_CH16=15,ADC_CH18=17} adc_ch_t; void adc_init(void); void adc_start(void); diff --git a/src/adc_dma.c b/src/adc_dma.c index 28a66d0689a9d1d61601251585ea93435d943b56..818549216acd6de83475d85241382dda2edb2f3b 100755 --- a/src/adc_dma.c +++ b/src/adc_dma.c @@ -84,13 +84,13 @@ #define ADC_TIMER TIM1 #define ENABLE_ADC_TIMER_CLK __HAL_RCC_TIM1_CLK_ENABLE() #define ADC_TIMER_IRQn TIM1_CC_IRQn -#define ADC_TIMER_IRQHandler TIM1_IRQHandler +#define ADC_TIMER_IRQHandler TIM1_CC_IRQHandler // temperature conversion functions -#define TEMP_V25 0.76// ADC voltage at 25 degrees in V -#define TEMP_INV_SLOPE 400.0// ADC slope in mV/degree +#define TEMP_V25 1.43// ADC voltage at 25 degrees in V +#define TEMP_INV_SLOPE 232.558// ADC slope in degree/mV // general voltage conversion -#define VOLTAGE_DELTA 0.000805664 +#define VOLTAGE_DELTA 0.000805664 // private variables ADC_HandleTypeDef hadc1; @@ -106,7 +106,7 @@ uint16_t adc_convert_temperature(uint16_t value) { float conv_value; - conv_value=(value*VOLTAGE_DELTA-TEMP_V25)*TEMP_INV_SLOPE+25.0; + conv_value=(TEMP_V25-value*VOLTAGE_DELTA)*TEMP_INV_SLOPE+25.0; return conv_value*(1<<10);// fixed point format 6 | 10 } @@ -171,9 +171,6 @@ void ADC_DMA_IRQHandler(void) __HAL_DMA_CLEAR_FLAG(&hdma_adc1, __HAL_DMA_GET_TC_FLAG_INDEX(&hdma_adc1)); for(i=0;i<9;i++) { - value=adc_convert_voltage(adc_data[i]&0x0000FFFF); - ram_data[DARWIN_ADC_CH1_L+i*4]=value%256; - ram_data[DARWIN_ADC_CH1_H+i*4]=value/256; if(i==7) { value=adc_convert_temperature(adc_data[i]&0x0000FFFF); @@ -182,10 +179,13 @@ void ADC_DMA_IRQHandler(void) } else { - value=adc_convert_voltage((adc_data[i]&0xFFFF0000)>>16); - ram_data[DARWIN_ADC_CH2_L+i*4]=value%256; - ram_data[DARWIN_ADC_CH2_H+i*4]=value/256; + value=adc_convert_voltage(adc_data[i]&0x0000FFFF); + ram_data[DARWIN_ADC_CH1_L+i*4]=value%256; + ram_data[DARWIN_ADC_CH1_H+i*4]=value/256; } + value=adc_convert_voltage((adc_data[i]&0xFFFF0000)>>16); + ram_data[DARWIN_ADC_CH2_L+i*4]=value%256; + ram_data[DARWIN_ADC_CH2_H+i*4]=value/256; } } } @@ -227,10 +227,10 @@ void adc_init(void) ADC_ENABLE_DMA_CLK; ADC1_ENABLE_CLK; - /* configure ADC1 */ + // configure ADC1 hadc1.Instance = ADC1; - hadc1.Init.ScanConvMode = ENABLE; - hadc1.Init.ContinuousConvMode = ENABLE; + hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE; + hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; @@ -240,7 +240,7 @@ void adc_init(void) multimode.Mode = ADC_DUALMODE_REGSIMULT; HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode); - /* configure ADC1 channels */ + // configure ADC1 channels sConfig.Channel = ADC1_CH1; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; @@ -278,7 +278,7 @@ void adc_init(void) sConfig.Rank = 9; HAL_ADC_ConfigChannel(&hadc1, &sConfig); - /* configure GPIO */ + // configure GPIO GPIO_InitStruct.Pin = ADC1_CH1_PIN|ADC1_CH2_PIN|ADC1_CH3_PIN|ADC1_CH4_PIN| ADC1_CH5_PIN|ADC1_CH6_PIN|ADC1_CH7_PIN; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; @@ -286,18 +286,15 @@ void adc_init(void) ADC2_ENABLE_CLK; hadc2.Instance = ADC2; - hadc2.Init.ScanConvMode = ENABLE; - hadc2.Init.ContinuousConvMode = ENABLE; + hadc2.Init.ScanConvMode = ADC_SCAN_ENABLE; + hadc2.Init.ContinuousConvMode = DISABLE; hadc2.Init.DiscontinuousConvMode = DISABLE; - hadc2.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1; + hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;//ADC_EXTERNALTRIGCONV_T1_CC1; hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc2.Init.NbrOfConversion = 9; HAL_ADC_Init(&hadc2); - multimode.Mode = ADC_DUALMODE_REGSIMULT; - HAL_ADCEx_MultiModeConfigChannel(&hadc2, &multimode); - - /* configure ADC2 channels */ + // configure ADC2 channels sConfig.Channel = ADC2_CH1; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; @@ -335,7 +332,7 @@ void adc_init(void) sConfig.Rank = 9; HAL_ADC_ConfigChannel(&hadc2, &sConfig); - /* configure GPIO */ + // configure GPIO GPIO_InitStruct.Pin = ADC2_CH4_PIN|ADC2_CH5_PIN|ADC2_CH6_PIN|ADC2_CH7_PIN| ADC2_CH8_PIN|ADC2_CH9_PIN; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; @@ -347,9 +344,9 @@ void adc_init(void) GPIO_InitStruct.Pin = ADC2_CH1_PIN; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - /* initialize DMA */ + //initialize DMA hdma_adc1.Instance = ADC_DMA_CHANNEL; hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE; @@ -366,24 +363,23 @@ void adc_init(void) HAL_NVIC_EnableIRQ(ADC_DMA_IRQn); /* initialize timer */ + ENABLE_ADC_TIMER_CLK; ADC_TIM_Handle.Instance = ADC_TIMER; ADC_TIM_Handle.Init.Prescaler = 1000; ADC_TIM_Handle.Init.CounterMode = TIM_COUNTERMODE_UP; ADC_TIM_Handle.Init.Period = 0xFFFF; ADC_TIM_Handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; ADC_TIM_Handle.Init.RepetitionCounter = 0; - HAL_TIM_Base_Init(&ADC_TIM_Handle); HAL_NVIC_SetPriority(ADC_TIMER_IRQn, 3, 1); HAL_NVIC_EnableIRQ(ADC_TIMER_IRQn); + HAL_TIM_OC_Init(&ADC_TIM_Handle); /* use the internal clock */ sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&ADC_TIM_Handle, &sClockSourceConfig); - HAL_TIM_OC_Init(&ADC_TIM_Handle); /* disable master/slave mode */ sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&ADC_TIM_Handle, &sMasterConfig); - sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; @@ -392,7 +388,6 @@ void adc_init(void) sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; HAL_TIMEx_ConfigBreakDeadTime(&ADC_TIM_Handle, &sBreakDeadTimeConfig); - TIM_OCInitStructure.OCMode = TIM_OCMODE_TOGGLE; TIM_OCInitStructure.OCPolarity = TIM_OCPOLARITY_HIGH; TIM_OCInitStructure.OCNPolarity = TIM_OCNPOLARITY_HIGH; @@ -409,7 +404,6 @@ void adc_init(void) HAL_ADC_Start(&hadc2); HAL_ADCEx_MultiModeStart_DMA(&hadc1,adc_data,9); - adc_start(); } void adc_start(void) @@ -432,7 +426,7 @@ void adc_stop(void) void adc_set_period(uint8_t period_ms) { - adc_period_ms=period_ms*84; + adc_period_ms=period_ms*36; ram_data[DARWIN_ADC_PERIOD]=period_ms; }