首先需要用CubeMX配置STM32,除了基础的系统的配置之外,可以打开UART串口通讯,便于后续将采样值传输至上位机,便于调试(注:串口需要打开异步通信,配置相应的波特率,可以打开DMA和串口中断,其余配置保持默认即可)。
之后便是配置ADC,考虑到后续需要将输入信号的采样值用FFT处理
因此ADC的采样值需要保存到一个缓冲区,不妨称之为ADC_Buffer[NPT],NPT-是你对信号的采样点数
一般使用1024个点
(采样点数过小会导致相邻的采样点数之间间隔时间太长;而采样点数过多需要占用单片机太多的资源,很大概率会导致单片机的编译报错:No space...)
考虑到上述ADC采样的种种需求,对于单通道采样来说,ADC的配置保持为原来的默认即可
只需要将ADC的触发从软件触发改成TIM定时器触发并且开启DMA搬运即可

因为FFT需要一组时域上的数据,因此DMA设置为Normal模式-ADC采样完成后便结束DMA搬运
搬运数据大小改为Word,至此DMA和ADC的设置已经完成了

上面ADC的设置中我们需要用到定时器来触发ADC采样
简单来说就是设置一个定时器闹钟,每次定时器响了就让ADC去采样一次
那么你采样的速度(或者说频率更好)取决于你定时器设置的时间
因此在TIM的配置中,预分频和自动重装值的设置需要根据你采样的信号的频率来设置
然后你要让ADC知道你的定时器响了再去采样,因此你需要让TIM每次到点后发出一个信号
这里我们配置Update Event方便触发ADC采样
最后我们只需要打开ADC、DMA、TIM的中断即可完成全部的配置。

全过程逻辑为:开启ADC的DMA搬运模式,因为ADC的采样需要TIM的触发,因此当前不会有任何的数据;
之后打开TIM的同时,ADC自动开始采样直到你存储数据的Buffer满了
之后就会进入到你的ADC的完成中断回调函数中,在这里面建议关闭DMA采样然后设置标志位告诉主程序可以进行数据的处理。
点击查看代码
HAL_ADC_Start_DMA(&hadc2, ch1.adc_buf, FFT_LENGTH);
HAL_TIM_Base_Start(&htim3);
while(!DMA_Finish);
if(DMA_Finish)
{
/*数据处理*/
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
if (hadc->Instance == ADC2)
{
DMA_Finish = 1;
HAL_ADC_Stop_DMA(&hadc2);
// HAL_TIM_Base_Stop(&htim3);
// 两种Stop的效果一样 建议DMA
}
}
浙公网安备 33010602011771号