aviator 发表于 2008-6-30 18:21:29

AVR 的 AD 输入脚电压超过5.6V时 出现的问题?

用ATtiny26做的充电器,电池电压通过AD检测,未接电池时空载会出现比较高的电压,这样AD端口的电压就会比较高,比如到了8V。这时如果等AD转换完成则会死在那里,但是接上电池电压低于5.6V就马上正常。

AD端口输入电流也比较大,如果串一个470R的电阻就会有10几mV电压差,端口已经设置为了输入高阻状态。

AVR是这样吗?有办法解决吗?

hali 发表于 2008-6-30 21:17:09

并上电阻100K的试试,即未接电池不空载.

holycat 发表于 2008-6-30 21:37:53

想要谋杀单片鸡吗?!
输入要串电阻,然后并二极管嵌位。
片内或许有寄生二极管,但没给出指标的就不能作设计依据。

http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_332283.GIF

aviator 发表于 2008-7-1 11:16:40

1. 串电阻会产生压降,测量不准确。并联10K电阻也不行啊。

2. 稳压管会有漏电严重影响测量。端口内部有保护二极管所以芯片应不会坏,我测了这么久也没坏。

如果用运放做一个保护就太麻烦。

ediy007 发表于 2008-7-1 11:22:54

使用电阻分压吧.

diannaoza 发表于 2008-7-1 11:23:07

想要谋杀单片鸡吗?! 估计lz是这么想的

aviator 发表于 2008-7-1 11:47:44

我是给锂电池充电,电压为4.2V,希望单片机能尽量准确的测量到电压,如果接分压电阻则测量精度减小,并且由于分压电阻的误差测量也会偏差。

看很多书上采用并联5.1V稳压管的方式,但实际上稳压管的漏电流不小,在电阻上的压降比较大,不宜采用。

holycat 发表于 2008-7-1 11:52:03

to【3楼】aviator

“1.串电阻会产生压降,测量不准确。”
串电阻会降多少,算过没?串1kΩ才降1/10000。再算上最大1μA的输入漏电流的影响,也就是千分之一的绝对误差,胜过AVR的鸡准电源不知多少倍了。
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_332823.GIF

“2.端口内部有保护二极管所以芯片应不会坏,我测了这么久也没坏。”
恕俺直言,这不是设计者该说的话,设计者只信datasheet给出的数据,datasheet说了端口内部二极管有多大负载能力了吗?就算你有办法知道它能载多大电流,在没串电阻的情况下你能保证不过载吗?
从顶楼的信息“AD端口的电压就会比较高,比如到了8V”看,寄生二极管的嵌位功能已肯定不灵,没准已经损坏了!

aviator 发表于 2008-7-1 12:29:24

端口已经设置为输入,取消上拉电阻,外部串10K电阻就有10几mV的压降。

ywl0409 发表于 2008-7-1 12:40:02

不知道LZ对AD转换了解多少,但有一点必须注意的是:IO口上的电压不要超过VCC,不然的话,这个IO口是会损坏的,可能不是立即损坏,有可能是在工作的某一个时候损坏.所以,建议你不要把8.4V的电压接到IO上.

如果用电阻分压的话,你觉得精度会降低.但实际上,你应该先确定你自己的充电器要求的精度是多少,然后再来看看,电阻分压后的精度,是否能满足你的充电器的精度要求.如果这时候仍然不能满足的话,可以调整你的参考电压,或者换一个外部的,精度更高的ADC.

另外再个你提供一个办法,就是给输出电压分个压,接到另外的一个AD端口,并且判断该电压是否超过规定值,如果超过的话,就关断调整管.也可以接到模拟比较器,由它产生的中断来关断调整管也可以的.
如果你的调整管是用PWM来控制的话,这里就可以减小它的占空比,来降低它的输出电压.

holycat 发表于 2008-7-1 13:06:36

“外部串10K电阻就有10几mV的压降”
——这个正常,假定输入端有1μA的漏电流,那么在10kΩ上就是10mV。另外,输入漏电流并不等效于输入电阻,其中有常量的成分,校正后不会影响精度。
假如在输入端并一容量为20mA的嵌位二极管,串500Ω电阻的话,就足以抵御15V的输入电压而避免损伤MCU。再考虑设计的富余量和电阻功率的话,串1kΩ是比较合适的。

tsb0574 发表于 2008-7-1 14:04:39

无言……

aviator 发表于 2008-7-1 16:20:46

我也知道端口电压不能超过允许值,问题是要怎么的电路比较简单有效的可以防止电压超过允许值。


第一种方法:
AD输入端口内部有保护二极管,外部串电阻后可以防止电压高于5.6V,实际测量也是这样,外部电压10V时,AD端口电压保持在5.6V,此时出现了一个问题,等待AD转换完成就会陷入死循环。这样看来不能完全靠内部的保护二极管,否则如果程序中循环等待AD转换完成则会死循环。


第二种方法:
并联5.1V稳压二极管在AD输入端,但在电压不超过5.1V时稳压二极管也有漏电流,大概几uA,如果串1k电阻就几mV的压降了。

由于使用了差分AD,外部0.05R的电流取样电阻,连接到两个AD输入端的电压有微小的偏差则AD转换结果偏差就很大,所以对于连接到差分AD输入的电压就很敏感,


现在准备改为运放测量电流,AD输入只使用单端输入,串联电阻和并联5.1V稳压管来保护端口。
还有一个问题,ATtiny26的差分输入电压小于12mV就不行,不知道有什么办法能消除。

ywl0409 发表于 2008-7-1 18:22:44

如果你愿意把原理图放上来的话,讨论起来就方便了.

aviator 发表于 2008-7-1 19:14:04

增加了电路图


充电器电路图ourdev_333643.pdf(文件大小:135K) (原文件名:bc_sch.pdf)


电路图中的LM358是后来改的,之前的电路是0.05R电阻两端串电阻接在ADC0和ADC1,通过ADC0-ADC1差分放大20倍测量电流。
我希望电流检测最小可以到20mA,偏差20%都可以接受,100mA以上电流偏差最好能到5%。
充电输出为4.2V锂电池,电压精度尽可能做高。


这个电路里运放输出在没电池时有可能出现高电压,到ADC引脚只是串电阻,按照现在的经验由于管脚内部有保护二极管,所以引脚电压会保持在5.6V,(先不讨论会不会坏)这时候的问题是AD转换会死在这里:

while ((ADCSR & (1 << ADIF)) == 0);

一直到电压降低。如果用稳压二极管由于漏电流会影响电压测量。

ywl0409 发表于 2008-7-1 21:06:09

我想:很少人会把IO口的电压工作到它可以承受的范围以外来设计电路.你既然已经这样做了,也遇到了这样的问题,我觉得,应该先想办法把这里的电压降下来,这才是最根本的方法.

如果你的问题是AD转换死在这里,希望你也不要钻在这里跑不出来.因为ATMEL公司也不会有这样的测试结果,报告和解决方法的.

你的设计里面有两方面的问题:

1.在硬件设计里面,没有一个过电压保护电路.这在实际应用中是不可取的.

2.在软件设计里面,你要设一个最大的占空比,以防止输出电压过高.

对于锂电池充电,必须要限制充电电压不能超过4.35V,要不然,轻则损坏电池,重则爆炸!

提几个建议:

1.用运放或比较器来限制输出电压,将输出电压和一个基准电压比较,若高于基准电压,就减小PWM的占空比,一直减小到0.

2.把电流采样电阻放到下面.电池电压就是电池端的电压减去电流端的电压.

3.在软件里面,要有一段判断电流的程序,若电流小于一定的数值,就说明电池已充满,并且减小占空比.

4.把检流电阻适当取大些,或者接个放大器,这样可以提高电流的精度.这取决于你的充电电流的大小.

5.你可以用分压电阻来进行电压值的采样的.假如你用2.5V的Vref(最好把Vref减小些),那么,10BIT的ADC,精度有2.44mV.这样不知道你够不够用.

holycat 发表于 2008-7-1 22:46:31

看了一哈电路,光就A/D口输入太高一事而言,觉得问题好像不大,稍改进下就行。提几点供参考。
①.3个A/D输入其实都串了1kΩ,只是过于依赖AVR的片内嵌位,已超过它的负荷能力。解决的办法是把串联电阻加大,或3个通道各往5V加嵌位二极管。(俺强烈推荐后者,凡厂家不给出保证的功能都不可轻用。)
②.模拟放大部分都是些1%的电阻,再加上运放LM358的失调电压的影响,误差早就>>1%了,何必还去斤斤计较ADC输入差的几个mV?再说测电池充电也不会有mV级的精度要求吧?
③.题外话了,大电解用得太多,模拟地和数字地似乎也没分开的必要,都是慢速信号,需要的话程序里加几条语句滤下波也足够了。现在的模拟/数字地的分法是否比不分的好,很难说。

holycat 发表于 2008-7-1 22:47:57

http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_334123.GIF
(原文件名:二极管嵌位.GIF)

aviator 发表于 2008-7-2 01:21:18

谢谢各位!

15楼:
原本希望内部的保护二极管起作用保护端口,现在看来就算端口没损坏程序也不能正确运行。
由于程序死在那里所以没办法去控制PWM降低减小电压,一个办法是使用非阻塞的循环来等AD转换完成,或加上超时检测,如果等待超时则降低PWM使电压降低。不过这样不保险,谁知道会不会那天坏了。

现在决定不用内部差分AD了,前面电路已经改成了运放,增益20倍,测量范围5A。
之所以这样设计是希望尽量减少电池电压测量的误差,所以电池电压未分压直接接入AD,而且取样电阻放在上面避免影响电池电压测量。



16楼:
外部二极管保护也会受到二极管反向漏电的影响,要找低漏电电流的二极管,1n4148的漏电电流为5~50nA,应该可以。

aviator 发表于 2008-7-2 02:53:18

重新测试,端口外加4148保护不起作用,电压高时单片机仍然会死。

只要把AD输入端口串一个大一点的电阻就可以了,我现在改为了10K(之前是470R),这样外部电压10V时端口电压5.6V,单片机不会死,一切正常。其实只要单片机不会死就行,单片机就会调整电压降低,只有意外的情况电压才会过高。

所以之前的问题是端口串的电阻太小导致,现在改为10K,压降为0.23mV,可以忽略。端口内部由于有保护二极管应该能使电压不高于5.6V。测试一段时间看看,不是做产品所以不用担心。

holycat 发表于 2008-7-2 07:03:07

扫瑞,俺忘了多说一句,外加嵌位时应该用肖特基二极管,正向鸭酱较低。1N4148的最大正向压降VF=1V(10mA时),动作晚于内部嵌位,结果是等单片鸡死了之后它才起作用呢,因为AVR要求输入不得超过Vcc+0.5V。

aviator 发表于 2008-7-2 17:33:47

肖特基反向漏电比较大, 不知道用在AD输入会不会影响测量。

holycat 发表于 2008-7-2 19:14:05

肖特基也有反向漏电小的,比如RB715F,最大漏1μA,跟ADC输入一个级别,典型值自己有50nA。
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_335823.GIF

俺现在正琢磨用一个最大反漏只有100nA的肖特基阵列BAS70做输入的上下嵌位:
http://61.222.192.61/mccsemi/up_pdf/BAS70TW_DW-04_DW-05_DW-06_BRW(SOT-363).PDF

ywl0409 发表于 2008-7-2 20:00:54

楼上的反向漏电是比较小的,它的反向电流应该是在Vr=10V时为50nA,而5V时会更小的.

aviator 发表于 2008-7-3 02:10:35

这个二极管不知道好不好找。

T_Ryan 发表于 2008-7-8 15:33:42

楼主和各位大师如有PWM,ADC这方面的实例请发几个过来。小弟万分感激!ruanyt@yahoo.cn

avrgcc 发表于 2008-7-13 12:24:14

正在学习AD方面的东西

dust2 发表于 2009-10-19 00:29:13

mark【20楼】 holycat 仙猫

_HOLDON 发表于 2012-8-17 15:38:20

太精彩了!

kamfun 发表于 2014-10-29 11:16:10

一本书上看到的,建议这样试试看

kamfun 发表于 2014-10-29 11:17:14

我也是初学这样面的知识,希望大家多多指教哈~

frank117 发表于 2015-5-15 11:47:48

kamfun 发表于 2014-10-29 11:16
一本书上看到的,建议这样试试看

能请教一下,这个图片是那本书上截的图么?
我想仔细学学。
页: [1]
查看完整版本: AVR 的 AD 输入脚电压超过5.6V时 出现的问题?