ADC+DMA+TIM采样200k

如何使用stm32f103实现扫频,上限截至频率须达到150kHZ

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 文章:stm32f0x基于HAL库的ADC-DMA采样配置过程 中也许有你想要的答案,请看下吧
  • 除此之外, 这篇博客: stm32f303定时器触发ADC采样并通过DMA传输中的 1.TIM+ADC+DMA 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    我们用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相关一定将上述参数调校合适

  • 您还可以看一下 肖航老师的STM32CubeMX开发基础与实战课程中的 ADC在DMA模式下扫描多个通道小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    由于STM32F103的ADC采样频率最高只能达到1MHz,无法满足要求的200kHz采样频率。因此,无法使用ADC+DMA+TIM实现200kHz的扫频功能。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^