用ATtiny26做的充电器,电池电压通过AD检测,未接电池时空载会出现比较高的电压,这样AD端口的电压就会比较高,比如到了8V。这时如果等AD转换完成则会死在那里,但是接上电池电压低于5.6V就马上正常。 AD端口输入电流也比较大,如果串一个470R的电阻就会有10几mV电压差,端口已经设置为了输入高阻状态。 AVR是这样吗?有办法解决吗? 并上电阻100K的试试,即未接电池不空载. 想要谋杀单片鸡吗?! 输入要串电阻,然后并二极管嵌位。 片内或许有寄生二极管,但没给出指标的就不能作设计依据。 1. 串电阻会产生压降,测量不准确。并联10K电阻也不行啊。 2. 稳压管会有漏电严重影响测量。端口内部有保护二极管所以芯片应不会坏,我测了这么久也没坏。 如果用运放做一个保护就太麻烦。 to【3楼】aviator “1.串电阻会产生压降,测量不准确。” 串电阻会降多少,算过没?串1kΩ才降1/10000。再算上最大1μA的输入漏电流的影响,也就是千分之一的绝对误差,胜过AVR的鸡准电源不知多少倍了。 “2.端口内部有保护二极管所以芯片应不会坏,我测了这么久也没坏。” 恕俺直言,这不是设计者该说的话,设计者只信datasheet给出的数据,datasheet说了端口内部二极管有多大负载能力了吗?就算你有办法知道它能载多大电流,在没串电阻的情况下你能保证不过载吗? 从顶楼的信息“AD端口的电压就会比较高,比如到了8V”看,寄生二极管的嵌位功能已肯定不灵,没准已经损坏了! 不知道LZ对AD转换了解多少,但有一点必须注意的是:IO口上的电压不要超过VCC,不然的话,这个IO口是会损坏的,可能不是立即损坏,有可能是在工作的某一个时候损坏.所以,建议你不要把8.4V的电压接到IO上. 如果用电阻分压的话,你觉得精度会降低.但实际上,你应该先确定你自己的充电器要求的精度是多少,然后再来看看,电阻分压后的精度,是否能满足你的充电器的精度要求.如果这时候仍然不能满足的话,可以调整你的参考电压,或者换一个外部的,精度更高的ADC. 另外再个你提供一个办法,就是给输出电压分个压,接到另外的一个AD端口,并且判断该电压是否超过规定值,如果超过的话,就关断调整管.也可以接到模拟比较器,由它产生的中断来关断调整管也可以的. 如果你的调整管是用PWM来控制的话,这里就可以减小它的占空比,来降低它的输出电压. “外部串10K电阻就有10几mV的压降” ——这个正常,假定输入端有1μA的漏电流,那么在10kΩ上就是10mV。另外,输入漏电流并不等效于输入电阻,其中有常量的成分,校正后不会影响精度。 假如在输入端并一容量为20mA的嵌位二极管,串500Ω电阻的话,就足以抵御15V的输入电压而避免损伤MCU。再考虑设计的富余量和电阻功率的话,串1kΩ是比较合适的 我也知道端口电压不能超过允许值,问题是要怎么的电路比较简单有效的可以防止电压超过允许值。 第一种方法: 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就不行,不知道有什么办法能消除。 我想:很少人会把IO口的电压工作到它可以承受的范围以外来设计电路.你既然已经这样做了,也遇到了这样的问题,我觉得,应该先想办法把这里的电压降下来,这才是最根本的方法. 如果你的问题是AD转换死在这里,希望你也不要钻在这里跑不出来.因为ATMEL公司也不会有这样的测试结果,报告和解决方法的. 你的设计里面有两方面的问题: 1.在硬件设计里面,没有一个过电压保护电路.这在实际应用中是不可取的. 2.在软件设计里面,你要设一个最大的占空比,以防止输出电压过高. 对于锂电池充电,必须要限制充电电压不能超过4.35V,要不然,轻则损坏电池,重则爆炸! 提几个建议: 1.用运放或比较器来限制输出电压,将输出电压和一个基准电压比较,若高于基准电压,就减小PWM的占空比,一直减小到0. 2.把电流采样电阻放到下面.电池电压就是电池端的电压减去电流端的电压. 3.在软件里面,要有一段判断电流的程序,若电流小于一定的数值,就说明电池已充满,并且减小占空比. 4.把检流电阻适当取大些,或者接个放大器,这样可以提高电流的精度.这取决于你的充电电流的大小. 5.你可以用分压电阻来进行电压值的采样的.假如你用2.5V的Vref(最好把Vref减小些),那么,10BIT的ADC,精度有2.44mV. 这样不知道你够不够用 看了一哈电路,光就A/D口输入太高一事而言,觉得问题好像不大,稍改进下就行。提几点供参考。 ①.3个A/D输入其实都串了1kΩ,只是过于依赖AVR的片内嵌位,已超过它的负荷能力。解决的办法是把串联电阻加大,或3个通道各往5V加嵌位二极管。(俺强烈推荐后者,凡厂家不给出保证的功能都不可轻用。) ②.模拟放大部分都是些1%的电阻,再加上运放LM358的失调电压的影响,误差早就>>1%了,何必还去斤斤计较ADC输入差的几个mV?再说测电池充电也不会有mV级的精度要求吧? ③.题外话了,大电解用得太多,模拟地和数字地似乎也没分开的必要,都是慢速信号,需要的话程序里加几条语句滤下波也足够了。现在的模拟/数字地的分法是否比不分的好,很难说 (原文件名:二极管嵌位.GIF) 谢谢各位! 15楼: 原本希望内部的保护二极管起作用保护端口,现在看来就算端口没损坏程序也不能正确运行。 由于程序死在那里所以没办法去控制PWM降低减小电压,一个办法是使用非阻塞的循环来等AD转换完成,或加上超时检测,如果等待超时则降低PWM使电压降低。不过这样不保险,谁知道会不会那天坏了。 现在决定不用内部差分AD了,前面电路已经改成了运放,增益20倍,测量范围5A。 之所以这样设计是希望尽量减少电池电压测量的误差,所以电池电压未分压直接接入AD,而且取样电阻放在上面避免影响电池电压测量。 16楼: 外部二极管保护也会受到二极管反向漏电的影响,要找低漏电电流的二极管,1n4148的漏电电流为5~50nA,应该可以 重新测试,端口外加4148保护不起作用,电压高时单片机仍然会死。 只要把AD输入端口串一个大一点的电阻就可以了,我现在改为了10K(之前是470R),这样外部电压10V时端口电压5.6V,单片机不会死,一切正常。其实只要单片机不会死就行,单片机就会调整电压降低,只有意外的情况电压才会过高。 所以之前的问题是端口串的电阻太小导致,现在改为10K,压降为0.23mV,可以忽略。端口内部由于有保护二极管应该能使电压不高于5.6V。 扫瑞,俺忘了多说一句,外加嵌位时应该用肖特基二极管,正向鸭酱较低。1N4148的最大正向压降VF=1V(10mA时),动作晚于内部嵌位,结果是等单片鸡死了之后它才起作用呢,因为AVR要求输入不得超过Vcc+0.5V。 肖特基也有反向漏电小的,比如RB715F,最大漏1μA,跟ADC输入一个级别,典型值自己有50nA。 俺现在正琢磨用一个最大反漏只有100nA的肖特基阵列BAS70做输入的上下嵌位: http://61.222.192.61/mccsemi/up_pdf/BAS70TW_DW-04_DW-05_DW-06_BRW(SOT-363).PDF |
|