IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【STM32】HAL库 CubeMX例程八---按键原理及消抖(附工程源码) -> 正文阅读

[嵌入式]【STM32】HAL库 CubeMX例程八---按键原理及消抖(附工程源码)

前期准备:

  1. STM32CubeMX
  2. STM32RCT6核心板
  3. IDE Keil(MDK-ARM)

什么是按键消抖?

按键消抖通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖

按键工作原理

在这里插入图片描述
这是最基本的按键电路,以KEY1为例:
3.3V流经10k电阻(限流电阻),经过按键再流入地,但是按键常态是松开的,也就是说这条路常态是是断开的,只有当按键按下时,这条路才能走通,才有电流。
那么此时我们引入一个IO口到KEY1的回路中,通过检测IO口的电平,即可知道这个回路是否有电流,即可知道按键是否按下

硬件消抖

硬件消抖一般是在电路硬件设计时考虑进去,提高电平的检测准确度。硬件消抖有很多种,这里我们介绍并联电容消抖法
在这里插入图片描述
电路中按键并联了一个电容。我们知道电容两端电压不能突变

如果把电比作水,电容就像一块海绵,它无法瞬间从瘪变到膨胀,对应电路就是两端电压无法突变,因为电压会给电容充电,充满电后再放电,这个充放电过程的时间由本身参数决定,所以一般采用0.1uf电容即可

因为按键时接触抖动会产生的毛刺电压,由于电容两端电压不能突变,使得按键两端的电压平缓,可以大大提升按键精确度。

软件消抖

光有硬件消抖,大概率能满足大部分情况,但有时候需要更精确的场合,这时就需要软件消抖上场了,何为软件消抖,说白了就是写代码,使得按键判断精确一点

STM32CubeMX部分

1. 配置时钟
在这里插入图片描述
选择STM32F103RCTx系列芯片,配置时钟的同时会自动配置IO口引脚

在这里插入图片描述
将HCLK设置为最大频率72MHz

2. 配置GPIO
在这里插入图片描述
在这里插入图片描述
如图配置

  • PC4设为GPIO_Output模式
  • PB4设为GPIO_Input模式

3. 工程生成
在这里插入图片描述
在这里插入图片描述
工程管理依旧是这几个选项,然后GENERATE CODE,STM32CubeMX部分完成。

Keil部分

未消抖:
在while里写入

if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == 0)
{
	HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
}//按一次翻转一次电平

未消抖效果如图


可以看到未消抖的效果非常差、一次按键被误读多次,严重影响使用体验

消抖:
打开gpio.c文件

/* USER CODE BEGIN 0 */
#define KEY1  HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)//读取按键1
#define KEY2  HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)//读取按键2  
#define KEY3  HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2)//读取按键3
#define KEY4  HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3)//读取按键4

#define KEY1_PRES   1	//KEY1按下
#define KEY2_PRES	2	//KEY2按下
#define KEY3_PRES	3	//KEY3按下
#define KEY4_PRES	4 //KEY4按下
/* USER CODE END 0 */

本篇作为例程我只用了1个按键,一般来说用到了按键,肯定不会只用1个,这里的代码我按照4个按键来写的

接着再写入检测按键函数

/* USER CODE BEGIN 2 */
//按键处理函数
//返回按键值
//0 没有键按下
//1 KEY1按下
//2 KEY2按下
//3 KEY3按下
//4 KEY4按下
//优先响应级别:KEY0>KEY1>KEY2>KEY3
uint8_t KEY_Scan(uint8_t mode)
{	 
	static uint8_t key_up=1;//按键松开标志位
	if(key_up&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))
	{
		HAL_Delay(10);//去抖动
		key_up=0;
		if(KEY1==0)return KEY1_PRES;
		else if(KEY2==0)return KEY2_PRES;
		else if(KEY3==0)return KEY3_PRES;
		else if(KEY4==0)return KEY4_PRES;
	}
	else if(KEY1==1||KEY2==1||KEY3==1||KEY4==1)key_up=1; 	    
 	return 0;//无按键按下
}
/* USER CODE END 2 */

接着回到main.c文件

/* USER CODE BEGIN Includes */
#define KEY1_PRES   1	//KEY1按下
#define KEY2_PRES	2	//KEY2按下
#define KEY3_PRES	3	//KEY3按下
#define KEY4_PRES	4   //KEY4按下
/* USER CODE END Includes */

在while里写入

/* USER CODE BEGIN 3 */			   
	switch(KEY_Scan(0))
	{				 
		case KEY1_PRES:	
			HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
			break;
		case KEY2_PRES:	
			
			break;
		case KEY3_PRES:	
			
		  break;
        case KEY4_PRES:
			
			break;
	}
	/*if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == 0)
	{
		HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
	}*/
  }
  /* USER CODE END 3 */

编译下载时需要选择相对应的下载器,勾选以下
在这里插入图片描述
消抖效果如图


响应准确率100%

链接:本期内容Keil工程
提取码:mrgl

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-20 15:17:19  更:2021-08-20 15:17:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:50:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码