同步采樣一般應用於交流信號中,是指多個ADC的采集時刻完全同步。在電力測量領域,經常會遇到需要同步采樣的情況,比如同步采樣電壓電流信號,計算其相位差。阻抗分析時,也需要對輸入輸出信號進行同步采集,分析其相位差和幅度,計算阻抗。
多通道的同步ADC一般價格比較高,STM32內部的ADC可以靈活配置,實現同步采樣。部分型號的STM32有2個ADC,也有部分型號有3個ADC,今天將以STM32F407為例介紹3個ADC同步采樣的實現方法。
————————————————
版權聲明:本文為CSDN博主「天外飛仙CUG」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zhang062061/article/details/113735874
1.Mode選擇為三重同步規則模式。
2.使能DMA連續請求。
3.外部觸發源選擇TIM2觸發事件。
配置完成后,打開ADC2和ADC3的配置,可以看到,Mode已經自動配置為三重同步規則模式,且外部觸發源也已經隱藏無法選擇,因為三重同步規則模式下,三個ADC必須使用同一個外部觸發源。同時ADC2和ADC3的DMA也不需要配置,使用同一個DMA。ADC2配置如下:
ADC配置完成后,打開TIM2定時器,用於觸發ADC采樣。TIM2時鍾選擇內部時鍾(84MHz),選擇觸發事件為Update Event,用於觸發ADC。配置其分頻系數和計數周期如下,則ADC的采樣率為84MHz÷(83+1) ÷(199+1)=5000Hz。
uint8_t DMA_Flag = 0; void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { DMA_Flag = 1; }
HAL_ADC_Start(&hadc1); HAL_ADC_Start(&hadc2); HAL_ADC_Start(&hadc3);//啟動ADC HAL_ADCEx_MultiModeStart_DMA(&hadc1,(uint32_t*)adcbuf1,300);//啟動同步規則模式及DMA,3個ADC,每次采樣100個點*3 HAL_TIM_Base_Start(&htim2);//啟動TIM2,用於觸發ADC采樣 /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { if(DMA_Flag == 1)//AD轉換完成標准 { DMA_Flag = 0; HAL_TIM_Base_Stop(&htim2); HAL_ADCEx_MultiModeStop_DMA(&hadc1); HAL_ADC_Stop(&hadc1); HAL_ADC_Stop(&hadc2); HAL_ADC_Stop(&hadc3);//停止采樣 for(uint8_t i=0;i<100;i++)< span=""> { sprintf(str,"$,%d,%d,%d",adcbuf1[i][0],adcbuf1[i][1],adcbuf1[i][2]); HAL_UART_Transmit(&huart1,(uint8_t*)str,strlen(str),100);//串口發送到上位機 } HAL_ADC_Start(&hadc1); HAL_ADC_Start(&hadc2); HAL_ADC_Start(&hadc3); HAL_ADCEx_MultiModeStart_DMA(&hadc1,(uint32_t*)adcbuf1,300); HAL_TIM_Base_Start(&htim2);//重新啟動采樣 } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */