如何使用stm32f103实现扫频,上限截至频率须达到150kHZ
不知道你这个问题是否已经解决, 如果还没有解决的话:我们用ADC的规则通道(注入通道类似),首先要配置它的工作状态:单通道还是多通道,单次转换还是连续转换
这里我暂时用了ADC1和ADC2,分别一个通道,所以不用开启扫描模式。如果是多通道,每个通道都要转换则需要开启扫描模式。
由于我们需要定时器去触发ADC转换,如果是连续模式,定时器触发一次就不会结束了。要设置成单次模式,定时器触发一次,转换一次。
接下来是ADC的时钟,ADCCLK是由PCLK分频得到:
配置好后开启DMA,数据长度可以为Word或HalfWorld,设置为circle模式,让DMA不停搬运
配置高级定时器TIM8的TRGO为更新事件,设置定时器计数频率和装载值
选择ADC的触发源为TIM8 TRGO,并设置采样周期
生成代码打开cube,调用初始化函数。
HAL_TIM_Base_Start(&htim8);//开启定时器
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)ADC_Value1,(uint32_t)AVER*ADC1_CH);//开启ADC1 DMA1
HAL_ADC_Start_DMA(&hadc2,(uint32_t*)ADC_Value2,(uint32_t)AVER*ADC2_CH);//开启ADC2 DMA2
对HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc,uint32_t* pData,uint32_t Length)说明:
该函数第一个参数指定了ADC的结构体,第二个指明了内存中存放ADC数据的位置,第三个则确定了存放数据的数组长度(若有多个通道,则此数组中数据顺序为ch1,ch2,ch3再ch1,ch2,ch3如此循环。
当你只采用1个ADC挂在一个DMA时一般不会出现什么问题。当你开了两个ADC的DMA时,程序可能会卡死,在一直进DMA的中断,具体原因未知,但和ADCCLK(即分频系数),AVER(即每个通道采样个数)和sample time(即每通道采样时间)有关。
经探究,让该函数执行的时间越长,越能顺利运行,即AVER越大,TCONV越大(每通道采样时间越长,ADCCLK越小即分频系数越大)
做ADC相关一定将上述参数调校合适
由于STM32F103的ADC采样频率最高只能达到1MHz,无法满足要求的200kHz采样频率。因此,无法使用ADC+DMA+TIM实现200kHz的扫频功能。