简介:何为软开关?软开关是相关于硬开关而言。硬开关望文生义,电源的开断彻底取决于硬件,是物理层上的开合;而软开关,则是有必要凭借于软件,精确地说是凭借软件来进行封闭。
两者各有好坏。前者由于是物理层的操作,能够讲电源和体系部分彻底隔绝,所以封闭时漏电流十分小,但缺点是封闭时无法给予软件任何告诉信息;而后者的封闭仅仅电平的操作,封闭后无法将电源部分与体系部分隔绝,因而相对而言,漏电流会比较大,但长处在于,封闭是由软件进行操控,所以能在封闭前做好相应的准备工作。正是由于此特性,故电子设备来说选用硬开关的规划十分少,更多的是软开关。举个简略的比如,咱们常用的家用电脑便是软开关规划。试想参加电脑选用的是硬开关的规划,会是什么成果?成果估量就好像咱们在正常运用电脑时,忽然将插头给拔掉相同。这样,关于电脑的设备,特别是硬盘而言,所形成的危害是不可估量的。
软开关规划 硬件篇
关于软开关而言,在咱们按下那一瞬间,由于还没有给CPU上电,不存在任何程序履行的或许,所以注定“翻开”这一个操作只能用硬件完结。当体系跑起来今后,此刻软件现已开端运作,咱们就能经过对GPIO进行操作来封闭设备。综上所述,假如要完成软开关,咱们有必要具有两个GPIO口。一个为DETECT_KEY,作为输入,用来检测按键是否按下;另一个为GPIO_SHDW,作为输出,用来操控电源的闭合。
现在,咱们来看一个典型的软开关电路(图一,以下解说都以电路图的标号为指代):
该电路很简略,对外的节点有四处,别离如下:
PWR_ON:用来操控体系的电源。当其为high时,体系正常供电。
VDD33D:直接接3.3V电压
GPIO_SHDW:当其为low时封闭体系电源
DETECT_KEY:检测按键S1的状况。
咱们现在依据开机到关机的进程来一步一步来剖析该电路:
1.未开机,S1未按下。
此刻GPIO_SHDN为low,直接操控了Q1和Q2的操控脚(PIN1),令VDD33D的电压无法输出到POW_ON端。而D1由于S1未按下,该二极管也处于隔绝状况,S1端的VDD33D也无法输送到POW_ON端。故整个体系还处于封闭状况。
2.S1按下,开机。
S1按下,二极管D1导通,S1端的VDD33D电压输送到PWR_ON端,体系开端发动。体系发动时,将GPIO_SHDN置high。此刻PWR_ON现已输入了R2,R3端的VDD33D电压,D1两头电压基本上处于平衡状况,D1相当于断开,S1端的电压无法加载到PWR_ON。
3.S1铺开,体系正常运转。
S1铺开,D1不或许再导通,而此刻电压现已主要是从R2,R3端的VDD3D输入,令PWR_ON一向坚持high状况,故体系一向处于正常运转状况。
4.S1按下,体系正常运转。
由于S1按下,导致Q3导通,拉低R6端下方的电压,此刻DETECT_KEY这个GPIO口检测到电平为low,软件开端进入计时状况。
5.S1铺开。
由于S1现已铺开,Q3不再导通,R6下端电压康复,DETECT_KEY检测到电平为high。此刻软件和阈值做比较,假如超越预订的阈值,则封闭体系;不然,将本次操作疏忽。在这儿之所以和阈值进行比较,是出自于防抖的需求。由于在实际运用中,或许R6端会有细小的极为时间短的电压降,假如软件不设置阈值,检测到该电压降就会封闭,这关于产品而言是不允许的。
软开关规划 软件篇
相关于硬件来说,软开关的软件代码更为简略,只需求检测DETECT_KEY即可。该功用的完成主要是经过GPIO,而wince并没有对GPIO做上层界说,而且每款CPU的GPIO的操作方法又各自不同,所以本文无法给出一个完好可用的代码,只能用伪代码作为示例解说。虽然是伪代码,但关于了解其流程仍是有必定的含义。
void Power_On()
{
…
//设置GPIO_SHDN为high
SetGPIO_HIGH(GPIO_SHDN);
…
}
DWORD PWR_IntrThread(PVOID pParam)
{
….
//使能中止
EnableInterrupt();
//初始化中止
InterruptInitialize(btnSysIntr, hNotifyEvent, 0, 0)
while(TRUE)
{
//等候中止事情
dwRet = WaitForSingleObject(hNotifyEvent, INFINITE);
if(dwRet == WAIT_OBJECT_0)
{
//中止处理完毕,让中止再次进入处理
InterruptDone(btnSysIntr);
//再次等候中止处理事情
dwRet = WaitForSingleObject(hNotifyEvent, 1000);
if(dwRet == WAIT_TIMEOUT)
{
//当其位WAIT_TIMEOUT时,意味着为长按,进入poweroff函数
EnterPowerOff();
}
}
}
….
}
void EnterPowerOff()
{
…
while(TRUE)
{
if(IsGPIOHigh(GPIO_DETECT_KEY) != FALSE)
{
//S1现已松开,跳出循环
break;
}
}
//封闭体系电源
SetGPIO_LOW(GPIO_SHDN);
…
}
这儿仅有需求留意的是EnterPowerOff函数,在这儿有必要要检测S1是否现已松开。假如还没有松开S1就将GPIO_SHDN置为LOW,由于S1端还有VDD33D电压输入到PWR_ON端,所以体系仍是无法封闭。