[APM32F4]基于APM32F411控制的一个软开关电路设计分享

2023-12-19

1. 前言

说明: 本文介绍的软开关电路,并不是 开关电源 里面的软开关概念,而是系统供电的开关,结合MCU等控制芯片,控制系统供电的开启或关断。
在某些电子产品的场合,我们经常会需要用到按键长按进行开机,然后按键长按进行关机,或者按键长按之后有触摸屏的可以弹出关机菜单,然后进行关机的操作。这个操作的过程就是软开关电路在控制的。
比如说可穿戴的手环设备,就有一个按键可以长按开机,这时松开了开机键之后也不会掉电。开机之后,长按按键,如果有 UI 界面的话,可以弹出关机选项,然后选择关机,又或者 MCU 检测到长按,直接输出控制,关断系统的供电。开机之后,进行关机的操作,就是由这个软开关电路进行控制的。

2. 硬件设计

根据上面的介绍,软开关并不能都只依靠软件来完成,因为当系统电源处于关闭状态时,MCU都还没有供电,此时就只能通过 按下开关键 ,然后等待MCU上电后进行电源的控制,当软件运行起来之后,就算开关键松开了,也可以控制住电源不会掉电。
总结起来,软开关电路的设计需要下面一些条件:
  • 当整个系统处于断电状态,有一个按键可以控制开机
  • 系统开机之后,有一个 GPIO 口可以控制系统电源的打开和关闭
  • 系统开机之后,可以检测到按键长按的状态,然后进行关机动作(如果有UI界面,也可以是UI界面控制关机的动作)
根据上面总结的几个条件,下面我分享一个基于 APM32F411 MCU 控制的一个软开关电路的设计。

2.1 电路原理图

软开关电路设计的思路有很多,我的设计想法是控制电源芯片的 EN (使能)脚,控制使能脚的供电开关,从而控制电源芯片输出电压,给到整个系统进行供电。
下图就是软开关电路的总体电路图:



总体介绍:

  • 该电路的电源输入有:3.7V 电池和 USB 供电两种方式。
  • 软开关控制的思路是,控制 SPX3819 电源芯片的使能引脚的供电,使能引脚上有电压时,SPX3819 就会有 3.3V 输出,从而给整个系统供电。
  • 当 SW1 按键没有按下时,PMOS 管 Q2 的源极和栅极电位相等,Vgs = 0V,不能导通,所以没有电压通过 SPX3819 的使能脚,也就没有 3.3V 输出给系统。

2.2 原理分析

软开关电路控制部分,主要位于左下角的电路。下面我分几种状态,对该电路如何实现了软开关功能进行详细分析。

1)系统关机,SW1按键未按下

当系统处于掉电状态,而且此时 SW1 按键也没有按下 ,而且控制 NMOS 管 Q3 的栅极控制信号 SYS_POWER_LOCK 此时也是处于低电平的状态,所以 NMOS 管 Q3 关闭。所以,Q2 的 PMOS 管此时的G极(栅极)和S极(源极) 电位相等 , 即 Q2管 的 Vgs = 0V ,也就是说 Q2 管是关闭的,所以 VIN 电压不可能输入到电源芯片的 SPX3819 的使能脚,也就不可能有 3.3V 的输出给整个系统供电,所以此时系统没有供电。
此状态下的等效电路图如下:

2)系统关机,SW1按键按下

当系统处于掉电状态,但是 SW1按键按下时 ,此时的 PMOS 管 Q2 的栅极电压就是二极管 D3 1N5819 的管压降电压,我这里就算它有 0.7V 好了,那么也就是说 Q2 的栅极电位是 Vg = 0.7V,而此时 Q2 的源极电压是 VIN(电源输入电压,3.7V或者5V)。 所以 Vgs = -4.3V,Q2 导通,也就是有电压输入到 SPX3819 芯片的使能脚,从而有3.3V电源给整个系统供电。
所以,按下SW1按键,系统开机。
此时的等效电路如下:

3)系统开机,SYS_POWER_LOCK控制信号输出高电平,SW1按键松开

SW1下,有电源给整个整个系统供电之后,此时 MCU软件运行 ,然后马上对 SYS_POWER_LOCK 控制信号,输出高电平,控制 NMOS 管 Q3 导通。
然后这时,用户松开 SW1 按键,但是由于此时 Q3 导通,所以 Q2 管的栅极(G极)电压基本接近 GND (取决于Q3的管压降)。所以,Q2 管依然保持导通的状态,系统供电正常。
此时的等效电路图如下:


4)系统开机,SW1按键按下

系统已经开机后 ,此时已经有了3.3V给整个系统供电了。这时再按下SW1按键,又或者是松开 SW1 按键,已经不会再影响系统的电源的开关了,因为此时已经通过 MCU 控制 Q3 NMOS 管导通了,系统的电源会一直保持导通状态。
而此时按下的 SW1 按键,已经可以作为一个普通按键给 MCU 进行识别了,比如是按下状态,是长按状态等,MCU都可以识别。反正此时可以作为一个普通的用户按键使用。
此时的等效电路图如下:
此处需要 注意的就是 D2 1N5819 二极管的管压降大小 ,需要查看MCU数据手册的低电平阈值标准,如果管压降太大,按键按下 MCU 可能也会不认为是低电平。

5)系统开机之后,SYS_POWER_LOCK控制信号输出低电平

系统开机之后,如果 MCU 检测到 SW1 按键的长按状态(又或者有触摸界面的,可以通过触摸界面关闭系统电源) ,那么 SYS_POWER_LOCK 就输出低电平,此时 Q3 就不导通了。然后这时用户松开 SW1 按键,系统就彻底的断电了,就回到了最前面介绍初始状态 —— 系统断电,SW1按键松开的情况了。

3. 软件设计

软开关电路的设计,相比于硬件而言,软件其实是更简单的,无非就是通过 MCU 控制 SYS_POWER_LOCK 信号的高或者低就可以了。系统开机之后,如果还需要通过检测按键进行关机的,那么还需要检测 SW1 按键的代码。
下面是基于 APM32F411 控制软开关的简单代码示例。
1、控制 SYS_POWER_LOCK 信号代码,从而控制系统的供电开关。
复制
void power_control_gpio_config(void)

{

    GPIO_Config_T gpioConfigStruct;

    

    /* Enable GPIO clock */

    RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);



    gpioConfigStruct.pin   = GPIO_PIN_15;

    gpioConfigStruct.mode  = GPIO_MODE_OUT;

    gpioConfigStruct.speed = GPIO_SPEED_100MHz;

    gpioConfigStruct.otype = GPIO_OTYPE_PP;

    gpioConfigStruct.pupd  = GPIO_PUPD_NOPULL;

    GPIO_Config(GPIOA, &gpioConfigStruct);

    

    GPIO_ResetBit(GPIOA, GPIO_PIN_15);

}



/* 系统开机 */

void power_enable(void)

{

    GPIO_SetBit(GPIOA, GPIO_PIN_15);

}



/* 系统关机 */

void power_disable(void)

{

    GPIO_ResetBit(GPIOA, GPIO_PIN_15);

}
2、检测按键 SW1 按下或者长按的代码,从而决定是否执行关机动作。
复制
static struct Button key1;

static struct Button key2;

static struct Button key3;



void key_gpio_config(void)

{

    GPIO_Config_T gpioConfigStruct;

    

    /* Enable GPIO clock */

    RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOB);



    /* KEY1/2/3 : PB0/1/2 */

    gpioConfigStruct.mode = GPIO_MODE_IN;

    gpioConfigStruct.pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;

    gpioConfigStruct.pupd  = GPIO_PUPD_UP;

    GPIO_Config(GPIOB, &gpioConfigStruct);

}



uint8_t read_key_gpio(uint8_t key_id)

{

    uint8_t temp = 1;

    

    switch(key_id)

    {

        case 0:

            temp = GPIO_ReadInputBit(GPIOB, GPIO_PIN_0);

            break;

        case 1:

            temp = GPIO_ReadInputBit(GPIOB, GPIO_PIN_1);

            break;

        case 2:

            temp = GPIO_ReadInputBit(GPIOB, GPIO_PIN_2);

            break;

        default:

            temp = 1;

            break;

    }

    

    return temp;

}



void key1_callback(void *button)

{

    uint32_t btn_event_val; 

    

    btn_event_val = get_button_event((struct Button *)button); 

    

    switch(btn_event_val)

    {

        case PRESS_DOWN:

            printf("************* key1 press down! *************\n"); 

            break; 

    

        case PRESS_UP: 

            printf("************* key1 press up! *************\n");

            break; 

    

        case PRESS_REPEAT: 

            printf("************* key1 press repeat! *************\n");

            break; 

    

        case SINGLE_CLICK: 

            printf("************* key1 single click! *************\n");

            break; 

    

        case DOUBLE_CLICK: 

            printf("************* key1 double click! *************\n");

            break; 

    

        case LONG_PRESS_START: 

            printf("************* key1 long press start! *************\n");

            LCD_Fill(0,0,LCD_W,LCD_H,BLACK);

            LCD_ShowString(60,LCD_H/2,(uint8_t*)"Shutdown",WHITE,BLACK,32,1); // LCD输出关机提示

            delay_ms(1500);

            power_disable();    // 检测到按键长按,系统关机

            //while (1);

               break; 

    

        case LONG_PRESS_HOLD: 

            printf("************* key1 long press hold! *************\n");

            break; 

    }

}



void multi_button_register(void)

{

    button_init(&key1, read_key_gpio, 0, KEY1_ID);

    button_init(&key2, read_key_gpio, 0, KEY2_ID);

    button_init(&key3, read_key_gpio, 0, KEY3_ID);

    

    button_attach(&key1, (PressEvent)PRESS_UP, (BtnCallback)key1_callback);

    button_attach(&key1, (PressEvent)LONG_PRESS_START, (BtnCallback)key1_callback);

    

    button_start(&key1);

}

4. 效果演示

本来想演示一下做出来的效果,但是还不知道怎么上传视频,后面再补充吧。
以上介绍的软开关电路,我已经把对应的实物电路做出来了,而且经过了测试验证,测试没有发现什么问题,可以正常使用。
不过上面的分析也不一定正确,或者电路有什么缺陷我还没注意到,如果有错误的地方大家一起讨论。

下面是补充的演示效果图:



首先是系统关机状态,然后长按按键开机,然后 MCU 上电运行程序,屏幕输出开机界面提示,并且 MCU 输出控制信号锁住电源,让系统一直保持供电。这时再松开按键,整个系统的供电依然正常。

开机之后,再长按按键,MCU 检测到按键的长按状态,就会 执行关机的操作 ,然后 LCD 界面输出关机提示,用户看到 LCD 已经提示关机了,这时就松开按键,这时整个系统就断电了。
---------------------
作者:luobeihai
链接:https://bbs.21ic.com/icview-3346300-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[APM32F4]基于APM32F411控制的一个软开关电路设计分享 的相关文章

随机推荐

  • 【Lidar】Open3D点云DBSCAN聚类算法:基于密度的点云聚类(单木分割)附Python代码

    1 DBSCAN算法介绍 DBSCAN聚类算法是一种基于密度的聚类算法 全称为 基于密度的带有噪声的空间聚类应用 英文名称为Density Based Spatial Clustering of Applications with Nois
  • Java语言真的跌落神坛了吗?

    Java语言真的跌落神坛了吗 在开始前我有一些资料 是我根据自己从业十年经验 熬夜搞了几个通宵 精心整理了一份 Java的资料从专业入门到高级教程 工具包 点个关注 全部无偿共享给大家 在评论区回复 888 之后私信回复 888 即可拿走
  • 一封来自北京软协的感谢信

    日前 北京软件和信息服务业协会 以下简称北软协 向酷雷曼 北京同创蓝天云科技有限公司 发来感谢信 以 表彰和感谢 同创蓝天对北软协及行业的 全方位支持和卓越贡献 作为北软协理事会会员单位 酷雷曼积极参与各类论坛交流活动 为 行业调研建言献策
  • Netty火热平时却接触不多?1515页Netty学习进阶笔记真香

    Netty 的介绍 Netty 是由 JBOSS 提供的一个 Java 开源框架 现为 Github 上的独立项目 Netty 是一个异步的 基于事件驱动的网络应用框架 用以快速开发高性能 高可靠性的网络IO 程序 Netty 是一个异步的
  • vscode 内置(自带)功能使用

    vscode 搜索 功能 使用正则表达式 参考文章 Justice23 参考文章 熟悉的新风景 转义字符 匹配内容 t tab r 回车符号 r n 换行符号 n 特殊符号转义 如
  • JMeter —— 如何循环使用接口返回的多个值!

    在用JMeter做接口测试的时候 经常会遇到这样一种情况 一个接口请求返回了多个值 然后下一个接口想循环使用前一个接口的返回值 第二种情况 只想循环请求前一个接口返回值中的随机不定长度的某一些值 并不想用全部的 今天 我就和大家讲解一下这两
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证

    public Task InvokeAsync HttpContext context 获取终点路由特性 var endpointFeature context Features Get
  • Web自动化测试流程:从入门到精通,帮你成为测试专家

    摘要 Web应用程序在今天的软件开发中占据着越来越重要的地位 保证Web应用程序的质量和稳定性是非常必要的 而自动化测试是一种有效的方法 本文将介绍Web自动化测试流程 并提供代码示例 步骤一 选取测试工具 选择适合自己团队的自动化测试工具
  • 滚动条样式

    webkit scrollbar 滚动条整体样式 width 10px 高宽分别对应横竖滚动条的尺寸 height 10px webkit scrollbar thumb 滚动条里面小方块 border radius 10px box sh
  • 使用DTS将自建MySQL迁移至PolarDB MySQL引擎,探索DTS全量数据校验

    1 领取免费的ECS和PolarDB资源 一旦您注册了阿里云账号并填写了您的账号和支付信息 您就可以申请免费试用我们的产品 如ECS PolarDB RDS等服务 1 1 申请 ECS 免费试用 1 在 阿里云免费试用中心 找到ECS 单击
  • .NET Core中鉴权 Authentication Authorization

    Authentication 鉴定身份信息 例如用户有没有登录 用户基本信息 Authorization 判定用户有没有权限 使用框架提供的Cookie鉴权方式 1 首先在服务容器注入鉴权服务和Cookie服务支持 services Add
  • 【S025】SpringBoot OA办公管理系统项目源码 办公自动化

    项目标题 SpringBoot OA办公管理系统项目源码 Java毕业设计 项目编号 S025 功能介绍 OA办公自动化系统 使用Maven进行项目管理 基于springboot框架开发的项目 mysql底层数据库 前端采用freemark
  • 如何学好信息安全?大学信息安全专业研发技能表-成为信息安全专业优秀人才

    网络空间安全 信息安全 的重要性这几年被提升到前所未有的高度 国家更是高度重视 并且特批成立了网络空间安全一级学科 各大高校积极申报博士点 硕士点 开设信息安全专业的高校越来越多 那么 对于信息安全专业的大一新生如何学好 可能很多同学都在迷
  • CODESYS的Robotics_PickAndPlace_without_Depictor例程解释

    1 简介 在CODESYS的例程中 有一个例程演示了如何控制delta机械手从一个移动的转盘中拾取一个工件 ring 圆环 然后放到移动的传送带上的托盘 cone 圆锥 中 这个例程在 C Program Files x86 CODESYS
  • 深度学习14—注意力机制与自注意力机制

    注 以下均为个人学习笔记 发布只为方便学习阅读 若觉侵权 请联系删除 1 李沐老师课堂学习理解笔记 1 1 随意线索和不随意线索 1 2 注意力机制 通过注意力池化层来有偏向性的选择某些输入 1 3 注意力池化层 1 3 1 非参数化注意力
  • 手写识别软件哪个好?来试试下面这几款吧

    听说你对手写文字识别软件很感兴趣啊 你就是那个总是在笔记本上写密密麻麻的字 然后又懒得一个个去打字的家伙吧 别担心 这个世界已经听到你的呼唤 手写文字识别技术就是为了解放你的双手费尽心思开发的 现在 让我来告诉你手写文字识别最简单的方法有哪
  • 基于SpringBoot的房屋租赁系统 附源码

    基于SpringBoot的房屋租赁系统 附源码 文章目录 基于SpringBoot的房屋租赁系统 附源码 一 引言 二 系统设计 三 技术架构 四 功能实现 五 界面展示 六 源码获取 一 引言 本文介绍了一个基于SpringBo
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • Qt Quick 工程创建

    一 简介 Qt Quick是Qt框架中的一个模块 用于创建现代 响应式的用户界面 它基于QML Qt Meta Object Language 语言和Qt Quick Controls库 提供了一种声明性的方式来构建用户界面 Qt Quic
  • [APM32F4]基于APM32F411控制的一个软开关电路设计分享

    1 前言 说明 本文介绍的软开关电路 并不是 开关电源 里面的软开关概念 而是系统供电的开关 结合MCU等控制芯片 控制系统供电的开启或关断 在某些电子产品的场合 我们经常会需要用到按键长按进行开机 然后按键长按进行关机 或者按键长按之后有