Cumu开源智能WIFI万用表:一键开关机及充电检测

2020-01-07 19:23发布

本帖最后由 Cumu 于 2015-5-19 10:18 编辑

感谢各位网友对Cumu第一次亮相的围观,想法还是要靠技术实现,我会把Cumu的软硬件设计思路全程记录下来,刚刚接触STM32的新手也可以跟我共同进步,高手可以纠正我的错误,完善Cumu
Cumu首次亮相链接:Cumu开源智能WIFI万用表首次公开:精心筹备1年,将开源进行到底

第一章:一键开关机及充电检测

相关电路截图如下:
充电图.jpg (265.93 KB, 下载次数: 5) 下载附件 2015-5-19 10:07 上传
V_BAT为电池正极,CAT6219为整机供电的3.3V稳压

要实现的功能是:
1、一键开关机
2、关机插入充电器时屏幕显示充电进度条,长按按键开机进入正常工作界面,再次长按按键关机并重新显示充电进度条
3、充满电时提示用户
4、开机状态插入充电器,提示正在充电,拔出时提示充电器拔出


电路实现原理:
(1)当按下按键后,MOS管U1B导通,CAT6219开始工作,输出3.3V电压为系统供电,MUC开始运行并检测到KEY已经变成低电平,说明是按键引起的开机,然后等待3秒钟如果KEY还是低电平,则PWR输出高电平MOS管U1A导通,这时就算按键松开,U1B也会维持导通状态,完成开机操作,如果在3秒内松开按键,则U1B截止,CAT6219停止工作,不会开机。
(2)开机后MUC的ADC可以检测到电池电压,并且BAT_C(图中左下角)经过二极管可以检测到充管理电芯片的充电状态(充电管理芯片第7脚是集电极开路,充电时拉低)。
当检测到正在充电时,LCD显示充电图标。拔出充电器后,BAT_C恢复高电平,LCD提示用户充电器已经拔出。
(3)如果充满电后,充电管理芯片的第6脚BAT_M(截图中没有,需要看原理图)会拉低,这样MCU检测到后 ,LCD显示电池已经充满。
(4)关机状态插入充电器后,充电管理芯片第7脚拉低,D2导通,U1B导通,MCU开始运行,检测到按键并没有按下,则进入关机充电状态(LCD只显示充电状态,其他功能并不工作,想象一下手机关机时充电),PWR输出高电平维持开机状态(充满电后,充电管理芯片的第7引脚会恢复高电平,如果PWR输出高电平,则充满电后U1B会截止)。关机充电状态下长按按键,MCU运行正常测量程序,退出关机充电状态。
(5)正常测量状态下长按按键,如果充电管理芯片第7脚为高电平,说明现在没有连接充电器,那么PWR输出低电平,U1B截止完成关机操作。如果充电管理芯片第7脚为低电平,说明现在连接充电器了,则退出测量程序,进入关机充电状态(LCD只显示充电进度)。

程序:
//开机操作
void start()
{
   uint8_t i=0;
         if(KEY==0)//按键引起的开机
         {
             while(1)
                         {
                             Delay_ms(100);
                                   if(++i>30)//3秒钟之后
                                         {
                                                        PWR_1;//保持开机状态
                                                  //此处显示开机LOGO
                                                  break;
                                         }
                                         else
                                         {
                                            if(KEY!=0) i=0;//按键时间小于3秒
                                         }
                         }
         }
         else//充电引起的开机
         {
             i=0;
                   while(1)
                         {
                             Delay_ms(100);
                                   //此处刷新充电界面
                                   if(KEY==0)//按键按下
                                         {
                                                         if(++i>30)//3秒钟之后
                                                         {
                                                                        PWR_1;//保持开机状态
                                                                        //此处显示开机LOGO
                                                                        break;
                                                         }
                                         }
                                         else //按键抬起就要重新计时
                                         {
                     i=0;                                 
                                         }
                         }
         }
}

//关机操作
void Stop()
{
   uint8_t i=0;
         if((BATC==0)|(BATM==0))//充电状态
         {
             while(1)//充电状态关机后进入充电界面
                         {
                                         Delay_ms(100);
                                   //此处刷新充电界面
                                   if(KEY==0)//按键按下
                                         {
                                                         if(++i>30)//3秒钟之后
                                                         {
                                                                        PWR_1;//保持开机状态
                                                                        //此处显示开机LOGO
                                                                        break;
                                                         }
                                         }
                                         else //按键抬起就要重新计时
                                         {
                     i=0;                                 
                                         }
                         }
         }
         else //非充电状态直接关机
         {
                         //此处关机LOGO
                   PWR_0;
                   while(1);
         }
}

//按键处理  KOK=1 短按     KOK=2 长按  在定时器中断中运行
void KeyScan()
{
                if(KEY==0)
                {                       
                                if(++KCnt>200)
                                {
                                          KSet = 0;
                                          KCnt = 200;
                                          KOK  = 2;
                                }
                                else if(KCnt>10)
                                {
                                          KSet = 1;
                                }
                }
                else
                {
                                 KCnt = 0;
                           if(KSet==1)
                           {
                                                KSet = 0;
                                                KOK = 1;
                                 }
                }
}

int main(void)
{
        SystemInit();
        TIM_INT_Config();
        TIM_OUT_Config();
        IO_Init();
        Systick_Init();
        USART_Configuration();
        initial_lcd();//LCD初始化
        full_display();//全屏填充
        start();//开机
        while(1)
        {
                if(KOK==2)//长按按键关机
                {
                          Stop();
                }
                LED_0;
                Delay_ms(1000);
                LED_1;
                Delay_ms(1000);
        }       
}

本帖PDF
Cumu第一章:一键开关机及充电检测.pdf (606.52 KB, 下载次数: 410) 2015-5-19 10:14 上传 点击文件名下载附件

Cumu原理图
Cumu_PCB_V1.0.pdf (697.33 KB, 下载次数: 442) 2015-5-19 10:15 上传 点击文件名下载附件
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
93条回答
Vampireyifeng
1楼-- · 2020-01-13 00:40
有个建议,楼主的电源电路里是不是应该加一个外接电源和锂电池电源切换的电路,这样有外接电源插入时就给锂电池充电,同时直接给系统供电,不然的话锂电池一边充电一边放电不好吧。用个mos管就可以。
当然 这也只是个人的观点而已
hnxoj26
2楼-- · 2020-01-13 05:32
Cumu 发表于 2015-5-19 11:28
图中各个二极管的作用:

1. 不太理解文档中电路实现原理第四点中“充满电后,充电管理芯片
的第7 引脚会恢复高电平,如果PWR 输出高电平,则充满电后U1B 会截止”这句原理。
2. BAT_C端是用的单片机内部上拉模式吗
楼主有空麻烦解答一下,谢谢了。
Cumu
3楼-- · 2020-01-13 05:54
hnxoj26 发表于 2015-6-8 22:53
1. 不太理解文档中电路实现原理第四点中“充满电后,充电管理芯片
的第7 引脚会恢复高电平,如果PWR 输出 ...

多谢提醒,是笔误,PWR在关机充电状态要输出高电平,用于维持充电状态,要不然充满电就会关机
Cumu
4楼-- · 2020-01-13 06:37
Vampireyifeng 发表于 2015-5-29 16:19
有个建议,楼主的电源电路里是不是应该加一个外接电源和锂电池电源切换的电路,这样有外接电源插入时就给锂 ...

不会出现一边充电一边放电的情况,外接电源插入时,充电管理芯片就会给电池充电,同时也会给系统供电,当充电器拔出后,自动转为电池供电
WITSOFT
5楼-- · 2020-01-13 08:48
 精彩回答 2  元偷偷看……
wanyi
6楼-- · 2020-01-13 11:25
确实是好的项目,留个爪,为你盖楼!

一周热门 更多>