打印

一个单片机IO口如何检测4056的各种状态

[复制链接]
2050|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
如图,一个单片机IO口检测4056的状态(充电时低,常态及充满为高阻态),需要做唤醒、判断插入充电、判断充满、判断拔出,如何实现,求解

1608720854(1).png (36.21 KB )

1608720854(1).png

使用特权

评论回复

相关帖子

沙发
ayb_ice| | 2020-12-24 10:46 | 只看该作者
全部需求是做不到的

使用特权

评论回复
板凳
qq986433936| | 2020-12-25 00:00 | 只看该作者
用AD检测呗,配合另一个IO做输入切断

使用特权

评论回复
地板
21562644322|  楼主 | 2020-12-25 10:03 | 只看该作者
ayb_ice 发表于 2020-12-24 10:46
全部需求是做不到的

可以实现的

使用特权

评论回复
5
alpha321| | 2020-12-25 10:25 | 只看该作者
这就要看你使用的口线的功能了,最好有ADC输入功能和准双向功能,而且可以切换

使用特权

评论回复
6
21562644322|  楼主 | 2020-12-25 11:49 | 只看该作者
各位,我用内部上下拉浮空实时切换得到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

使用特权

评论回复
7
coody| | 2020-12-26 10:50 | 只看该作者
很简单,经常用,唤醒、判断插入充电、判断拔出均由充电检测的IO实现,判断充满由充电检测实现。

使用特权

评论回复
8
21562644322|  楼主 | 2020-12-26 16:15 | 只看该作者
coody 发表于 2020-12-26 10:50
很简单,经常用,唤醒、判断插入充电、判断拔出均由充电检测的IO实现,判断充满由充电检测实现。 ...

你是采用我这种方法吗

使用特权

评论回复
9
qq986433936| | 2020-12-27 00:04 | 只看该作者
本帖最后由 qq986433936 于 2021-1-3 04:06 编辑

编程没问题,可以实现

使用特权

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

本版积分规则

8

主题

40

帖子

0

粉丝