经过具体实验可知,以前思学师哥的程序中有ADC开始DMA采集和停止DMA采集两个函数,可以理解成消抖,因为采集频率过快数据可能会发飘。
硬石资料如下
配置要求一定要在mode处勾选circular ,数据宽度一定要选择“Word”
根据实验只需要将ADC的DMA通道采集打开,无需关闭即可采集成功,而且数据比较稳定,这样为快速傅里叶变换做出了准备。
经过一下午的实验可知ADC采集周期过短的时候在同时调用基本定时器PWM输出,高级定时器PWM输入捕获,串口中断程序,由实验可知无法通过硬石的方法使得ADC正常采集数据,因此思学师哥程序的性价比更高,有始有终才是做事的原则,程序如下。
//常用采集的数组
u32 uhADCxConvertedValue[2];
ADC循环采集,采集频率设置需要从以下图中选项设置时钟触发。
定时器按照下图进行配置即可获得10K的ADC采集频率,上次从硬石教材中的ADC循环采集由于使用的默认系统时钟进行采集,在进行了多项硬件设备的初始化后,默认系统时钟受到影响。
代码补充方面:
需要补充定时器中断触发函数,在进入while之前进行补充
需要补充定时器中断服务回调函数
在tim.c中补全下列代码。
*/ USER CODE BEGIN 1 /
//回调函数,定时器中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef htim)
{
if(htim==(&htim3))
{
HAL_ADC_Start(&hadc1); //开启AD转换
}
}
/ USER CODE END 1 /
主函数中的代码补充
HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADC_Start_DMA(&hadc1,uhADCxConvertedValue,6);
补充tim.c中的代码
*void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef htim)
{
if(htim == &htim3)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_Start_DMA(&hadc1,uhADCxConvertedValue, 2);
}
}
最重要的事情:
ADC的采集周期不能使用最小的,因为定时器的频率可能达不到。
而且定时器计数周期不能过小。ADC的外部中断不用开启,定时器3的中断必须开启,这在配置过程中非常重要这点重要性小于以上叙述和定时器计数周期配置。
最重要的ADC设置截图:
定时器计数周期不能太小
最终理想的定时器配置函数: