OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3846|回复: 13

6通道AD采样值波动很大

[复制链接]

5

主题

17

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-11-10
在线时间
15 小时
发表于 2018-11-28 20:38:32 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 HuangJianguo 于 2018-11-28 20:49 编辑

STM32F407开发板6通道高速采样,每路达到50K/S,使用DMA传输模式并通过W5500传输到上位机,整个程序非常稳定,网络传输可以跟到采样速度,采样点并未丢失,但发现AD采样值波动达到50mV?

接线方式:我直接将被测电压2.5V接到PA0的AD输入口
供电部分:使用线性电源引出来的5V给开发板供电,并且我用示波器专门测试过5V输出电源的波动在2mV以内,基本控制在1.5mV。同时我也用示波器专门测试过接到PA0的AD的那个2.5mv的波动也是在2mV以内,但就是用AD检测出来的值却有50mV的波动,
说明问题没有出在2.5V电源本身上。

请问50mV的波动如何解决??能不能将波动控制在2mV以内??

AD采样波形

AD采样波形
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-11-28 21:56:38 | 显示全部楼层
我猜原因是
没用到半Buffer+Cycle Mode的DMA传送方法, 所以中断有数据错误
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-11-28 21:58:24 | 显示全部楼层
这时间是固定的, 如果这时间的间隔刚好是取样时间xbuffer的长度, 那我猜的就应该没错了
回复

使用道具 举报

5

主题

17

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-11-10
在线时间
15 小时
 楼主| 发表于 2018-11-28 22:49:14 来自手机 | 显示全部楼层
有道理
回复

使用道具 举报

5

主题

17

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-11-10
在线时间
15 小时
 楼主| 发表于 2018-11-28 22:49:53 来自手机 | 显示全部楼层
不太明白
回复

使用道具 举报

5

主题

17

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-11-10
在线时间
15 小时
 楼主| 发表于 2018-11-28 22:55:32 来自手机 | 显示全部楼层
半Buffer+Cycle Mode的DMA传送方法是什么,不是太明白
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8024
金钱
8024
注册时间
2014-8-13
在线时间
1595 小时
发表于 2018-11-29 01:55:32 | 显示全部楼层
本帖最后由 mack13013 于 2018-11-29 02:01 编辑

哈哈,LZ大概接触STM32比较晚,当年STM32F407开发板刚出来的时候,大家就发现STM32F407的ADC特别坑,非常不稳定,整个论坛都一片骂声,很多人怀疑407的ADC就是103的ADC直接搬过来超频用的,所以不稳定。
而且原子的开发指南上也提到了这个问题:

ll.jpg



目前有个妥协方案:分享:STM32F407的ADC真的不够精准吗?教你设置STM32F407的ADC参数使其精度高于千分之一
而且貌似这是针对407的ADC几乎唯一的解决办法。 后来大家都知道407的ADC特别的坑了,也就没那么高的讨论热度了,而且大家都去玩STM32F7什么的去了,然后后来搞407的人就不知道407有这么一个坑了。。。

注意,帖子的标题有误,实际标题说的意思是设置STM32F407的ADC的参数,使其稳定性高于千分之一。
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8024
金钱
8024
注册时间
2014-8-13
在线时间
1595 小时
发表于 2018-11-29 02:01:55 | 显示全部楼层
哈哈,LZ大概接触STM32比较晚,当年STM32F407开发板刚出来的时候,大家就发现STM32F407的ADC特别坑,非常不稳定,整个论坛都一片骂声,很多人怀疑407的ADC就是103的ADC直接搬过来超频用的,所以不稳定。
而且原子的开发指南上也提到了这个问题:





目前有个妥协方案:分享:STM32F407的ADC真的不够精准吗?教你设置STM32F407的ADC参数使其精度高于千分之一
而且貌似这是针对407的ADC几乎唯一的解决办法。 后来大家都知道407的ADC特别的坑了,也就没那么高的讨论热度了,而且大家都去玩STM32F7什么的去了,然后后来搞407的人就不知道407有这么一个坑了。。。

注意,帖子的标题有误,实际标题说的意思是设置STM32F407的ADC的参数,使其稳定性高于千分之一。
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8024
金钱
8024
注册时间
2014-8-13
在线时间
1595 小时
发表于 2018-11-29 02:02:33 | 显示全部楼层
哈哈,LZ大概接触STM32比较晚,当年STM32F407开发板刚出来的时候,大家就发现STM32F407的ADC特别坑,非常不稳定,整个论坛都一片骂声,很多人怀疑407的ADC就是103的ADC直接搬过来超频用的,所以不稳定。

而且原子的开发指南上也提到了这个问题:










目前有个妥协方案:分享:STM32F407的ADC真的不够精准吗?教你设置STM32F407的ADC参数使其精度高于千分之一
而且貌似这是针对407的ADC几乎唯一的解决办法。 后来大家都知道407的ADC特别的坑了,也就没那么高的讨论热度了,而且大家都去玩STM32F7什么的去了,然后后来搞407的人就不知道407有这么一个坑了。。。

注意,帖子的标题有误,实际标题说的意思是设置STM32F407的ADC的参数,使其稳定性高于千分之一。
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8024
金钱
8024
注册时间
2014-8-13
在线时间
1595 小时
发表于 2018-11-29 02:03:03 | 显示全部楼层
哇,没注意回复需要审核,一连提交了几遍回复。。。。
回复

使用道具 举报

5

主题

17

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-11-10
在线时间
15 小时
 楼主| 发表于 2018-11-29 07:21:47 | 显示全部楼层
edmund1234 发表于 2018-11-28 21:56
我猜原因是
没用到半Buffer+Cycle Mode的DMA传送方法, 所以中断有数据错误

DMA_InitTypeDef DMA_InitStructure;

    //等待DMA可以配置状态
    while(DMA_GetCmdStatus(DMA2_Stream0) != DISABLE);
   
    DMA_DeInit(DMA2_Stream0);
    DMA_Cmd(DMA2_Stream0, DISABLE);
    DMA_InitStructure.DMA_Channel = DMA_Channel_0; //DMA通道0
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(ADC1_BASE + 0x4C); //外设地址
    DMA_InitStructure.DMA_Memory0BaseAddr = (u32)(m_nADCValue); //存取器变量地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; //存储方向从外设到内存
    DMA_InitStructure.DMA_BufferSize = 6; //数据传输的数量
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //关闭外设存储(增量模式)
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //激活内存存储(增量模式)
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外设数据长度半个字(16位)
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //存储器数据长度半字(16位)
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //设置DMA存储模式为循环模式
    DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA优先级为高优先级
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; //禁用FIFO模式
    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; //FIFO阈值 当前无效
    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; //外设突发,单次传输
    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; //存储器突发,单次传输
    DMA_Init(DMA2_Stream0, &DMA_InitStructure); //初始化DMA2_Stream0,对应为ADC1
   
    DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TC); //清除中断标志
    DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE); //传输完成中断
    DMA_Cmd(DMA2_Stream0, ENABLE);//开启DMA传输

这个是DMA部分配置源码
回复

使用道具 举报

5

主题

17

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-11-10
在线时间
15 小时
 楼主| 发表于 2018-11-29 07:22:44 | 显示全部楼层
edmund1234 发表于 2018-11-28 21:56
我猜原因是
没用到半Buffer+Cycle Mode的DMA传送方法, 所以中断有数据错误

帮忙看看上面的DMA配置哪里有问题?谢谢!
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-11-29 08:50:23 | 显示全部楼层
DMA_ITConfig(DMA2_Stream0, DMA_IT_TC | DMA_IT_HT, ENABLE); //传输完成中断

然后在中断分别判断 (DM2->LISR & TCIF0 ) 及(DM2->LISR & HTIF0 )
当(DM2->LISR & TCIF0 )为ture时,读取m_nADCValue [3..5]
当(DM2->LISR & HTIF0 )为ture时,读取m_nADCValue [0..2]
回复

使用道具 举报

5

主题

17

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2018-11-10
在线时间
15 小时
 楼主| 发表于 2018-11-29 09:46:07 来自手机 | 显示全部楼层
edmund1234 发表于 2018-11-29 08:50
DMA_ITConfig(DMA2_Stream0, DMA_IT_TC | DMA_IT_HT, ENABLE); //传输完成中断

然后在中断分别判断 (DM2 ...

非常感谢,随便问一下上面DMA配置没有问题吧?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 22:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表