很多人都提到了STM32F407的ADC似乎精度不够。
原子的探索者开发教程里ADC一节最后也用红字提出了STM32F407的ADC精度不怎么好。
实际上STM32F407的ADC精准度真的不够吗?如果其精准度不够,那么其系统误差怎么测试计算?
实际上经过我一系列测试后发现:STM32F407的ADC足够精准,通过设置合理的参数之后,其ADC误差完全可以控制在±0.1%之内
下面先说一下我的测试原理和方法:
电路大概如下图:
上图有一个错误:右上面2K和1K分压之后接入的是STM32F407的Vref引脚,不是ADC
上面采样分压电阻选得比较大,是出于16选1芯片输出负载能力比较低,并且对测试电路有一定影响的考虑。
另外Vref采样分压电阻选的跟AD采样分压电阻不一致,本来想使用一致的值,后来发现STM32F407的Vref的输入阻抗相当低,
使用220K 和100K分压的话,Vref电压远比分压值低,这说明Rref || 100K远小于100K。手头上没有2.2K的电阻,只好用2K的
这也就使得本次测试AD没能达到“满量程”,当然,在经过分压之前,做了个电压跟随。
测试的方法:在STM32F407的main函数while中2分钟内不停的读取16选1的各个通道的AD值,统计其最高值和最低值。
通过设置不同的ADCCLK和采样保持周期,来分析比较,从而选出相对于电路一定的最合理参数。
程序如下
最后是采集的结果:
呃,图片被压缩了,将就着看吧。
通过对上述结果做如下分析: 多次采集的最高值和最低值的差足够小的话,那么就能保证STM32F407的ADC足够稳定精准,比如采样保持设置为480个周期时,
多次采集的最高值和最低值的差都不大于3,相对于千分之一(±0.1%)的数值(大约是8),其精度约为0.0366%,远高于千分之一精度。
同时,还有一个现象:0通道的值在采样周期比较短(如3个周期)时,其最大和最小值都远高于0,从而得出如下结论:
1、STM32F407的AD引脚和地之间存在一定的分布电容,该分布电容使得使用220K 和100K分压时,不能将AD引脚的电压“及时地”拉低(因为上一个16选1选择的是16,通道电压最高)
2、STM32F407的AD引脚输入电流有一定要求,或者说AD引脚外部的dv/dt能力要足够高,电流太低将影响AD采集精度或时间。
针对上面第2个结论,我曾经考虑过在STM32F407的AD引脚输入之前添加一个电压跟随,结果电压跟随的dv/dt能力也不够(LM258),后来换成高速运放AD8024,结果使用AD8024后,
整个AD采集结果很差,Max-Min在所有的参数上都高于50,结果方案流产(估计买到假运放或者有哪个地方搞错了,比如运放的使用环境或者理论上出了问题)
最后选择一个合理的参数:通过对整个测量结果的比较,选出一个不影响精度的速度最快设置(也可以处于精度考虑,保留一定预留)
如上述采集结果中ADCCLK=14MHz(6分频),采集保持设置为112个周期时,采集时间最短,并且精度较精准,并且0通道的数值合理(0到2之间).如上面的图中绿色标出部分
那么是不是大家直接使用该参数就一定适合自己的电路呢?肯定不是
因为大家的电路中外部要采集的数据的dv/dt能力与我的测试电路不一样,肯定会有不一样的“最合理”参数,建议大家跟我一样,做整个范围的测试,从中选出最合理的参数来。
至于原子哥提到的将AD引脚接地,读出的AD值也有几十,我估计电路板布线有一定影响。
我的布线是双层版,模拟输入周围接地,模拟线背面使用覆铜层接地,使得模拟输入线周围全部被“地”包围,最大限度减小干扰。
回复【10楼】 redgrouper :
(3)ST的数据手册(不是参考手册)上有Pin电流特性表,截图吧
圈出的是最大电流能力,这个最大电流能力以及下面所有IO电流能力总和,大概能让你估算出一个大致的电流范围。如果你的ADC电流输入是pA级别或者10nA以下,可定是不行的。建议1-10mA
作者: mack13013 时间: 2015-5-2 10:03
原子,能否申精?
作者: 正点原子 时间: 2015-5-2 10:21
谢谢分享,cool。
作者: STM32VBT6 时间: 2015-5-2 12:43
谢谢分享~~~~
cool,学习了!
作者: shell+ 时间: 2015-5-9 15:00
cool!!!!
作者: mthgh0818 时间: 2015-5-20 08:44
mark一下
作者: maxer555 时间: 2015-6-15 09:51
楼主老兄,你有机会试试多通道+DMA测试,这个跳动似乎更大
作者: mack13013 时间: 2015-6-15 18:54
回复【7楼】maxer555:
---------------------------------
如果跳动大,试试在信号输入前加高精密运放做电压保持吧。尽量使得要测量的电压点的电流输出能力变大,最好能到5mA,估计会稳定些。
我的采集方案没办法用DMA(48通道,太多,前面还有个通道选择芯片)。
作者: 龙之谷 时间: 2015-6-16 08:57
mark--精准ADC测量,谢谢分享~~~
作者: redgrouper 时间: 2015-6-17 13:26
楼主兄,请教几个问题,
(1)你ADC的数据是怎么从MCU拿出来的?用串口送出来吗?
(2)你在帖子里说“在经过分压之前,做了个电压跟随”。为什么在分压前而不是分压后用电压跟随呢?
(3) STM32F407 ADC输入信号驱动能力的要求有没有在什么文档里讲过?
多谢先!
作者: mack13013 时间: 2015-6-17 14:19
---------------------------------
(1)格式化数据之后串口打印或者SD卡存储。我是用串口打印的。
(2)运放是+-12V电源,在分压之前做电压跟随,这样电压跨度可以比较大,运放引起的误差再经过分压之后就比较小了。
假如分压前电压跟随的运放和分压后电压跟随的运放,引起的误差都是0.1V,你选择分压前还是分压后呢?
作者: XXDJ 时间: 2015-7-8 10:54
楼主的方法相当于将F4的ADC速度降到了F1系列的ADC。网上大家也反映F1的ADC性能不错。
这是否说明了F4的ADC实际上可能还是F1系列的ADC模块,所以速度硬提上去后,ADC的性能就变差了。
如果真是这样,ST在这一点上有点不厚道了。
或者是我们外围电路设计或PCB布局不对,网上不是有人用F4做了示波器吗?
个人意见。
作者: mack13013 时间: 2015-7-10 16:30
回复【12楼】XXDJ:
---------------------------------
其实,我提供的方法是一个找寻你的产品ADC输出稳定的ADC参数设置的方法。
使用该方法测试出你的ADC参数,使用该参数进行ADC,能够保证对任意同一模拟量任意2次的ADC数值输出的差小于一定值。
是不是真的能保证ADC精度高于千分之一? 呵呵,抱歉,这个不能保证。
作者: xieyi 时间: 2015-7-10 17:13
收藏,以后可能用得到。
作者: XXDJ 时间: 2015-7-14 09:47
回复【13楼】mack13013:
---------------------------------
嗯,这是寻找ADC最佳性能的一种实践方法。
只是对F4的ADC性能有点失望。因为如果ST只是把F1的ADC模块放到了F4内,然后硬将速度提上去,然后宣传ADC性能有多好,但在大家实际应用中却发现,要想达到稳定性,准确性,对不起,请把速度降下来就可以了,就让人有点难受,好好的一颗F4被拖后腿了,当然对于不需要使用模拟部分的应用来说,F4应该还是很好的。
不知道ST自己出的官方评估板的ADC稳定性如何?有该板的朋友可以做做这个采集稳定性试验。
还有ST官方出的如何提高F4的ADC性能“AN4073”,其判断标准是+/-5LSB,不知是业界通用的还是ST自己为F4设置的。
作者: 魔方奇才 时间: 2015-7-18 21:06
markcool
作者: 盒子 时间: 2015-11-3 14:06
markcool
作者: 战斗机 时间: 2015-11-3 21:46
强人,期待更多这样的文章
作者: it_do_just 时间: 2015-11-3 22:57
mark,谢谢分享
作者: cqr01 时间: 2015-11-16 14:47
分析不错,mark!
作者: xBrain 时间: 2016-1-8 16:22
好好好 正想自己测试下,嫌麻烦一直没做
作者: 且听枫 时间: 2016-5-4 10:01
感谢分享!
作者: sunnyway_2008 时间: 2016-5-15 21:49
感觉f4的ADC还不是太好,比如I0频响不够,且信号频率超过2MHz效果很差!不知大家有没有感受!
作者: lufeifeionly 时间: 2016-9-9 17:28
提示: 作者被禁止或删除 内容自动屏蔽
作者: JIMK 时间: 2016-11-14 17:34
mark,cool!
作者: myopene 时间: 2017-1-29 00:25
收藏,感谢楼主
作者: qvictory 时间: 2017-2-22 15:05
多谢分享,先收藏了
作者: xyflk 时间: 2017-2-22 22:44
mack13013 发表于 2015-6-17 14:19
回复【10楼】 redgrouper :
---------------------------------
(1)格式化数据之后串口打印或者SD卡 ...
应该在分压后跟随 这样可以提高输入阻抗。
作者: xu_zhh 时间: 2017-3-15 11:53
本帖最后由 xu_zhh 于 2017-3-15 11:55 编辑
测量精度应该没问题,我这里用的是1:1分压的电阻,图中的测量值是引入分压电阻后误差的总和。基准电压误差是1-2个mv,再乘以2,大约是在2-4个mv,附图中最大误差9-4,大约是5个mv,一般测量精度需求应该基本满足了。主要注意一下硬件设计,加上软件滤波,应该问题都不大。
作者: 隨颩洏過 时间: 2017-5-11 16:55
本帖最后由 隨颩洏過 于 2017-5-11 16:57 编辑
问一下大家,F407ADC在保证精度不太差的情况下采样速度能到多大?http://blog.csdn.net/yushuihualaopo/article/details/6968737
另外这篇文章讲到的多个ADC一起使用提高ADC采样精度你用过吗?知道什么意思么?
作者: mack13013 时间: 2017-5-12 13:51
本帖最后由 mack13013 于 2017-5-12 13:54 编辑
隨颩洏過 发表于 2017-5-11 16:55
问一下大家,F407ADC在保证精度不太差的情况下采样速度能到多大?http://blog.csdn.net/yushuihualaopo/artic ...
多个ADC一起使用提高ADC采样精度???
他没这么说的吧?他说的是多个ADC一起使用提高ADC采样速度。
稳定的采样速度这个我最高能做到100Ksps,也就是单个ADC的话仅30Ksps左右,还得赶运气(同样的一批板子只有一部分能达到这个速度)。估计使用4层板效果会好些
作者: 隨颩洏過 时间: 2017-5-12 14:41
mack13013 发表于 2017-5-12 13:51
多个ADC一起使用提高ADC采样精度???
他没这么说的吧?他说的是多个ADC一起使用提高ADC采样速度。
100K?间隔10us采样一次?这么慢?
我现在需要采集200KHz的0~3V的类似正弦信号的包络信号的幅值,请问你有什么好的方法么?
作者: mack13013 时间: 2017-5-12 23:52
隨颩洏過 发表于 2017-5-12 14:41
100K?间隔10us采样一次?这么慢?
我现在需要采集200KHz的0~3V的类似正弦信号的包络信号的幅值,请问你有什 ...
STM32F4的ADC都比的,基本上在稳定的前提下,跟STM32F1的速度差不多了,外围布线已经像照顾祖宗一样了,还是没办法在官方数据提供的最高速度下保持稳定,而且这货输入阻抗还贼JB小,不跟随的话,采集信号输出阻抗稍高,ADC就影响采集信号。
建议换其他的不那么坑的MCU或者使用外部ADC芯片,当然,如果你采集的信号能做硬件DSP的话,先硬件处理一下,虽然调试难一些,但是可靠性要高许多。
作者: 口蚂 时间: 2017-6-20 19:32
mark一下,留图留种,好文章。
作者: gaozhao211 时间: 2017-6-21 14:59
果然是精华
作者: 还是看不穿 时间: 2017-6-23 10:32
mark
作者: 还是看不穿 时间: 2017-6-23 10:32
mark
作者: 还是看不穿 时间: 2017-6-23 10:32
mark
作者: 网络孤客 时间: 2017-6-24 17:19
cool,谢谢。
作者: ipgsky 时间: 2017-7-3 09:18
作者: mack13013 时间: 2017-7-3 16:09
ipgsky 发表于 2017-7-3 09:18
stm32f407采集端接地的采集值,这个应该属于比较精准的吧。
这个应该是不错了,只有LSB变动
你试试采集完满Vref,然后迅速采集0V,看下外围电路的动态响应是不是能跟的上。
作者: Widow 时间: 2018-4-20 09:11
cool,mark
作者: ptx0315 时间: 2018-9-26 11:00
[img=240,240]C:\Users\Administrator\Desktop\tu[/img
芯片stm32f407,2路采集接地,偶尔还是有比较大的跳变。
作者: edmund1234 时间: 2018-9-26 14:00
一般码农都有这特质, 硬件I2C调不好就说I2C硬件有关bug, ADC不会用就说ADC不准, 难道你让他跟老板说是因为他不懂么
作者: 好好学习呀 时间: 2018-9-26 16:18
昨天在QQ群看到他们的宣传如下,有知道的吗,给个意见
张飞马达驱动众筹已经突破40W销量,已有1000多个工程师参与了众筹学习,4天后活动将正式结束!众筹活动结束之后立即恢复原价。
众筹参与地址☛:http://z.elecfans.com/220.html(最后4天)
众筹回报实物:马达驱动开发板(保护马达驱动开发板一块,烧录仿真器一块,48W开关电源一台)视频教程:直流无刷电机原理图设计:10小时直流无刷电机Pcb设计:10小时方波有位置直流无刷电机软件设计及调试:10小时方波无位置直流无刷电机软件设计及调试:15小时
原理图:从无到有边画边讲,不放过每一个细节Layout:从无到有手把手教,每一根线都会讲出它的道理程序代码:从无到有一行一行敲出,边敲边讲解,每一行代码都会有中文注释
从原理图 - PCB Layout - 程序 让你360°无死角学习

作者: JOHNJOHN 时间: 2019-2-12 13:41
非常感谢
作者: epsilon 时间: 2020-3-27 00:43
最近搞一个板子直接串电阻检测电流,输出只有20mv,之前F1停稳的,同样的电路用407直接接地就20几个的跳动……,我已经把时钟,采用时间,电容,走地,屏蔽各种都加一圈,线性供电就是有跳动,而且吧这个跳动如果把Flash prefetch打开会更频繁,但是数值倒是没超过30的时候,就是20几个再跳……当然解决方法很多了,加放大,把有用信号幅度提上来就行,这里只讨论407这方面是不是真的差一些呢
作者: epsilon 时间: 2020-3-27 00:48
我直接接地也会有20几个,关掉Flash prefetch会少一些但还是会跳,同样的板子F1就好好的只有1个2个
作者: xyang18 时间: 2020-8-6 11:00
epsilon 发表于 2020-3-27 00:43
最近搞一个板子直接串电阻检测电流,输出只有20mv,之前F1停稳的,同样的电路用407直接接地就20几个的跳动 ...
我用的是F413,跳动量能在50,就算把采集管脚直接接地,也会跳到50
作者: cxs0913 时间: 2021-1-5 21:48
先mark下
作者: cxs0913 时间: 2021-1-5 21:52


作者: jiqirenkaifa 时间: 2021-4-18 20:52
赞一下
作者: pdbq 时间: 2021-7-20 19:04
666厉害呀
作者: gling 时间: 2022-5-24 09:29
先mark下
欢迎光临 OpenEdv-开源电子网 (http://47.111.11.73/)
Powered by Discuz! X3.4