您现在的位置是:首页 > 数字电源 > 技术解析

STM8S单片机入门2(关机模式开关机按钮)

时间:2017-09-06 来源:

开关机功能是使用电池供电系统的最基本功能。如果使用机械式开关(2段拨动开关,自锁开关等)等直接接通和切断电源,不说机械部件的可靠性,至少自动关机(一般在长时间不操作、电池电量低时需要自动关机)功能就比较难实现。所以电池供电系统一般采用按钮开关,用一个按钮配合软件实现按一次开机、再按一次关机的功能及自动关机的功能。

这部分内容就讲述如何在上实现一键式的开关机功能。开关机功能要使用单片机的一个引脚(PD4)作为输入端,连接到按钮,接收按纽按下产生的电信号,然后再使用另一个引脚(PD3)作为输出端去驱动由三极管8550构成的一个电子开关实现对系统电源的控制。而STM8S单片机本身就直接接在电池上,利用单片机的停机模式,将单片机本身的电流降低到μA级,对电池的消耗就可以忽略不计了。

1、电路设计

电路图如下,C1是STM8S单片机VCAP电容,保持内部1.8V电压的稳定,是STM8S单片机唯一必须接要的外部元件,选用容量为1μF的瓷片电容,而且从电路可靠性讲,这个电容越靠近单片机IC越好。

K1是按钮,一端接到单片机的PD4引脚上,另一端接地,这样按钮被按下就会产生一个低电平的脉冲。

Q1是三极管,通过发光二极管D1和限流电阻R1接到单片机的PD3上。这样当PD3输出低电平时,Q1导通,VCC上有电压,可以对系统供电,反之PD3输出高电平时,Q1截止VCC没有电压。

发光二极管D1还兼作电源指示灯的作用, Q1导通时发光反之不发光。

剩余的C2~C5都是电源退藕电容,用于消除电源上的干扰信号。P1、P2两个接线端分别接3.6V锂电池的正负极。

 

 

2、软件设计

软件要实现的功能是,在PD4引脚上监控按钮按下产生的低电压脉冲信号,并根据这个信号来设置PD3引脚的输出电平去控制Q1的导通和截止,以及设置单片机自身的工作状态,以此实现对电源供电的控制。

1)引脚工作模式设置

首先要做的,就是设置单片机引脚的工作模式,把PD4设置为输入模式,D3设置为输出模式。

在STM8S_StdPeriph_Lib库中,可以使用这个函数进行设置:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, GPIO_Mode_TypeDef GPIO_Mode)

GPIOx是端口编号,取值有GPIOA、GPIOB、GPIOC、GPIOD,分别对应单片机的PAx、PBx、PCx、PDx端口,GPIO_Pin是引脚编号,取值有GPIO_PIN_1~GPIO_PIN_7,函数通过GPIOx和GPIO_Pin两个参数指定一个唯一的引脚。

GPIO_Mode是工作模式了。表示输入模式的取值有四种,分别是要不要上拉,要不要中断的四种组合:

GPIO_MODE_IN_FL_NO_IT Input floating, no external interrupt

GPIO_MODE_IN_PU_NO_IT Input pull-up, no external interrupt

GPIO_MODE_IN_FL_IT Input floating, external interrupt

GPIO_MODE_IN_PU_IT Input pull-up, external interrupt

要上拉的话,单片机内部会自动为引脚提供一个上拉电流,在没有外部输入的情况下,引脚就是高电平了。

表示输出模式的取值有8种,分别是是否开漏输出、输出高低电平、是否高速输出的组合:

GPIO_MODE_OUT_OD_LOW_FAST Output open-drain, low level, 10MHz

GPIO_MODE_OUT_PP_LOW_FAST Output push-pull, low level, 10MHz

GPIO_MODE_OUT_OD_LOW_SLOW Output open-drain, low level, 2MHz

GPIO_MODE_OUT_PP_LOW_SLOW Output push-pull, low level, 2MHz

GPIO_MODE_OUT_OD_HIZ_FAST Output open-drain, high-impedance level,10MHz

GPIO_MODE_OUT_PP_HIGH_FAST Output push-pull, high level, 10MHz

GPIO_MODE_OUT_OD_HIZ_SLOW Output open-drain, high-impedance level, 2MHz

GPIO_MODE_OUT_PP_HIGH_SLOW Output push-pull, high level, 2MHz

在这个应用中,需要把PD4设置为带上拉(因为按钮未按下时要呈高电平)、有中断的输入模式。开机时,PD3要设置为低电平的输出模式(低电平才能让Q1导通)。关机时PD3要设置为不带上拉的输入模式,所以这部分代码要这样写:

GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_IN_PU_IT); //PD4设置为带上拉、有中断的输入模式

GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST); //开机时把PD3设置低电平的输入模

GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_IN_FL_NO_IT);//关机时把PD3设置低电平的输入模式

额外提一下,除了GPIO_Init函数可以设置引脚是输出高电平还是低电平,还可以用下面四个函数继续引脚的高低电平:

void GPIO_Write(GPIO_TypeDef* GPIOx, uint8_t PortVal) //输出PortVal指定的电平

void GPIO_WriteHigh(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins) //输出高电平

void GPIO_WriteLow(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins) //输出低电平

void GPIO_WriteReverse(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins) //高低电平翻转一次

2)停机模式设置

STM8S单片机有停机模式,在停机模式下,单片机功耗降到最低,所有时钟停止工作,但可以保留RAM和寄存器的值,停机模式只能可以通过下面几种方式退出:

-外部中断(GPIO)

-CAN接收中断

-SPI传输结束

-I2C中断(从地址匹配)

-复位

通过执行HALT指令,也就是执行库函数的halt()函数进入停机模式。

3)设置外部中断

外部中断通过SetExtIntSensitivity函数设置:

void EXTI_SetExtIntSensitivity(EXTI_Port_TypeDef Port, EXTI_Sensitivity_TypeDef SensitivityValue)

其中Port是要设置外部中断的端口,取值有GPIOA、GPIOB、GPIOC、GPIOD,分别对应单片机的PAx、PBx、PCx、PDx端口;

SensitivityValue是外部中断类型,有以下几种取值,分别表示下降沿和低电平触发中断、上升沿触发中断、下降沿触发中断、上升沿和下降沿触发中断:

EXTI_SENSITIVITY_FALL_LOW Interrupt on Falling edge and Low level

EXTI_SENSITIVITY_RISE_ONLY Interrupt on Rising edge only

EXTI_SENSITIVITY_FALL_ONLY Interrupt on Falling edge only

EXTI_SENSITIVITY_RISE_FALL Interrupt on Rising and Falling edges

在这个应用中,按钮按下是产生下降沿,要选取EXTI_SENSITIVITY_FALL_ONLY模式。

设置中断模式后,还需要启用中断,使用enableInterrupts()函数启用。

4)外部中断处理程序

ST官方提供的STM8S_StdPeriph_Lib库自带的模板中,中断处理程序都在stm8s_it.c中实现。stm8s_it.c中已经根据中断向量设置好了每种中断处理程序的入口函数。只需在相应函数中填入内容即可。

这个应用中是要编写GPIOD端口的外部中断处理函数,所以要在这个中

这个应用中是要编写GPIOD端口的外部中断处理函数,所以要在这个中断处理函数中增加开关机的内容:

INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)

{

}

5)整体程序设计和源代码

单片机程序流程图如下,包含主程序main()的流程和stm8s_it.c的外部中断处理程序流程:

 

 

具体源代码如下,关键点前面已经介绍,就不再详细说明了:

A)main.c的源代码:

void Delay(uint16_t nCount)//定义延时函数,FFFF大约是0.2s

{

while (nCount != 0)

{

nCount--;

}

}

bool fPowerOn_flag =FALSE;//定义开关机标志

void main(void)

{

GPIO_Init(GPIOD,GPIO_PIN_4,GPIO_MODE_IN_PU_IT);

EXTI_SetExtIntSensitivity(EXTI_PORT_POWER_KEY,EXTI_SENSITIVITY_FALL_ONLY);

enableInterrupts();

while (1)

{

if(fPowerOn_flag == FALSE)

{

GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_IN_FL_NO_IT);//PD3脚设置为输入模式,Q1截止

halt();//进入停机模式

}else

{

GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);//PD3脚设置为输出模式且为低电平,Q1导通

///////

//插入用户自定义的代码

//////

}

}

}

B)stm8s_it.c的源代码:

void Delay(uint16_t nCount); //Delay函数在main.c中定义

extern bool fPowerOn_flag; //fPowerOn_flag在main.c中定义,所以这里要声明成外部变量

INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)

{

Delay(6000); //延时消抖

if(!GPIO_ReadInputPin(GPIOD, GPIO_PIN_3))//判断是不是按钮被按下

{

if(fPowerOn_flag)

{

fPowerOn_flag=FALSE;

}else

{

fPowerOn_flag=TRUE;

}

}

}

3、关机后实测结果

使用STM8S开发板实测关机电流,为40μA左右:

 

 

按18650锂电池的典型容量2500mah计算,关机后可以支持2500mah/0.04ma/24小时/365天=7.1年,已经超过电池的充电循环使用寿命了,基本可以接受,不过应该还没有达到最低值,还可以研究Datasheet,继续优化软件,进一步减低关机电流。

4、总结

开关机部分就讲完了,最后总结一下,这部分学习到的知识点包括:

1、单片机硬件设计,至少需要一个VCAP电容接到VCAP引脚和地之间,选用容量为1μF的瓷片电容,电在路布局上,这个电容越靠近单片机IC越好。

2、设置各个引脚的输入、输出模式设置方法

3、进入和退出停机模式的方法

4、设置外部中断和中断处理程序

换一批

延伸阅读

[趣科技] 3D打印“智能瓶盖”:判断牛奶新不新鲜

3D打印“智能瓶盖”:判断牛奶新不新鲜

3D打印在短短的时间里便取得了不少令人惊讶的成就:3D打印的桥、3D打印的建筑物、甚至3D打印的脑支架。然而这回,3D打印技术达成了一个新成就,且其潜在的应用价值非常广。研究人员首次得以证明:3D打印能够生产出功能正常的电子元件,包括电阻器......

关键字:电子元件 电容器 建筑物 电阻器 传感器

[趣科技] 单片机物语

单片机物语

  通用运动控制技术现状、发展及其应用:运动控制技术的发展是制造自动化前进的旋律,是推动新的产业革命的关键技术。运动控制器已经从以单片机或微处理器作为核心的运动控制器和以专用芯片(ASIC)作为核心处理器的......

关键字:单片机 微型处理机

[疯狂史] 英特尔第一款完整的商业处理器已经44岁了

英特尔第一款完整的商业处理器已经44岁了

英特尔于1971年11月15日宣布了4004处理器及其芯片集,它是芯片巨人第一个完整的单片机和第一个商业微处理器。4004处理器有2300个晶体管,手指甲大小,计算性能与第一代电子计算机相当,但第一代计算机需要占据整间房......

关键字:英特尔 处理器 单片机

[新鲜事] 超级电容:德研究院利用混合氰化物发布新材料

超级电容:德研究院利用混合氰化物发布新材料

超级电容(Supercapacitors)能快速充电的特性,可应用在全电动公车、电动车,甚至是穿戴式设备,相关材料的研究也持续进行,德国莱布尼兹新材料研究院(Leibniz Institute for New Materials,INM)......

关键字:德国 超级电容

[资讯] 中科院成功研制硫掺杂石墨烯基柔性全固态超级电容器

中科院成功研制硫掺杂石墨烯基柔性全固态超级电容器

近日,中国科学院合肥物质科学研究院等离子体物理研究所博士王奇和南京师范大学教授韩敏课题组合作,在高性能杂原子掺杂石墨烯基纳米结构的规模化制备及其在柔性全固态超级电容器应用方面取得新进展。 ......

关键字:超级电容器 石墨烯

[资讯] 基美电子推出小型0603 EIA封装尺寸的静电放电(ESD)额定陶瓷电容器

基美电子推出小型0603 EIA封装尺寸的静电放电(ESD)额定陶瓷电容器

基美电子(KEMET),现已推出小型0603 EIA封装尺寸(公制1608)的静电放电(ESD)额定陶瓷电容器,从而为设计人员提供了适用于需要Class-II或Class-I稳定性和抗噪声性能的电路的X7R或C0G电介质新选择。该器件提供汽......

关键字:基美电子 陶瓷电容器

[资讯] 真正超级电容:充电数秒让手机续航数日

真正超级电容:充电数秒让手机续航数日

超级电容能快充的秘密是因为它能在物料表面用静电储存电力,而不是像传统电池般通过化学反应。这做法需要拥有极大表面面积的「二维」物料来存放大量电子。而在一些类似的研究中,包括电动车厂 Henrik Fisker 和 UCLA 都选择以石墨来充当......

关键字:超级电容
发表评论 共有条评论
用户名: 验证码:

一款经济实用LED应急灯原理电路图

一款经济实用LED应急灯原理电路图

铅酸蓄电池的电极是由铅和铅的氧化物构成,电解液是硫酸的水溶液。主要优点是电压稳定……

简单实用的白光LED手电筒电路图

简单实用的白光LED手电筒电路图

本文所介绍的简单实用的白光LED手电筒电路,是使用一节1.2V/2500mAhr镍镉电池供电如下……

LED彩灯串电路图

LED彩灯串电路图

该装置的电路工作原理如图所示,它是由时钟脉冲发生器、计数器/分配器、延时触发电路、……

项目外包