ADC采样时间如何设置才是正确的?

fb6042658559d2e12791d70535115073.png

在 DMA 传输 AD 导致数据错位时(启停 DMA 导致传输通道错位),上网搜了一篇关于 ADC 使用相关的文章《关于STM32 ADC自校准的个人理解》,感觉很不错,分享给各位学习一下。

强烈大家看一看文中提到的 pdf 资料,将对 ADC 使用有更好的理解(这里面有介绍采样时间和阻抗有关,不是随便设置的,以前鱼鹰都是随便设置的,根本没有考虑那么多,所以,理论知识还是非常重要的)。

------以下是正文------

今天尝试了下ADC的自校准,发现中文参考手册里对校准和上电的关系完全翻译错了。E文最新版里是这么说的:


ad2848b767182b33cd14524f9f41b14b.png
也就是开始校准的时候已经上电并且是在上电至少2个ADC时钟周期之后才开始校准。

关于校准码,根据说明,会在校准结束后存入ADC_DR寄存器。
根据我的测试,不开启校准时,ADC转换的结果是:接地转换值为0,接VCC转换值为4093.
开启校准再转换时:校准码为60,接地转换原始值为0,接VCC转换原始值为4095.

两个情况所得结果差别很小,不知60是做什么用的。

去ST搜了下文档,在一份概览介绍里找到这么一段话:
789e0b4e0e5b22c841953c3dd70d53c8.png
依据这段话,说明ADC的自校准是一个无需外界干预的过程,最后校准码并不需要使用者来处理。而且根据参考手册的说明,这个校准码是用来消除每个电容上产生的误差,这样就更不可能让用户依据这个值去消除了,所以个人认为这个校准码对使用者没什么用处,只要校准完毕就OK了,中间的所有STM32都已经做好了。如果理解有误,欢迎指正。

附件是找文档的过程中发现的一份ADC通讲,比较适合我这种初学者对ADC功能进行梳理总结用。

最后发句牢骚:GFW越来越操蛋了,国外技术论坛也TM封锁这么多。

-------------------------------------

前几天发过一篇帖子,叫:关于STM32 ADC自校准的个人理解(即上面的)文章大体说的是自校准前要先将ADON位置1,之后再校准。

本以为彻底的了解了自校准的过程,但是昨天晚上无意间看到了一个函数说明,不禁愁云又起。

157dcb6f9667b1decd85b387cb54557a.png
按照这个说明,使用这个自校准函数前应当使ADC处于掉电状态下,但是这样似乎就与英文的参考手册矛盾了。经过探查,方才知道ST的参考手册叙述文笔和结构编排是TM有多烂!

依据手册介绍,我将STM32的ADC分为三种状态:掉电状态、上电状态、工作状态。

当芯片启动运行时,ADC处于掉电状态。当第一次将ADON位设定为1时,ADC从掉电状态进入上电状态,也就是手册里说的“从掉电状态下唤醒”,这时ADON位已经为1。当我们再次设定ADON位等于1时,这时ADC会按照此时的ADC_CR1、ADC_CR2等寄存器的设置开始转换工作,也就进入了工作状态。这也就是下图红框中话的含义。


043fc14fac069fcbf511802ce8fb855c.png

接下来再分析HAL_ADCEx_Calibration_Start这个函数,通过一层一层查找,方知这个函数之所以要放在HAL_ADC_Start()之前或HAL_ADC_Stop()之后是因为这个函数本身就会执行将ADON置1这么一条语句。

也就是,执行自校准时ADC必须处于前面所说的上电状态,如果ADC在工作状态下——正在转换或者进行过转换——则要将ADON位清零,使ADC关闭进入掉电状态下,之后再将ADON置1,进入上电状态,之后再校准,再之后该注入组的注入该规则组的SCAN。也就是函数的使用说明和英文版的参考手册并不矛盾,而是TMD ST根本就没把这个说清楚!

接下来在顺便说一下为什么当ADON=1时再次设定置ADON位为1会进入工作状态(知道的就不必往下看了)

原因就是这句话:
8ebfaef60b71993f52aaf72524531ffb.png
看过正点原子教程的应该都有这个印象,在ADC转换实验中原子将ADC_CR2的EXTSEL位设定为111,将EXTTRIG位设定为1,之后通过SWSTART位置1的方式来启动转换。其实根本不用这么复杂,只需要将ADON再置1就可以启动转换,无论这个转换是单个通道还是还是通道组,效果与软件触发方式完全一样。

接下来再说说规则组的连续转换。
昨天晚上一直在尝试这个,想在中断中读取多个通道的值,一直不成功,只能得到最后一个被转换通道的值,现在才发现,又被ST的参考手册坑了!

关于连续转换模式,手册里是这么说的:
b7a39658cd9fd30ff43aec463a3e411c.png
一个规则通道被转换完毕后EOC会被置位同时进入中断。

但是,在ADC中断章节又是这么说的:
177579a6a7c4886efd98495319d15390.png
一个通道组转换完毕后才进入中断,而非单个通道。这也就是说,当规则组采用中断方式时ADC_DR里必定放置的是最后被转换的那个通道的值。那么是不是上面那个连续转换模式的说明写错了。又前后翻了手册n遍发现不是。
4045204de90f15c7bc81704939926a13.png
其实这里的单次转换模式和连续转换模式讲的都是针对1个通道的,而规则组多通道的转换在手册里其实是叫扫描模式(还有另外一个间断模式),然后扫描模式里再按照CONT位的不同分为单次转换模式和连续转换模式。也就是,文档里的目录层次结构如果是这样会更利于阅读和理解。
0360841df2c737c6739742791f68b02b.png
而不是像摊大饼一样全部放在同一级目录里。

现在我也才明白,为什么AN3116文档中那么强烈的建议规则通道组连续转换要使用DMA方式,因为用中断就是白瞎啊!!!!


另外,中文参考手册里关于扫描模式使用DMA的传输时间写错了。


2963595c4ea4852d3930e3e7e2833a2f.png
正确的应该是:
14c90b2ef9d12d5493791032777470fb.png
只要ADC_DR更新就会进行传递。而ADC_DR会在每个通道转换完后就更新。同时,这里也明确指出,使用扫描模式必须使用DMA。

有句话叫:一流的翻译能把二流的文章翻译成一流的作品,二流的翻译能把一流的作品翻译成二流的文章,二流的文章如果碰到二流的翻译,只能成为三流的shit。在我看来ST属于最后这一种,尤其是 be set翻译成被设置,简直是梗到家了。

之前看着数据手册自学AVR时顺风顺水,错误和编排不当非常少,虽说STM32相比之下更复杂、产品线更长、页数更多但是参考手册里这么多明显的叙述错误和槽糕的层次结构就我这个门外汉也能看出来啊,这么多错误和含混不清简直就是残害生命、初学者的噩梦啊,撞墙的心都有了。那STM8和STVD更是一块烂豆腐,第一次见ERRATA能写那么长的。现在看ST的参考手册无论中英文都有一种哈利波特找魂器的感觉,要上下来回翻阅n次,然后将关联点组织在一起,之后再去进行逻辑分析判断正误,太累心了!!!ST为中国市场砸这么多钱就不能好好写写自己的文档吗,重新编排一下能费几个钱。中文版的文档5年都没改过了,翻译都死光了吗。各位前辈都是怎么过来的?难道因为一直在用函数库没关注过底层这些?

29924b13f9bc11050d7bf75cba5f98bd.png

1.STM32U5,意法半导体新打造的超低功耗MCU旗舰版

2.【例说Arm-2D界面设计】从不规则图标的显示说起

3.STM8CubeMX和STM32CubeMX功能一样吗?

4.这九种情况下的单片机项目尽量不要接~

5.偷偷把室友的STM32换成了GD32后。。。

6.剖开苹果A15芯片,看看die的布局!

52e75e71c863a26ccfb7bdfa928beb3d.gif

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值