打印

各位大神,一个IO口如何检测充电芯片的各种状态

[复制链接]
19369|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 21562644322 于 2020-12-23 19:10 编辑

如图,一个单片机IO口(可内部上下拉)检测4056的CHRG信号(充电时低,常态及充满为高阻态),需要做唤醒、判断插入充电、判断充满、判断拔出,如何实现,求解

1608720854(1).png (36.21 KB )

1608720854(1).png

使用特权

评论回复

相关帖子

沙发
chongdongchen| | 2020-12-24 10:22 | 只看该作者
这样判断好像可以,请参考:
IO接1脚上拉1M到+5V
若先下拉输入为0,且浮空输入为1,则为已插入并充满状态。
若浮空输入为0时,设置上拉若输入为1:没插入,若还是0:在充电
刚插入或刚拔出,可以根据以上状态变化得出

使用特权

评论回复
板凳
dirtwillfly| | 2020-12-24 16:46 | 只看该作者
换个功能更强大的充电管理ic吧,就很容易检测了

使用特权

评论回复
地板
DVzhang| | 2020-12-24 17:25 | 只看该作者
本帖最后由 DVzhang 于 2020-12-24 17:29 编辑

用MCU的ADC通道读取电压值进行判断,设置R1=R2,R1上面串联个二极管到3.3V,则可根据采样的电压为0V,1.5V左右,2.5V左右,对应插入充电中,拔出,插入且充满

使用特权

评论回复
5
21562644322|  楼主 | 2020-12-25 14:04 | 只看该作者

各位,我用内部上下拉浮空实时切换得到3种电平组合判断充电状态,试了下,效果可以暂时没发现什么问题,请大家评审看看
void ChrgPortScan(void)//10ms一次
{
        static uchar Seq = 0;
        static uchar Cnt_Chrg = 0;
        static uchar Cnt_Full = 0;
        static uchar Cnt_Null = 0;
        PHB2 = 0;//内部上拉
        PDB2 = 1;
        DelayUs2x(50);
        **.RegUp =        S_CHRG;      
        PHB2 = 1;//内部浮空
        PDB2 = 1;
        DelayUs2x(50);
        **.RegFl =        S_CHRG;      
        PHB2 = 1;//内部下拉
        PDB2 = 0;
        DelayUs2x(50);
        **.RegDn =        S_CHRG;               
        if((**.RegUp==0)&&(**.RegDn==0)&&**.RegFl==0))//充电
        {         
                Cnt_Full = 0;
                Cnt_Null = 0;
                Cnt_Chrg++;
                if(Cnt_Chrg>=2)
                {
                        Cnt_Chrg = 0;
                        Stat_Chrg = STAT_CHRG;        
                        En.LED_Flk = 1;
                        MotoSpeed=0;
                        MOTO_PWM = 0;
                        En.Led1 = 0;
                        En.Led2 = 0;
                        En.Led3 = 0;      
                }      
        }
        else if((**.RegUp==1)&&(**.RegDn==0)&&(**.RegFl==1))//充满
        {      
                Cnt_Chrg = 0;
                Cnt_Null = 0;
                Cnt_Full++;
                if(Cnt_Full>=3)
                {
                        Cnt_Full = 0;
                        Stat_Chrg = STAT_FULL;                             
                        En.LED_Flk = 0;
                        RemTime_LED_Flk = 10;
                        En.Led4 = 1;
                        En.Led1 = 0;
                        En.Led2 = 0;
                        En.Led3 = 0;               
                        MotoSpeed=0;
                        MOTO_PWM = 0;
                }
        }      
        else if((**.RegUp==1)&&(**.RegDn==0)&&(**.RegFl==0))//拔掉
        {
                Cnt_Chrg = 0;
                Cnt_Full = 0;
                Cnt_Null++;      
                if(Cnt_Null>=3)
                {
                        Cnt_Null = 0;      
                        Stat_Chrg = STAT_NULL;                              
                        ClrLED();
                }
        }         
//        else {Stat_Chrg = STAT_NULL;ClrLED();}
}

微信图片_20201225115130.jpg (171.21 KB )

微信图片_20201225115130.jpg

使用特权

评论回复
6
wshengbing| | 2021-1-13 09:04 | 只看该作者

各位大神,一个IO口如何检测充电芯片的各种状态

1.用分压法,通过串联几个电阻,分3路输出,每种输出电压不一样,如果IO带AD转换用AD,如果没有AD转换,3路输出分别接比较器,最终输出接IO口。

使用特权

评论回复
7
一事无成就是我| | 2021-4-17 23:16 | 只看该作者

各位大神,一个IO口如何检测充电芯片的各种状态

我就是用的一个IO口检测充电,不过用的是有比较器和内置调档的,不然你就只能用带ADC的,咋做的呢,首先充电输入一个三极管驱动一个电阻到IO,IO口有上拉分压电阻,IO再一个电阻到充电满输出,当有充电输入后,三极管导通,IO口拉到能1/3的VCC电压,IO口检测到L,开启比较器或者ADC,没有充满的时候这个电压更低,充满后要高点,通过这个差异去判断有没有充电输入和充电满,不知讲清楚没有。

使用特权

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

本版积分规则

8

主题

40

帖子

0

粉丝