0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CW32数字电压电流表软件教程(二):按键检测的控制原理解析

jf_qE49KoVBr8 来源:CW32生态社区 作者:CW32生态社区 2024-05-06 15:36 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

3.1.独立按键基础知识

3.1.1.独立按键结构组成

独立按键实际上是一个非自锁的轻触开关,有左右两个触点,当按下时左右两个触点闭合,当松开时左右两个触点断开。

3.1.2.独立按键控制原理

想要使用外部的按键控制单片机有两种比较常见的方法:IO扫描和外部中断。

对于IO扫描的方式而言,需要单片机以比较高的频率去不间断地判断IO口的输入电平,随后根据IO电平来执行后续的逻辑。外部中断的方式会在章节十二中进行详细介绍,本章着重介绍IO扫描的控制方式。(单片机通过检测按键按下前后的高低电平变化,来判断按键是否按下。通过程序的控制,就可以实现不同的功能与设置。机械式按键在按下或者释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。抖动时间长短与开关的机械特性有关,一般为5-10ms。在触点抖动期间检测按键的按下与否,可能会导致判断错误,为了克服机械抖动所产生的影响,必须采取消抖措施,可分为硬件消抖和软件消抖。)

3.1.3.按键亚稳态与按键消抖

对于一个IO而言,在将其配置为输入模式之后,该引脚上的电平受外部电路影响,基本可以分为三种状态:高电平、低电平、浮空。高低电平很好理解,这里说明浮空的意义,浮空就是不对该IO进行任何电气属性的连接,此时该IO上的电平是未知的(虽然从直观感受上来看此时IO电压应该是0,但是空气中会有噪声,电路板上也会有噪声,某些电磁干扰也会充当噪声,所以浮空输入的IO电压实际上是未知的)。

典型的浮空输入型IO电路如图3-1所示:

af2e55d8-0b7a-11ef-a297-92fbcf53809c.png

图3-1 浮空输入IO电路

当开关闭合,IO电压等于VCC电压,当开关断开,IO电压未知,此时IO电压可能会受到不明来源的干扰,如果使用该电路作为IO扫描的电路方案,抗干扰能力会不好,容易造成误触发,故此应用场景下不考虑使用该电路。

和浮空输入相比,比较好的办法是使用上拉电阻或下拉电阻将IO的电压固定下来,带上拉电阻或下拉电阻电路如图3-2所示:

af44e2e4-0b7a-11ef-a297-92fbcf53809c.png

图3-2 上拉电阻(左) 和 下拉电阻(右)电路

上拉电阻可以将IO电压固定在VCC电压,当开关闭合时,IO接地使其电压变为GND电压;下拉电阻可以将IO电压固定在GND电压,当开关闭合时,IO电压其实就是电阻R2的电压,此时R2的电压就是VCC。使用上拉/下拉电阻可以很好地提高IO扫描的抗干扰性能,一般情况这两个电路不会有很大区别,挑一个你喜欢的用就好。

按键通过金属导体的相互接触来控制电信号,由于机械特性,这种接触实际上并不可靠,手指按下按键不代表按键真的闭合且保持稳定,这种情况就是按键抖动,抖动过程中按键控制的信号处于亚稳态,亚稳态的信号不可靠,不能将其作为IO扫描的最终结果,为了获取正确的按键状态,我们需要对按键进行消抖处理,按键消抖大概可以分为两种方式:

硬件消抖:硬件消抖一般会在按键两端并联电容,通过电容的充放电作用将按键按下时的高频振荡吸收掉,当开关处于亚稳态时,IO电压不规则变化,电容会吸收这些不稳定电压进行充电,这对IO电压有平缓的效果,以此达到消抖的目的,硬件消抖电路如图3-3所示。

af54e5f4-0b7a-11ef-a297-92fbcf53809c.png

图3-3 硬件消抖电路

简单的软件消抖:极为简单的软件消抖一般是通过延时的办法来跳过亚稳态阶段,当检测到按键按下时,不会立即去检测电平,而是经过短暂的延时之后,再去检测当前引脚的电平,这能在一定程度上消除亚稳态带来的影响,但需要对按键按下和抬起都进行延时判断才能更为有效。

更好的软件消抖:在监测到IO电平发生变化后的一小段时间内快速采集IO的电平状态,如果这一小段时间内IO电平全都属于有效电平,则认为按键已按下(这种利用数学进行消抖的方式达到了对数字信号的筛选作用,所以他也是一种简易滤波器)。

在条件允许的情况下,硬件消抖的效果会更好,如果PCB没有多余的空间留给这个消抖电容,使用软件消抖同样是一个不错的方案。

3.2.独立按键原理图

CW32F003核心板上一共有两个按键,一个复位和一个用户按键,复位作为单片机的特殊功能,不可以作为按键使用,故只有用户按键可以作为按键使用。 CW32F003核心板关于独立按键的原理图如图3-4所示。

af65d4c2-0b7a-11ef-a297-92fbcf53809c.png

图3-4 CW32F003按键电路

3.3.独立按键驱动流程

通过上面的原理图可以了解到,按键的一端接到了地,另一端接到单片机的PB2引脚上。通过检测PB2引脚的电平状态,判断按键是否按下。当按键松开的时候,PB2检测到的电平为高电平,当按键按下的时候,PB2检测到的电平为低电平。

外部电路不含上下拉电阻,对IO而言是浮空输入,因此需要使用单片机内部的上下拉电阻;电路不含消抖电容,故编程上需要对按键进行软件消抖。

3.4.按键控制LED灯亮灭

3.4.1.配置流程

一般我们使用GPIO的输入功能,都需要有以下几个步骤。

开启GPIO的端口时钟

配置GPIO的模式

配置GPIO的输入

编写消抖函数

从开发板原理图了解到按键接的是单片机的PB2。我们要使能按键就需要配置GPIOB端口。下面我们就以按键连接的PB2进行介绍。

3.4.1.1.开启GPIO的端口初始化

由于时钟的配置在之前的章节已有说明,故不再赘述,我们直接对端口进行初始化。初始化的代码与上文GPIO输出的配置略有不同,完整代码如下:

void Gpio_Init(void)
{
  __RCC_GPIOC_CLK_ENABLE();//打开GPIOC的时钟,PC0控制LED亮灭
  GPIO_InitTypeDef GPIO_InitStruct;
  GPIO_InitStruct.Pins = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.IT = GPIO_IT_NONE;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  GPIO_Init(CW_GPIOC, &GPIO_InitStruct);
        
  __RCC_GPIOB_CLK_ENABLE();//打开GPIOB的时钟,PB2控制按键输入
  GPIO_InitStruct.Pins = GPIO_PIN_2;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;  //没有输入时PB2默认为高电平
  GPIO_InitStruct.IT = GPIO_IT_NONE;
  GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
}
3.4.1.2.编写消抖函数

本次实验采用软件消抖,消抖函数的编写思路为:设置按键检测标志位(Flag_Key),当单片机检测到按键按下,即PB2为低电平时,将标志位置1;在后续的条件判断中如果标志位为1,则检测按键是否松开,若已松开则完成本次判断,认为按键已经按下过一次。这种方式可以不用延时判断,节约软件资源。

完整的按键检测程序如下:
uint8_t Flag_Key;         //按键标志位
extern uint8_t Flag_LED;         //LED显示标志位
void Key_Scan(void)
{
  if(GPIO_ReadPin(CW_GPIOB,GPIO_PIN_2) == GPIO_Pin_RESET)  //检测PB2是否为低电平
    {
          Flag_Key = 1;
    }
  if(Flag_Key)     //接着判断标志位
    {
      if(GPIO_ReadPin(CW_GPIOB,GPIO_PIN_2) == GPIO_Pin_SET)    //如果按键已经松开
        {
          Flag_Key = 0;   //清零标志位,等待下一次按键检测
          if(Flag_LED == 0) Flag_LED = 1; //按键按下该变LED显示标志位的值,由显示标志位控制LED   
          else Flag_LED = 0;
        }
    }
}
3.4.1.3.LED显示函数

在按键按下更改LED显示标志位后,需要根据显示标志位的值来控制LED灯的亮灭。
uint8_t Flag_LED;       


void LED_Init(void)
{
  GPIO_WritePin(CW_GPIOC,GPIO_PIN_0,GPIO_Pin_SET);  //初始化让LED灯处于熄灭状态
}
void LED_Lighting(void)
{
  if(Flag_LED == 1)
    {
      GPIO_WritePin(CW_GPIOC,GPIO_PIN_0,GPIO_Pin_RESET);        //亮
    }
  else 
    {
      GPIO_WritePin(CW_GPIOC,GPIO_PIN_0,GPIO_Pin_SET);       //灭
    }
}
最终主函数里只需要运行相应的初始化函数和上面的函数:
int main()
{
  RCC_Configuration();
  Gpio_Init();
  LED_Init();
   
  while(1)
   {


审核编辑:刘清
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 上拉电阻
    +关注

    关注

    5

    文章

    366

    浏览量

    31553
  • 滤波器
    +关注

    关注

    162

    文章

    8351

    浏览量

    184761
  • 电磁干扰
    +关注

    关注

    36

    文章

    2463

    浏览量

    107612
  • GND
    GND
    +关注

    关注

    2

    文章

    548

    浏览量

    41139
  • 独立按键
    +关注

    关注

    1

    文章

    45

    浏览量

    11994
  • 电压电流表
    +关注

    关注

    0

    文章

    25

    浏览量

    2257
  • CW32
    +关注

    关注

    1

    文章

    281

    浏览量

    1677

原文标题:CW32数字电压电流表软件教程-实验二:按键检测

文章出处:【微信号:武汉芯源半导体,微信公众号:武汉芯源半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CW32 MCU在高频率运行下的系统稳定性的提升方案

    问题,并提出一系列应对措施,包括硬件设计改进和软件优化策略,以确保系统在高频工作环境中的可靠性和持续稳定运行。 具体内容包括: 高频运行对MCU的影响分析: 探讨CW32 MCU在高频率运行时,对电源
    发表于 12-04 08:04

    CW32单片机在智能马桶的应用

    进行调节,提供更加舒适的使用体验。 图1:CW32在智能马桶控制板的应用框图 2.智能冲洗功能控制 CW32单片机通过接收用户的操作指令,进行流量
    发表于 12-04 08:01

    基于芯源CW32 MCU的LED闪烁示例及代码分析

    最近我在项目中使用了芯源的CW32 MCU,这是一款非常适合物联网和低功耗应用的微控制器。在初步学习和使用中,我做了一个简单的LED闪烁实验,通过这篇帖子给大家分享一下代码及相关的配置步骤。 硬件
    发表于 12-04 06:52

    CW32 MCU温度监测应用

    最近,我在项目中使用CW32 MCU,来实现一个简单的温度监测系统。CW32的灵活性和性能让我在这个应用中得心应手。以下是我的实现过程和代码示例。 应用简介本项目通过连接一个温度传感器LM35来实时
    发表于 12-03 08:03

    基于芯源CW32 MCU智能家居照明控制系统设计与实现

    。 定时控制:用户可以设置定时任务,比如晚上自动开启或在预设时间关闭。 手动调节:系统支持本地按键或触摸面板调节,方便在无网络时操作。 代码实现以下是基于CW32 MCU的核心代码,实现了通过PWM
    发表于 12-03 06:06

    基于芯源半导体MCU cw32芯片制作的USB电压电流表

    0.91 oled显示出来。本USB电压电流表为宽电压设计,支持4.2V到40宽电压输入,相比较于传统4.2V-40V稳压芯片有更多的好处。还使用芯源半导体MCU cw32芯片充当整个
    发表于 12-02 06:39

    cw32 systick怎么用?

    cw32 systick怎么用
    发表于 12-01 08:10

    CW32嵌入式软件开发的必备知识

    嵌入式软件开发作为计算机科学和电子工程的交叉领域,要求开发人员具备一系列的专业知识和技能。 而基于CW32的嵌入式软件开发必备知识包括以下部分: 1 、编程语言 熟练掌握C(C++)语言,这是
    发表于 11-28 07:48

    deepseek来分析CW32单片机的特点

    国产化优势 作为国产单片机,CW32系列在供应链安全、技术支持、成本控制等方面具有优势。 提供本地化的技术支持和文档资源。 典型型号示例 CW32F030:基于Cortex-M0,适合成本敏感型
    发表于 11-26 06:33

    使用芯源CW32CW32L012开发评估板做了spi屏幕驱动

    CW32生态社区以极高的性价比入手了这块CW32L012开发评估板,开发板以底板、核心板、1.77寸TFT显示屏构成,所有的IO口都引出了排针,这点好评,使用杜邦线可以非常方便的连接其他模块。引脚
    的头像 发表于 11-21 11:34 296次阅读
    使用芯源<b class='flag-5'>CW32</b>的<b class='flag-5'>CW</b>32L012开发评估板做了spi屏幕驱动

    CW32 MCU用什么IDE开发?

    推荐使用IAR Embedded Workbench for ARM、Keil μVision for ARM等IDE开发CW32 MCU应用,其中新版本IAR EWARM直接支持CW32 MCU,Keil MDK-ARM则需要安装CW
    发表于 11-12 07:52

    CW32 MCU有哪些系列?

    目前CW32 MCU有通用高性能MCU、安全低功耗MCU、无线射频MCU等3个系列。其中射频MCU集成了无线收发器,主要包括CW32R031(2.4GHz BLE-Lite)系列和CW32W031(Sub-1G)系列。
    发表于 11-12 07:34

    CW32 MCU的工作电压、工作温度是多少?

    CW32通用型MCU工作电压是1.65V~5.5V,射频MCU工作电压则是1.8V/2.2V~3.6V;通用型CW32F系列MCU,比如:CW
    发表于 11-12 06:49

    CW32 MCU用什么仿真器开发?

    理论上各主流IDE枚举的、支持ARM Cortex内核的所有硬件仿真器,比如:J-LINK,ULINK,DAP,ST-Link等,都可以仿真、下载CW32 MCU的应用代码。如果想实现量产或者离线下载应用代码,则必须配套支持CW32 MCU的PC端
    发表于 11-12 06:01

    CW32电机控制基础--无刷电机无位置传感器的转子位置检测技术

    无位置传感器的无刷直流电机的位置估计方法可以从5个方面来论述:反电动势法、电流法、状态观测器法、人工智能法和磁链法。这几种方法的研究相对比较成熟,且都已得到一定程度的应用。CW32生态社区在方波控制的相关应用和Demo中多使用反
    的头像 发表于 10-09 17:06 3203次阅读
    <b class='flag-5'>CW32</b>电机<b class='flag-5'>控制</b>基础--无刷电机无位置传感器的转子位置<b class='flag-5'>检测</b>技术