标题: 自制充电盒子 关于充放电电量指示灯显示不一致的问题 附单片机程序 [打印本页]

作者: zzw820    时间: 2023-3-6 14:54
标题: 自制充电盒子 关于充放电电量指示灯显示不一致的问题 附单片机程序
大家好,我现在使用STC8H1K08设计一个充电盒子,盒子内置一颗可充电的锂电池,容量是500mAh,盒子外面有4个LED电量指示灯,使用单片机内置的ADC检测电池电压。当盒子插入USB 5V充电时,根据电池电量的高低就会显示相应的LED,电池电量越高显示(打开)的LED就越多,反之,越少,当盒子充满电时4个LED常亮。当盒子不充电(也就是放电)时,可通过短按盒子上面的按键显示当前电池的电量指示灯。我现在遇到的问题是:盒子充电时和不充电时(也就是放电时)电量指示灯显示不一致的问题,比如盒子在充电时显示两个LED(从左边开始数起,第一个LED常亮,第二LED在闪烁),当盒子拔掉USB 5V不充电时,通过短按按键却显示3个LED电量指示灯,我认为正确的做法应该是,盒子充电时显示多少个led,盒子不充电时(放电)也要显示多少个led,也就是盒子充放电显示电量指示灯的数量应该要一致。现向大家请教一下怎么解决此问题,如下是设计资料,谢谢各位指点。

如下是盒子在充电时的灯显程序:
                    if(usb_in==1)
                        {      
                                vbat=get_vbat_value(0);
                                  if(vbat>4.0947)
                        {
                                if(count2==50)//500mS时间到
                                {
                                  led1=1;
                                  led2=1;
                                  led3=1;
                                  led4=!led4;
                                  count2=0;
                                }
                        }
                        else if(vbat>3.9725)
                        {
                                if(count2==50)
                                {
                                led1=1;
                                led2=1;
                                led3=!led3;
                                led4=0;
                                count2=0;
                                }
                        }
                        else if(vbat>3.9105)
                        {
                                if(count2==50)
                                {
                                led1=1;
                                led2=!led2;
                                led3=0;
                                led4=0;
                                count2=0;
                                }
                        }
                        else if(vbat>3.0)
                        {
                                if(count2==50)
                                {
                                led1=!led1;
                                led2=0;
                                led3=0;
                                led4=0;
                                count2=0;
                                }
                        }

        }      

如下是盒子在不充电时(放电时),通过按键显示电量指示灯的程序:

        esle if(key_flag==1&&usb_out==1)
                {
                        vbat=get_vbat_value(0);
                        if(vbat<3.5001)
                        {
                                if(count3==50)//盒子在非常低电时会快闪led提示
                                {
                                  led1=!led1;
                                  led2=0;
                                  led3=0;
                                  led4=0;
                                 count3=0;
                                 key_flag=0;
                                }
                }
                                else if(vbat<3.6954)
                        {
                                led1=1;
                                led2=0;
                                led3=0;
                                led4=0;
                                if(count3==300)//显示3秒电量指示灯
                                {
                                  led1=0;
                                  led2=0;
                                  led3=0;
                                  led4=0;
                                count3=0;
                                key_flag=0;
                                }
                }
                        else if(vbat<3.7589)
                        {
                                led1=1;
                                led2=1;
                                led3=0;
                                led4=0;
                                if(count3==300)
                                {
                                  led1=0;
                                  led2=0;
                                  led3=0;
                                  led4=0;
                                count3=0;
                                key_flag=0;
                                }
                }
                        else if(vbat<3.8929)
                        {
                                led1=1;
                                led2=1;
                                led3=1;
                                led4=0;
                                if(count3==300)
                                {
                                 led1=0;
                                  led2=0;
                                  led3=0;
                                  led4=0;
                                count3=0;
                                key_flag=0;
                                }
                        }
                        else if(vbat<4.2)
                        {
                                led1=1;
                                led2=1;
                                led3=1;
                                led4=1;
                                if(count3==300)
                                {
                                  led1=0;
                                  led2=0;
                                  led3=0;
                                  led4=0;
                                count3=0;
                                key_flag=0;
                                }
                        }      
        }

如下是电池充放电曲线图:



如下是根据电池充放电划分的电压和电量之间的对应关系


如下是ADC检测电池电压的线路图


作者: coody_sz    时间: 2023-3-6 15:39
首先,电池是有内阻的,充电时电池电压吧放电时高,按理应该是充电时LED亮的数目比放电时多,但是你现在是相反的,可能是你电路的问题,PCB排版不好导致。
作者: zzw820    时间: 2023-3-6 16:22
coody_sz 发表于 2023-3-6 15:39
首先,电池是有内阻的,充电时电池电压吧放电时高,按理应该是充电时LED亮的数目比放电时多,但是你现在是 ...

充电时LED亮的数目也不能比放电时多,充放电时亮的数目应该要相同,麻烦帮忙看下程序设计是否有问题,谢谢
作者: glinfei    时间: 2023-3-6 17:24
你看一下程序啊,是按那个对应关系表处理的,所以就是会出现差异,比如到了4伏,冲的时候是三亮一闪,放电时是4亮,不想这样就把程序判断部分的标准弄一致啦呗
作者: zzw820    时间: 2023-3-6 19:43
glinfei 发表于 2023-3-6 17:24
你看一下程序啊,是按那个对应关系表处理的,所以就是会出现差异,比如到了4伏,冲的时候是三亮一闪,放电 ...

有没有别的处理方法呢,谢谢。是不是要找下电池的充放电曲线,充电和放电的电量电压不一样,然后再加点回差这个根据测试来定,或者精度要求不高就定大一点。
作者: zzw820    时间: 2023-3-6 19:51
glinfei 发表于 2023-3-6 17:24
你看一下程序啊,是按那个对应关系表处理的,所以就是会出现差异,比如到了4伏,冲的时候是三亮一闪,放电 ...

看那个对应表,充电到4V时led是2亮一闪,而不是3亮一闪,根据电池特性,但当拔掉USB不充电时,电池电压会马上掉一些,理论上电压会稳定在3个led常亮的区间。
作者: Y_G_G    时间: 2023-3-6 21:56
那个充放的表格没什么用处,基本是不准确的
特别是放电那一块,更加不准确
作者: lzh085    时间: 2023-3-6 22:09
不用看表,多测测充放电电压区间,调调程序电压阈值就行了,充电会拉高VBAT电压的
作者: wufa1986    时间: 2023-3-7 08:00
想要准确就要测量电流统计电量,纯电压就是这个效果
作者: zzw820    时间: 2023-3-7 10:07
lzh085 发表于 2023-3-6 22:09
不用看表,多测测充放电电压区间,调调程序电压阈值就行了,充电会拉高VBAT电压的

是的,插入USB 5V充电时电池电压会马上升高,所以在电池的相同容量区间,充电时的电池电压都会比放电的高些。
作者: glinfei    时间: 2023-3-7 10:27
zzw820 发表于 2023-3-6 19:51
看那个对应表,充电到4V时led是2亮一闪,而不是3亮一闪,根据电池特性,但当拔掉USB不充电时,电池电压会 ...

我是说,你的程序是按你的表做的,那个表又不是很准,造成你说的不一致现象。一方面这是个小事,没必要改。另一方面,如果非要改,你就要仔细调整表上的值,这个比较麻烦不说,还会随着电池的老化而变化,
作者: mhb7231    时间: 2023-3-9 12:17
发个完整的程序看一下




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1