搜索
搜索
热搜: 净化器雕刻机阿莫邮购
amoBBS 阿莫电子论坛?论坛首页?单片机?STM32/8?Cumu开源智能WIFI万用表:一键开关机及充电检测 ...bottom↓
返回列表发新帖
查看: 1264|回复: 43
打印 上一主题 下一主题 Cumu开源智能WIFI万用表:一键开关机及充电检测 [复制链接]
Cumu
电梯直达跳转到指定楼层 1楼
发表于 2015-5-19 10:15:38 | 只看该作者 回帖奖励
本帖最后由 Cumu 于 2015-5-19 10:18 编辑
感谢各位网友对Cumu第一次亮相的围观,想法还是要靠技术实现,我会把Cumu的软硬件设计思路全程记录下来,刚刚接触STM32的新手也可以跟我共同进步,高手可以纠正我的错误,完善Cumu
Cumu首次亮相链接:Cumu开源智能WIFI万用表首次公开:精心筹备1年,将开源进行到底
第一章:一键开关机及充电检测
相关电路截图如下:
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
转载
|