打印

为什么STM32Fxx的AD输入阻抗这么低

[复制链接]
23979|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lucky_000|  楼主 | 2008-4-26 15:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  目前在做一个产品,其中用到内置AD测锂电池电压(不可充),电池电压为3.2V,电压信号经过两个5.1M的电阻分压后输入到AD口。发现用万用表测出来的电压与AD所测得电压总是存在一个0.09V的差值。后又将电池断开,接入地模拟电池(0V),发现居然还有1.5V左右的电压。接着我将两个电阻换成10K,AD采样出来的值与实际值完全吻合了(电压表精度不够,前两位对上应该算OK了吧).
  造成这种现象,一般来说跟AD的输入阻抗有关。于是查了一下datasheet,发现该芯片的AD最大输入阻抗居然只有350K,晕,居然这么低,难怪会碰到这个问题。既然知道原因,解决的方法也是有的,自己加运放做电压跟随器。但是我有一个疑问,为什么这个ADC的输入阻抗这么低。我查了一下以前用过的Atmega8,他的AD输入阻抗资料上写着最低都有55M啊.提出这个问题的目的是希望大家今后在设计的时候重视这个问题。假如直连AD的话,光这个电路上消耗的电流就是 3.2/350 = 9.14uA, 要知道我们芯片在进入最低功耗模式时才消耗了3.9uA(还包括一块非常省电的静态RAM,所以比资料上的最低功耗要大). 最后附上datasheet上关于ADC输入阻抗的说明:


沙发
kingpoo| | 2008-4-26 15:37 | 只看该作者

接入地还有1.5V电压怎么解释?

接入地还有1.5V电压怎么解释?

使用特权

评论回复
板凳
lucky_000|  楼主 | 2008-4-26 16:04 | 只看该作者

电池电压检测部分

芯片脚上反馈的吧。电阻换成两个10K,电压值基本为零了.

使用特权

评论回复
地板
McuPlayer| | 2008-4-26 18:04 | 只看该作者

是的,STM32有这个问题

自己加个采保器,或者加个跟随器做阻抗匹配。

AD采保相当于一个电容,工作时候,需要尽快跟上外部电压,于是有个充放电的问题,这个充放电其实就是采样过程。采样完成后断开外部连接,保持器,给ADC转换提供稳定的电压。

使用特权

评论回复
5
lucky_000|  楼主 | 2008-4-26 23:51 | 只看该作者

唉,棘手的问题啊

不知道为什么把AD输入设计成这么低的阻抗?为了高速度,还是高精度?要外置电路提高输入阻抗感觉挺麻烦的,假如接了十六路信号,岂不是要接很多个电压跟随电路?用过这块芯片AD功能的各位同仁们,不知道有没有更好的解决方**

使用特权

评论回复
6
walnutcy| | 2008-4-27 00:05 | 只看该作者

好贴,学习了,

使用特权

评论回复
7
sujianli| | 2008-4-27 00:31 | 只看该作者

据我经验,用A/D还是带个跟随器可靠些

用过ADuC812/841,DSP LF2407/2812,还有AVR的、LPC93X等芯片,都发现加个跟随器更稳定可靠。特别是用于工业现场的设备。

使用特权

评论回复
8
MicroMMU| | 2008-4-27 11:47 | 只看该作者

LS没错,但在要求电池低功耗时就不适合了

使用特权

评论回复
9
aihe| | 2008-4-27 12:32 | 只看该作者

延长电容充电时间,试试

使用特权

评论回复
10
ddb_21ic| | 2008-4-27 16:32 | 只看该作者

输入阻抗大了,ADC速度就该降下去了

矛盾的

使用特权

评论回复
11
McuPlayer| | 2008-4-27 16:46 | 只看该作者

楼主的case完全可以用低速采样

这样阻抗就不是问题了。

使用特权

评论回复
12
ijk| | 2008-4-28 11:31 | 只看该作者

为什么把AD输入设计成这么低的阻抗?

  刚一看这样的质问,还差点被难倒了-根据以前使用MAXIM的AD的印象里,AD的输入阻抗并不是特别高,大概在 k ohm的数量级。于是专门又去MAXIM的网站,下载了一些AD的手册,包括MAX1393、MAX1276和MAX1226,都是12位的AD。结果它们的输入阻抗,都是几百欧到几千欧。
  所以,我的看法是,STM32的AD输入阻抗可以达到350k ohm,已经相当不错了!
  至于怎么解决问题,我觉得可以把C638的电容值加大,比如用1微法,或许能解决问题。

使用特权

评论回复
13
lucky_000|  楼主 | 2008-4-28 12:57 | 只看该作者

问题基本解决了

  谢谢大家的支持,我现在已经将fAdc的频率降低到了4.1M(主频为11.0592M*3),电池断开时测出的电压为2.0V(乘2后的值), 接入电池后为3.2V左右.后将两个5.3M的电阻改为1M,断开时已经能到0.6V了。我只要能判断出电池电压低就行了,这个测量范围已经基本能满足要求了。
  回楼上ijk ,我这样质问也是为了引起大家的注意,也没有刻意挑毛病的意思,毕竟我已经采用了这个芯片。提出问题,经大家讨论,然后得到解决方法,我觉得对大家都有好处。等等有时间再试试换电容吧。
  ps我觉得芯片资料关于Rain的计算公式可能有误。分子上的ts,我觉得应该是Ts.理由:用ts进行计算,无论如何也得不出下面表中的值,用Ts算,至少从数值上来说是相符了(小数点我不知道怎么排,我算出来差了1000倍).有兴趣的朋友可以算算。

使用特权

评论回复
14
lucky_000|  楼主 | 2008-4-28 14:05 | 只看该作者

呵呵,刚刚查了一下原来其它AD也差不多

以前也用过不少AD,如TL2543,Atmega的内部AD, AD73360,从来都比较顺利的.不过以前也不用考虑低耗,另外基本上前级都有运放的,呵呵,吃一堑,长一智。查了一下datasheet,关于输入阻抗,TL2543只有1K,Atmega的不知道为什么可以做到55M(难道偶看错了),AD73360有25K(也跟频率有关).

使用特权

评论回复
15
ijk| | 2008-4-28 14:58 | 只看该作者

再谈STM32的AD输入阻抗

  同意楼上说的:“ps我觉得芯片资料关于Rain的计算公式可能有误。分子上的ts,我觉得应该是Ts.理由:用ts进行计算,无论如何也得不出下面表中的值,用Ts算,至少从数值上来说是相符了(小数点我不知道怎么排,我算出来差了1000倍).有兴趣的朋友可以算算。”  但,我不同意差的倍数是1000倍,而应该差更多。
  其实从量纲的角度来看,STM32的datasheet关于AD输入阻抗格式也是有问题的,因为:R x C x f 所得的结果,刚好是无量纲的数-即跟Ts对应。

  另1方面,我想350k ohm的 RAIN max,其实并不对应于STM32的AD输入阻抗为350k ohm!根据datasheet,它代表:外部被测电路的输出阻抗为350k ohm时,所引起的STM32的AD额外误差小于1/4 LSB。

  假如真是这样,那么楼上将两个5.3M的电阻改为1M,并且把fAdc的频率降低到了4.1M后,所引起的STM32的AD额外误差应该小于1 LSB,但根据楼上描述,问题并非如此!

  所以,我估计楼上的问题来自其它地方,我猜或许是框图30(Figure 30. Typical connection diagram using the ADC)中的电流源造成的。

  ps我觉得框图30有问题:12-bit A/D conversion的框,应该在采样保持电容CADC之后,而不是之前。

使用特权

评论回复
16
ijk| | 2008-4-28 15:07 | 只看该作者

关于AD的电流消耗

  另外,关于AD的电流消耗,我也不同意:“这个电路上消耗的电流就是 3.2/350 = 9.14uA”
  因为,如果不启动AD进行转换,那么AD就不应该从被测电路上吸收电流-指在不考虑框图30(Figure 30. Typical connection diagram using the ADC)中的电流源的前提下。

使用特权

评论回复
17
lucky_000|  楼主 | 2008-4-28 17:19 | 只看该作者

呵呵,楼上对这个ADC很有研究

谢谢ijk 的热心指导,这两年主要在做应用层的开发。现在突然又让我我搞一下底层驱动,觉得挺晕的,其它模块倒是没多大问题,就是这个AD碰到的问题最多,看资料都觉得头晕,什么注入模式啊,规则组啊,以前听都没听到过。ST公司似乎把AD搞的太复杂了,这么多功能真的用的到吗?看起来似乎比专业AD都复杂了。 另外我是用DMA采集两路信号,并把DMA方式设为NORMAL的。每次DMA采集完成后重新初始化ADC和DMA.就这样连续采,我发现偶尔会出现通道数据填错的现象.但愿是我程序问题,附上我以前做过的实验数据。
  定义了五个变量
  uint16 wTestMaxLi = 0x0000,wTestMaxNH = 0x0000;
  uint16 wTestMinLi = 0xFFFF,wTestMinNH = 0xFFFF; 
  uint32 dwADDMACnt = 0;                        //记录DMA AD转换次数
图1:
https://bbs.21ic.com/upfiles/img/20076/200761317411202.jpg
正常情况下 wTestMaxLi和wTestMin的值应该1800多,而wTestMaxLi 和wTestMinNH的值应该在1300多,图1的的第一张图中可见,ADC经过194W次的DMA采样后,还是正常.但是在198W处时出现了问题, 说明在这之间曾经出现过两者数据交换的现象。因为我的AD值可以预期,后来的实验,我加了比较语句为了加断点,可以跟踪异常。
        if(g_BatteryADValues.wLiValue < 1400)
        {
            
            wTestMinLi = wTestMinLi;
        }
        if(g_BatteryADValues.wNHValue > 1800)
        {
            wTestMaxNH = wTestMaxNH;
        }
其中 g_BatteryADValues.wLiValue 和g_BatteryADValues.wNHValue放的是当前值.就在两个if中语句中加入了断点,只要停下来就说明有异常产生,得出如下的数据
https://bbs.21ic.com/upfiles/img/20076/2007613172333145.jpg

原因还在查找中,这些数据是一个多月前测的,因为测电池电压功能不是项目重点及难点,故留到最后解决。现在应该是到了最后吧,争取这两天解决.呵呵, 其实将就着用用也是可以的,加几个点滤波应该能滤掉的。

使用特权

评论回复
18
lucky_000|  楼主 | 2008-4-28 18:12 | 只看该作者

数据结构为

居然只能贴一张图
//该值必须大于6
#define BatteryADValueFlitNum    10
typedef struct
{
    uint16 wValues[BatteryADValueFlitNum];
    uint16 wLiValue;            //Li电池AD值
    uint16 wNHValue;            //NH电池AD值
    uint8 BatLi[2];             //Li电池电压值
    uint8 BatNH[2];             //NH电池电压值
    BOOL IsReady;           
}CM_BatteryADValues;
CM_BatteryADValues  g_BatteryADValues;

正常时的DMA缓冲数组中的值

使用特权

评论回复
19
xwj| | 2008-4-29 08:33 | 只看该作者

呵呵,要说ADC,还是TI的做的好

电容式转换,精度高,特别省电

使用特权

评论回复
20
lucky_000|  楼主 | 2008-4-29 12:35 | 只看该作者

找到了AD输入口存在电压的问题

今天重新整了一下程序,改变了思路,结果不但解决了数据出现错位的问题.无意中居然把前面的问题也解决了,原先怀疑输入阻抗引起的结论是错误的。真正的罪魁祸首是下面这句话:
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
使用连续转换模式,在采用电阻分压取信号并且该分压电阻很大的情况下,容易出现信号被引脚电压淹没的现象。至于该电压为何在连续转换模式下产生,现在我没进一步研究。因为后来我的思路是不用连续转换,结果什么问题都解决了,呵呵。
   上午我将Fadc改成16M, 并且Ts设成最小(1.5Cycles),当电池拿掉后,量AD输入口的电压,约为0.04V,已经比较接近零了。接上电池(标准3.0V,满的时候实际为3.2V)后,分压点的电压变成1.52V,读到CPU内部经运算后的电压为1.6V,这个数据实际上已经很好的,因为此时的输入阻抗应该在1.2K以下了.看来应该重新理解一下AD的输入阻抗了。

使用特权

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

本版积分规则

5

主题

26

帖子

1

粉丝