同步采样一般应用于交流信号中,是指多个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 */