STM32F4 定時器觸發adc采樣 DMA傳輸長度1024個數 aADCxConvertedData緩存區內只有一半數據 前512是ad模擬量 后一半全是0
- void MX_ADC1_Init(void)
- {
- /* USER CODE BEGIN ADC1_Init 0 */
- /* USER CODE END ADC1_Init 0 */
- ADC_ChannelConfTypeDef sConfig = {0};
- /* USER CODE BEGIN ADC1_Init 1 */
- /* USER CODE END ADC1_Init 1 */
- /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
- */
- hadc1.Instance = ADC1;
- hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV6; //6分頻 最小采樣周期2.5 + 12.5固定周期 采樣一次1微秒
- hadc1.Init.Resolution = ADC_RESOLUTION_12B;
- hadc1.Init.ScanConvMode = DISABLE;
- hadc1.Init.ContinuousConvMode = DISABLE; //ENABLE
- hadc1.Init.DiscontinuousConvMode = DISABLE;
- hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
- hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T3_TRGO;
- hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
- hadc1.Init.NbrOfConversion = 1;
- hadc1.Init.DMAContinuousRequests = ENABLE;
- hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV ;
- if (HAL_ADC_Init(&hadc1) != HAL_OK)
- {
- Error_Handler();
- }
- /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
- */
- // sConfig.Channel = ADC_CHANNEL_2;
- // sConfig.Rank = 1;
- // sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES;
- // if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
- // {
- // Error_Handler();
- // }
- /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
- */
- // sConfig.Channel = ADC_CHANNEL_3;
- // sConfig.Rank = 2;
- // if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
- // {
- // Error_Handler();
- // }
- /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
- */
- // sConfig.Channel = ADC_CHANNEL_1;
- // sConfig.Rank = 3;
- // if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
- // {
- // Error_Handler();
- // }
- /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
- */
- // sConfig.Channel = ADC_CHANNEL_12;
- // sConfig.Rank = 4;
- // if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
- // {
- // Error_Handler();
- // }
- /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
- */
- sConfig.Channel = ADC_CHANNEL_13;
- sConfig.SamplingTime = ADC_SAMPLETIME_15CYCLES;
- sConfig.Rank = 1;
- if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
- {
- Error_Handler();
- }
- /* USER CODE BEGIN ADC1_Init 2 */
- /* USER CODE END ADC1_Init 2 */
- // HAL_DMA_Abort_IT(&hdma_adc1);
- __HAL_DMA_ENABLE_IT(&hdma_adc1,DMA_IT_TC); //開啟傳輸完成中斷
- // HAL_ADC_Start_IT(&hadc1);
- }
- void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- if(adcHandle->Instance==ADC1)
- {
- /* USER CODE BEGIN ADC1_MspInit 0 */
- /* USER CODE END ADC1_MspInit 0 */
- /* ADC1 clock enable */
- __HAL_RCC_ADC1_CLK_ENABLE();
- __HAL_RCC_GPIOC_CLK_ENABLE();
- __HAL_RCC_GPIOA_CLK_ENABLE();
- /**ADC1 GPIO Configuration
- PC2 ------> ADC1_IN12
- PC3 ------> ADC1_IN13
- PA1 ------> ADC1_IN1
- PA2 ------> ADC1_IN2
- PA3 ------> ADC1_IN3
- */
- GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
- GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
- GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
- GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- /* ADC1 DMA Init */
- /* ADC1 Init */
- hdma_adc1.Instance = DMA2_Stream0;
- hdma_adc1.Init.Channel = DMA_CHANNEL_0;
- hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
- hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
- hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
- hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
- hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
- hdma_adc1.Init.Mode = DMA_NORMAL; //一般模式 DMA_NORMAL //DMA_CIRCULAR 循環模式
- hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
- hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
- if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
- {
- Error_Handler();
- }
- __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
- /* USER CODE BEGIN ADC1_MspInit 1 */
- /* ADC1 interrupt Init */
- // HAL_NVIC_SetPriority(ADC_IRQn, 5, 0);
- // HAL_NVIC_EnableIRQ(ADC_IRQn);
- /* USER CODE END ADC1_MspInit 1 */
- }
- }
- void DMA2_Stream0_IRQHandler(void)
- {
- /* USER CODE BEGIN 2 */
- // HAL_ADC_Stop_DMA(&hadc1);
- /* USER CODE BEGIN 2 */ //需要判斷DMA是否傳輸完成 如果傳輸完成在繼續
- // if(__HAL_DMA_GET_FLAG(&hdma_adc1,DMA_FLAG_TCIF0_4)!=RESET)//DMA傳輸完成
- // {
- // __HAL_DMA_CLEAR_FLAG(&hdma_adc1,DMA_FLAG_TCIF0_4);//清除DMA傳輸完成中斷標志位
-
- HAL_TIM_Base_Stop (&htim3);
-
- ADC_Conver_flag = 1; //傳輸完成標志位
-
- ADConve_CNT++;
-
- if(ADConve_CNT > 1024)
- {
- ADConve_CNT = 0;
- }
-
- // }
-
- HAL_DMA_IRQHandler(&hdma_adc1);
-
-
- }
- void Task1_AdcConverted(void) //任務1 -> adc采集任務
- {
- float adc_VreValue1 = 0;
- float adc_result1 = 0;
- float adc_VreValue2 = 0;
- float adc_power_value = 0;
- static u16 i = 0;
- if(ADC_Conver_flag == 1) //轉化完成標志位
- {
- printf("***************adc轉化成功**********************\r\n");
- ADC_Conver_flag = 0; ////轉化完成標志位
- //抽取數據
- // Get_AdcVaule_arry(aADCxConvertedData,ADC_POWER_Value,ADC_1_Value_DMA,ADC_CONVERTED_DATA_BUFFER_SIZE) ; //抽取數據
-
- // adc_VreValue1 = MedianFilteringForSensor(ADC_POWER_Value,1024); //中值濾波
-
- // adc_result1 = moving_average_filtre(adc_VreValue1); //滑動濾波算法
-
- // adc_power_value = (float) adc_VreValue1*(float)3.3/4096;
-
- for(i = 0;i < 1024 ; i++)
- {
- printf("%d \r\n ", aADCxConvertedData[i]);
- // printf("%d \r\n ", i);
- delay_ms(30);
- }
-
-
- // printf("基準電壓power = %0.2f\r\n ", adc_power_value);
- //// printf("ad_value = %0.2f\r\n ", adc_VreValue2);
- // printf("轉換次數= %d \r\n ", ADConve_CNT);
- // clean_buff(aADCxConvertedData ,ADC_CONVERTED_DATA_BUFFER_SIZE );
-
- // HAL_TIM_Base_Start(&htim3); //使用定時器3啟動adc采樣
- delay_ms(1000);
- printf("*************************************\r\n");
- //
- // Get_AdcVaule_arry(u16 * INPUT_pDst,ADC_POWER_Value,u16 * OUTPUT_BUF2,u16 nums) ;
- //
-
- }
- }
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- // u16 i = 0;
- u8 sys_cnt = 0;
- /* USER CODE END 1 */
- /* MCU Configuration--------------------------------------------------------*/
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* USER CODE END Init */
- /* Configure the system clock */
- SystemClock_Config();
- /* USER CODE BEGIN SysInit */
- /* USER CODE END SysInit */
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- /* USER CODE BEGIN SysInit */
- MX_DMA_Init();
- /* USER CODE BEGIN SysInit */
- MX_ADC1_Init();
- /* USER CODE BEGIN SysInit */
- MX_TIM3_Init(); //觸發ADC 的時鐘
- /* USER CODE BEGIN SysInit */
- MX_TIM4_Init(); //通用定時器1ms中斷
- /* USER CODE BEGIN SysInit */
- MX_UART5_Init(); //485接口
- /* USER CODE BEGIN SysInit */
- MX_USART1_UART_Init();//備用
- /* USER CODE BEGIN SysInit */
- MX_IWDG_Init(64,1000);//分頻數為64,重載值為500,溢出時間為1s 1000為兩秒
- /* USER CODE END 2 */
- TIM2_PWM_Init(1000-1,84-1); //84M/84=1M的計數頻率,自動重裝載為 ARR,那么PWM頻率為 1M /ARR = f HZ
- /* USER CODE BEGIN 2 */
- HAL_TIM_Base_Start(&htim3); //使用定時器3啟動adc采樣
- //adc啟動DMA采樣
- HAL_ADC_Start_DMA(&hadc1,(uint32_t *)aADCxConvertedData,1024);
- printf("********RUN*******\r\n");
- delay_ms(100);
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- /* USER CODE END WHILE */
- Task1_AdcConverted(); //任務1 -> adc采集任務
- /* USER CODE END WHILE */
- // Task2_Modubus(); //任務2 -> Modubus任務
-
- /* USER CODE END WHILE */ //本次任務結束
- sys_cnt++;
- if(sys_cnt > 20)
- {
- sys_cnt = 0;
- }
-
- delay_ms(100);
- // printf("***************程序運行中**********************\r\n");
-
- /* USER CODE BEGIN 3 */
- }
- /* USER CODE END 3 */
- }
復制代碼 |