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-16 17:07
nds_shenzhen 发表于 2016-3-1 20:44
你修改的图 有错误吧  u4 按下按键 并不能够输出电压 vcc  因为 pmos管子并没有导通输出电压  所以R9断的 ...

nds真是火眼金睛,的确没错,我忽略了此处,毕竟没有实际线路测试,我再仔细看了一下,可以把原本接vcc的地方去掉,改连接到u4的第三脚,这样保证在按下按键的时候可以让mos导通了,而且还有一个地方也忽略了,那就是原本 “KEY”信号我改了线路后极性改变了,所以原本接到STM32的上拉电阻要改成下拉到地

一周热门 更多>