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 上传 点击文件名下载附件
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
94条回答
hyper320
2020-01-11 00:51
首先佩服LZ的开源精神,一看到这个线路,居然和我最近做的一个手持装置不谋而合,这阵子也是为了手持设备能降低能浩,炸干电池电力而绞尽脑汁,所以梢有些心得,和LZ分享之,当然只是我客人浅见,如有堪误之处请勿见怪:

1.楼主用的是电池,我的线路同样也是,只是我用的是干电池,所以实验过程和理论大概都推敲了一下,因为用的是电池,所以希望能尽量炸干电池的电力,而电源控制的方式会引响到电力的持续,看楼主把电源开关控制做在LDO的前端,首先进入LDO的电源电压就被削低了至少0.2V,这表示电池会提早没电,虽然只差0.2V,但在电池场合可能就意味着可以多用几个小时或是几天,重点是你的线路根本不需要这么复杂的控制开关线路,我的线路之所以需要是因为我用的是QX2304升压IC,虽然这颗IC也有EN控制脚,但后来才发觉QX2304的EN只是控制升压线路不震荡,EN关掉还是能从输出端量到电压,而楼主用的CAT6219我仔细的看了规格书,它是能完全关断电源的,也就是说其实楼主实际上只要控制CAT6219的EN脚就能开关电源了,随之的好处是还少了用三级管造成的压降,线路也清爽了许多.
改用CAT6219本身的EN脚控制之后,仅仅是加上一个三级管控制ADC的取样线路,所以全部的线路只需要用到一颗三级管.

2.如果照原来的线路其实D3是不需要的,D1的解释也有问题,其实D1的使用是和现代IC制程有关的,现代的MCU大部分都是用CMOS,CMOS非常省电,甚至MCU可以不需要由VCC脚位供电,只要随便由一个IO供电,MCU都可能会工作,所以D1是为了阻止在关机状态时电流流入MCU IO脚,而造成MCU工作,所以D1这颗是必须要的

这些大概是我这阵子也在做类似的线路得出的心得,楼主可以参考下

一周热门 更多>