开机自动关机电路
简介
验证电路实现了按键开机,单片机控制关机功能。
简介:验证电路实现了按键开机,单片机控制关机功能。开源协议
:GPL 3.0
描述
在本文中,我们将向您展示如何构建锁存电源开关电路,也称为自动断电电路。您可以使用此电路自动关闭 ESP32、ESP8266、Arduino 或任何其他微控制器。
该电路允许您在微控制器不执行任何任务时完全切断电源。换句话说,一旦微控制器完成执行任务,它就会通过软件自行关闭。这是使电池在您的电子项目中持续更长时间的好方法。
自动关机电路图
以下电路图显示了锁存电源开关电路(自动断电电路)图。
右侧编号为 1、2 和 3 的端子应连接到您的微控制器板。
- 引脚 1 连接到 5V。
- 引脚 2可以连接到微控制器的任何数字引脚。在我们的示例中,我们将该引脚连接到 GPIO 5 / 数字 5。
- 引脚 3 连接到 GND。
-
自动关机电路的工作原理
1)当您按下开关或闭合电路时,有电到达2N3904晶体管的基极。因此,2N3904 被拉低,将 MOSFET 的栅极 (G) 拉至 GND。
2) P 沟道 MOSFET 在其栅极相对于源极为负时导通。当您按下按钮时,MOSFET 的栅极被拉至 GND,允许电流流向 VIN 引脚,这将为微控制器供电。只要 MOSFET 的栅极被拉至 GND,就会发生这种情况。3)为了在释放按钮后保持 MOSFET 的栅极拉至 GND,我们通过微控制器的 GPIO 发送一个 HIGH 信号。当我们发送一个 HIGH 信号时,有功率到达晶体管的基极。4) 因此,我们确保 MOSFET 的栅极被拉至 GND,电流流向 VIN 端子为我们的微控制器供电。5)当我们想要关闭电路时,我们只需将GPIO设置为LOW即可。发生这种情况时,没有功率到达晶体管的基极,因此 MOSFET 不会让电流流向 VIN 引脚,因此没有功耗。我对电路进行的微小改动, - PCB
- 基于MounRiver Studio的测试代码
- PA1控制GPIO引脚
- PA0控制LED,指示单片机运行状态
-
/********************************** (C) COPYRIGHT *******************************
* File Name : main.c
* Author : WCH
* Version : V1.0.0
* Date : 2020/04/30
* Description : Main program body.
*******************************************************************************//*
*@Note
串口打印调试例程:
USART1_Tx(PA9)。
本例程演示使用 USART1(PA9) 作打印调试口输出。*/
#include "debug.h"
/* Global typedef */
#define LED_ON GPIO_WriteBit(GPIOA, GPIO_Pin_0,0);
#define LED_OFF GPIO_WriteBit(GPIOA, GPIO_Pin_0,1);
#define POWER_ON GPIO_WriteBit(GPIOA, GPIO_Pin_1,1);
#define POWER_OFF GPIO_WriteBit(GPIOA, GPIO_Pin_1,0);
/* Global define *//* Global Variable */
/*********************************************************************
* @fn GPIO_Toggle_INIT
*
* @brief Initializes GPIOA.0
*
* @return none
*/
void GPIO_Toggle_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}/*******************************************************************************
* Function Name : main
* Description : Main program.
* Input : None
* Return : None
*******************************************************************************/
int main(void)
{
u8 i = 0;
u32 cnt=0,offPower;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
GPIO_Toggle_INIT();
POWER_ON;
USART_Printf_Init(115200);
printf("SystemClk:%d\r\n",SystemCoreClock);printf("This is printf example\r\n");
// GPIO_WriteBit(GPIOA, GPIO_Pin_0,0);
while(1)
{
POWER_ON;
Delay_Ms(100);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));
if(cnt==100)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_0,1);
POWER_OFF;
Delay_Ms(20);
cnt=0;
}cnt++;
}
}
评论