找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 662|回复: 11
打印 上一主题 下一主题
收起左侧

自制充电盒子 关于充放电电量指示灯显示不一致的问题 附单片机程序

[复制链接]
跳转到指定楼层
楼主
大家好,我现在使用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检测电池电压的线路图

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

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

使用道具 举报

板凳
ID:1065407 发表于 2023-3-6 16:22 | 只看该作者
coody_sz 发表于 2023-3-6 15:39
首先,电池是有内阻的,充电时电池电压吧放电时高,按理应该是充电时LED亮的数目比放电时多,但是你现在是 ...

充电时LED亮的数目也不能比放电时多,充放电时亮的数目应该要相同,麻烦帮忙看下程序设计是否有问题,谢谢
回复

使用道具 举报

地板
ID:844772 发表于 2023-3-6 17:24 来自手机 | 只看该作者
你看一下程序啊,是按那个对应关系表处理的,所以就是会出现差异,比如到了4伏,冲的时候是三亮一闪,放电时是4亮,不想这样就把程序判断部分的标准弄一致啦呗
回复

使用道具 举报

5#
ID:1065407 发表于 2023-3-6 19:43 | 只看该作者
glinfei 发表于 2023-3-6 17:24
你看一下程序啊,是按那个对应关系表处理的,所以就是会出现差异,比如到了4伏,冲的时候是三亮一闪,放电 ...

有没有别的处理方法呢,谢谢。是不是要找下电池的充放电曲线,充电和放电的电量电压不一样,然后再加点回差这个根据测试来定,或者精度要求不高就定大一点。
回复

使用道具 举报

6#
ID:1065407 发表于 2023-3-6 19:51 | 只看该作者
glinfei 发表于 2023-3-6 17:24
你看一下程序啊,是按那个对应关系表处理的,所以就是会出现差异,比如到了4伏,冲的时候是三亮一闪,放电 ...

看那个对应表,充电到4V时led是2亮一闪,而不是3亮一闪,根据电池特性,但当拔掉USB不充电时,电池电压会马上掉一些,理论上电压会稳定在3个led常亮的区间。
回复

使用道具 举报

7#
ID:401564 发表于 2023-3-6 21:56 | 只看该作者
那个充放的表格没什么用处,基本是不准确的
特别是放电那一块,更加不准确
回复

使用道具 举报

8#
ID:841986 发表于 2023-3-6 22:09 | 只看该作者
不用看表,多测测充放电电压区间,调调程序电压阈值就行了,充电会拉高VBAT电压的
回复

使用道具 举报

9#
ID:879348 发表于 2023-3-7 08:00 | 只看该作者
想要准确就要测量电流统计电量,纯电压就是这个效果
回复

使用道具 举报

10#
ID:1065407 发表于 2023-3-7 10:07 | 只看该作者
lzh085 发表于 2023-3-6 22:09
不用看表,多测测充放电电压区间,调调程序电压阈值就行了,充电会拉高VBAT电压的

是的,插入USB 5V充电时电池电压会马上升高,所以在电池的相同容量区间,充电时的电池电压都会比放电的高些。
回复

使用道具 举报

11#
ID:844772 发表于 2023-3-7 10:27 | 只看该作者
zzw820 发表于 2023-3-6 19:51
看那个对应表,充电到4V时led是2亮一闪,而不是3亮一闪,根据电池特性,但当拔掉USB不充电时,电池电压会 ...

我是说,你的程序是按你的表做的,那个表又不是很准,造成你说的不一致现象。一方面这是个小事,没必要改。另一方面,如果非要改,你就要仔细调整表上的值,这个比较麻烦不说,还会随着电池的老化而变化,
回复

使用道具 举报

12#
ID:322197 发表于 2023-3-9 12:17 来自手机 | 只看该作者
发个完整的程序看一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表