打印

数字电桥adc高速采集-stm32f030f4p6+dma

[复制链接]
3923|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
采用stm32cubemx生成
一、硬件配置
1、adc设置

2、dma设置

二、软件使用注意事项
1、while循环前加入,先采集一次,算做初始化,并触发adc转化完成callback。
 HAL_ADC_Start_DMA(&hadc,(uint32_t *)adc_buff,8);
2、while循环加入,由于dma是正常模式,dma工作一个循环即停止。程序框架
 if(adc_flag==1)
        {
                //HAL_ADC_Start(&hadc);
                HAL_ADC_Stop_DMA(&hadc);
                HAL_ADC_Start_DMA(&hadc,(uint32_t *)adc_buff,8);

                adc_flag=0;
        }
3、在adc转化完成中断中,触发更改adc_flag=1。标志位通知第2步开始工作。
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
        adc_flag=1;
        //HAL_ADC_Stop_DMA(&hadc);
}
4、这是一个DMA(正常模式)+ADC的使用方法。跟dma(循环模式稍不同)

使用特权

评论回复

相关帖子

沙发
632069383| | 2022-10-9 09:44 | 只看该作者
本帖最后由 632069383 于 2022-10-9 09:47 编辑

新的AD值是在第二步搬运到adc_buff的还是在第三步转换结束后搬运到adc_buff的?

使用特权

评论回复
板凳
叶春勇|  楼主 | 2022-10-10 18:20 | 只看该作者
632069383 发表于 2022-10-9 09:44
新的AD值是在第二步搬运到adc_buff的还是在第三步转换结束后搬运到adc_buff的? ...

adc_buff是DMA写的。
第一步是初始化。
第二步才进入loop循环。等待callback
stm32的程序框架,进入callback了。adc_buff已经更新。

使用特权

评论回复
地板
632069383| | 2022-10-11 20:48 | 只看该作者
楼主你图片配置的ADC的采样速度是1MHz了,也就是HAL_ADC_ConvCpltCallback这个中断回调函数1us执行一次了,这么高速的中断,楼主你实测stm32f030f4p6这个48M的CPU可以应付?我在HAL_ADC_ConvCpltCallbac里翻转一个IO来验证,当采样速率配置到两百多KHz的时候采样速度就上不去了。

使用特权

评论回复
5
叶春勇|  楼主 | 2022-10-12 01:16 | 只看该作者
632069383 发表于 2022-10-11 20:48
楼主你图片配置的ADC的采样速度是1MHz了,也就是HAL_ADC_ConvCpltCallback这个中断回调函数1us执行一次了, ...

这个callback是stm32的dma完成中断后执行的。不是adc的一次采样。adc_buff是一个数组

使用特权

评论回复
6
叶春勇|  楼主 | 2022-10-12 07:26 | 只看该作者
632069383 发表于 2022-10-11 20:48
楼主你图片配置的ADC的采样速度是1MHz了,也就是HAL_ADC_ConvCpltCallback这个中断回调函数1us执行一次了, ...

HAL_ADC_ConvCpltCallback是dma+ADC的程序框架的回调函数。在别的配置模式中也是这个函数名。
dma+ADC采集,ADC采集完,通知dma取走数据,adc继续采集,一直持续到
HAL_ADC_Start_DMA(&hadc,(uint32_t *)adc_buff,N);这个N就是采集量。
如果是1MSPS,采集1000个,gpio按照取反的的话,1khz/2=500hz左右。
ADC的采集时钟,记得要配置。
你的io翻转200多khz,算起来是执行了400多k次采集。好像dma没采集几个数据。或者dma没有配置成功。

使用特权

评论回复
7
632069383| | 2022-10-13 08:52 | 只看该作者
叶春勇 发表于 2022-10-12 01:16
这个callback是stm32的dma完成中断后执行的。不是adc的一次采样。adc_buff是一个数组 ...

你配置的EOC是单次转换结束就置位,AD每转换一次,就通知通知DMC取走一次,所以即使HAL_ADC_ConvCpltCallback是DMA+ADC的回调,那这个回调函数所在的中断的频率实际就等于ADC的转换频率吧

使用特权

评论回复
8
632069383| | 2022-10-13 08:53 | 只看该作者
叶春勇 发表于 2022-10-12 01:16
这个callback是stm32的dma完成中断后执行的。不是adc的一次采样。adc_buff是一个数组 ...

你配置的EOC是单次转换结束就置位,AD每转换一次,就通知通知DMC取走一次,所以即使HAL_ADC_ConvCpltCallback是DMA+ADC的回调,那这个回调函数所在的中断的频率实际就等于ADC的转换频率吧

使用特权

评论回复
9
632069383| | 2022-10-13 08:55 | 只看该作者
你的例子中这个8个元素的数组都是放同一个AD通道的数据?

使用特权

评论回复
10
叶春勇|  楼主 | 2022-10-13 10:22 | 只看该作者
632069383 发表于 2022-10-13 08:55
你的例子中这个8个元素的数组都是放同一个AD通道的数据?

我是用stm32cubeide写的。
如果你也是,自己去查源代码。
顺着这个callback ,鼠标右键“open declaration”网上查到一个dma完成的函数调用了这个callback。
然后去查原始的dma中断函数,最终调用xfer什么的一个函数。
然后再查HAL_ADC_Start_DMA是怎么把函数指针传递给dma的中断服务程序。
这个库是别人的,我们没有解释权,只有源代码说了算。

使用特权

评论回复
11
叶春勇|  楼主 | 2022-10-13 10:24 | 只看该作者
632069383 发表于 2022-10-13 08:55
你的例子中这个8个元素的数组都是放同一个AD通道的数据?

stm32s030只有一个adc。都是一个数据。我这个示例就一个。应该可以配置规则组,不过我没搞。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

151

主题

4810

帖子

50

粉丝