您的位置 首页 制造

软开关规划:典型电路及软件代码

简介:何为软开关?软开关是相对于硬开关而言。硬开关顾名思义,电源的开断完全取决于硬件,是物理层上的开合;而软开关,则是必须借助于软件,准确地说

简介:何为软开关?软开关是相关于硬开关而言。硬开关望文生义,电源的开断彻底取决于硬件,是物理层上的开合;而软开关,则是有必要凭借于软件,精确地说是凭借软件来进行封闭。

两者各有好坏。前者由于是物理层的操作,能够讲电源和体系部分彻底隔绝,所以封闭时漏电流十分小,但缺点是封闭时无法给予软件任何告诉信息;而后者的封闭仅仅电平的操作,封闭后无法将电源部分与体系部分隔绝,因而相对而言,漏电流会比较大,但长处在于,封闭是由软件进行操控,所以能在封闭前做好相应的准备工作。正是由于此特性,故电子设备来说选用硬开关的规划十分少,更多的是软开关。举个简略的比如,咱们常用的家用电脑便是软开关规划。试想参加电脑选用的是硬开关的规划,会是什么成果?成果估量就好像咱们在正常运用电脑时,忽然将插头给拔掉相同。这样,关于电脑的设备,特别是硬盘而言,所形成的危害是不可估量的。

软开关规划 硬件篇

关于软开关而言,在咱们按下那一瞬间,由于还没有给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端,所以体系仍是无法封闭。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/zhizao/139928.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部