STM32 旋转编码器

 旋转编码器简介

        旋转编码器:用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向

        类型:机械触点式/霍尔传感器式/光栅式

硬件电路

接线图:

代码配置

这里的中断配置与上一章的对射式红外传感器配置一样,只需要改一下引脚,以及通道配置,这里配置了两个引脚,所以需要配置两个中断通道(NVIC),写两个中断函数。

void Encoder_init(void)
{
		//------------------------定义结构体变量-----------------------------------
	
	GPIO_InitTypeDef GPIO_InitStructure;								//定义GPIO结构体变量
	EXTI_InitTypeDef EXTI_InitStructure;								//定义EXTI结构体变量
	NVIC_InitTypeDef NVIC_InitStructure;								//定义NVIC结构体变量
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	//开启AFIO的时钟
	
	//---------------------GPIO配置--------------------------------------
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;			//模式选择上拉输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;   			//配置引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速率
	GPIO_Init(GPIOB,&GPIO_InitStructure);							//GPIO初始化
	
	//---------------------GPIO配置--------------------------------------
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);//将中断线与GPIO引脚连接
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//将中断线与GPIO引脚连接
	//---------------------EXTI配置--------------------------------------
	
	EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1; 					//配置中断线
	EXTI_InitStructure.EXTI_LineCmd =  ENABLE;  					//中断使能
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; 	//选择中断模式
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
	EXTI_Init(&EXTI_InitStructure);
	
	//---------------------EXTI配置--------------------------------------
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组,这里放到模块函数里了,一般情况放在主函数第一行(如上一章按键中断)
	
	//---------------------NVIC配置--------------------------------------
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;				//选择中断通道
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;							//使能中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;		//抢占优先级配置
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;					//响应优先级配置
	
	NVIC_Init(&NVIC_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;				//选择中断通道
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;							//使能中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;		//抢占优先级配置
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;					//响应优先级配置
	
	NVIC_Init(&NVIC_InitStructure);
	
	//---------------------NVIC配置--------------------------------------
	
	
}

中断函数:

        中断函数编程:在中断函数里,不要执行耗时过长的代码,中断函数要简短快速最好不要用delay函数,因为中断时处理突发事情的,如果为了突发的事情在中断函数呆着出不来了,主程序就会收到严重的阻塞

int16_t Encoder_Count;
//返回数据
int16_t Encoder_Get(void)
{
 return Encoder_Count;
 
}


//中断函数
void EXTI0_IRQHandler(void)
{
	//判断中断是否触发
	if(EXTI_GetITStatus(EXTI_Line0) == SET)
	{
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0)
		{
			Encoder_Count--;
		}
		//清除标志位
		EXTI_ClearITPendingBit(EXTI_Line0);
	}
}


void EXTI1_IRQHandler(void)
{
	//判断中断是否触发
	if(EXTI_GetITStatus(EXTI_Line1) == SET)
	{
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) == 0)
		{
			Encoder_Count++;
		}
		//清除标志位
		EXTI_ClearITPendingBit(EXTI_Line1);
	}
	
}

主函数:

#include "Encoder.h"
int main(void)
{
	LED_Init();
	OLED_Init();
	Encoder_init();
	OLED_ShowString(1, 3, "Num:");
	while(1)
    {
	
	
	    OLED_ShowSignedNum(1, 6, Encoder_Get(), 5);
	

    }	
	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/960445.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

javascript格式化对象数组:ES6的模板字符串、map

文章目录 引言I 使用模板字符串格式化对象数组使用ES6的模板字符串可以更方便地格式化对象数组。安装 es6-string-html 扩展II 使用map方法格式化对象数组map基本语法使用数组的map方法格式化III 使用for循环格式化对象数组IV 知识扩展: map 的常见用法和示例转换数组元素提取…

【Linux】磁盘

没有被打开的文件 文件在磁盘中的存储 认识磁盘 磁盘的存储构成 磁盘的效率 与磁头运动频率有关。 磁盘的逻辑结构 把一面展开成线性。 通过扇区的下标编号可以推算出在磁盘的位置。 磁盘的寄存器 控制寄存器:负责告诉磁盘是读还是写。 数据寄存器:给…

文档智能扫描,提升无纸化办公效率

随着无纸化办公的推广和移动设备的普及,用户迫切需要将纸质文档快速、准确地转换成电子格式,以提高工作效率和信息管理的便捷性。同时,用户将文档扫描成电子版后,可以自行通过加密和访问控制提高电子文档的安全性,以满…

【PyTorch】4.张量拼接操作

个人主页:Icomi 在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术,能够处理复杂的数据模式。通过 PyTorch&#xff0…

Cursor 帮你写一个小程序

Cursor注册地址 首先下载客户端 点击链接下载 1 打开微信开发者工具创建一个小程序项目 选择TS-基础模版 官方 2 然后使用Cursor打开小程序创建的项目 3 在CHAT聊天框输入自己的需求 比如 小程序功能描述:吃什么助手 项目名称: 吃什么小程序 功能目标…

Yolo11 + OCR 营业执照识别+信息抽取(预期后续改用其他ocr更简单,推理预计使用onnxruntim加速,分c++和python两种方式部署)

目录 一 数据集制作 1 labelimg的安装与使用 2 标注方式 3 数据集制作 二 模型训练 三 使用Yolo11 + OCR 实现“营业执照”信息解析完整方案 1 cutLinesforcode.py 2 getBusinessLicenseContentPart.py 3 getPartWords.py 4 pdfTojpg.py 5 main.py 本项目可用于毕业…

Python GUI 开发 | PySide6 辅助工具简介

关注这个框架的其他相关笔记:Python GUI 开发 | PySide6 & PyQt6 学习手册-CSDN博客 在上一章中,我们介绍了如何搭建 PySide6 & PyQt6 的开发环境。在搭建环境的时候我们配置了几个几个快捷工具,很多小伙伴可能都不知道是干啥用的。那…

头像生成小程序搭建(免费分享)

如下图为小程序页面的基本效果&#xff0c;下面将介绍该小程序的功能 页面template代码如下&#xff1a; <template><view class"avatar-containner"><block v-if"!showCropper"><image class"pageback" src"../../s…

Java面试题2025-设计模式

1.说一下开发中需要遵守的设计原则&#xff1f; 设计模式中主要有六大设计原则&#xff0c;简称为SOLID &#xff0c;是由于各个原则的首字母简称合并的来(两个L算一个,solid 稳定的)&#xff0c;六大设计原则分别如下&#xff1a; 1、单一职责原则 单一职责原则的定义描述非…

Windows Docker Desktop安装及使用 Docker 运行 MySQL

Docker Desktop是Docker的官方桌面版&#xff0c;专为Mac和Windows用户设计&#xff0c;提供了一个简单易用的界面来管理和运行Docker容器。它集成了Docker引擎&#xff0c;为开发人员提供了一个快速、可靠、可扩展的方式来构建、运行和管理应用。DockerDesktop的优势在于&…

python基础语法(4) ----- 学习笔记分享

目录 Python 使用库 以及 实战的一些案例 1. 标准库 1.1 认识标准库 1.2 使用import导入模块 1.3 代码示例:日期及结算 1.4 代码示例:字符串操作 1.5 代码示例 : 文件查找工具 2. 第三方库 2.1 认识第三方库 2.2 使用pip 2.3 代码示例:生成二维码 (1) 使用搜索引擎,…

Python-基础环境(01) 虚拟环境,Python 基础环境之虚拟环境,一篇文章助你完全搞懂!

Python的虚拟环境是一种工具&#xff0c;它能够创建一个隔离的独立Python环境。每个虚拟环境都有自己独立的Python解释器和安装的包&#xff0c;不会与其他虚拟环境或系统的全局Python环境发生冲突。虚拟环境特别适用于以下情况&#xff1a; 项目隔离&#xff1a;不同的项目可…

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(九)(完结篇)

文章目录 一、成绩查询模块实现1、学生成绩查询功能实现1.1 页面设计1.2 前端页面实现1.3 后端功能实现2、成绩分段查询功能实现2.1 页面设计2.2 前端页面实现2.3 后端功能实现二、试卷练习模块实现三、我的分数模块实现1、 页面设计2、 前端页面实现3、 后端功能实现四、交流区…

Redis --- 分布式锁的使用

我们在上篇博客高并发处理 --- 超卖问题一人一单解决方案讲述了两种锁解决业务的使用方法&#xff0c;但是这样不能让锁跨JVM也就是跨进程去使用&#xff0c;只能适用在单体项目中如下图&#xff1a; 为了解决这种场景&#xff0c;我们就需要用一个锁监视器对全部集群进行监视…

ML基础——分类模型的评估指标

以鸢尾花的分类分析为例&#xff1a; 首先我们对于3类分类做了个数字编码&#xff0c;012对应3个分类&#xff0c; 所以这就是3个分类下的预测结果指标&#xff1a; 分类为0的准确率、召回率、F1-score&#xff0c;以及support 因为前面我们数据集划分为了105 train&#xff…

安装Office自定义项,安装期间出错

个人博客地址&#xff1a;安装Office自定义项&#xff0c;安装期间出错 | 一张假钞的真实世界 卸载PowerDesigner后&#xff0c;打开“WPS文字”时出现下图错误&#xff1a; 解决方法&#xff1a; 按“WinR”快捷键&#xff0c;打开【运行】框&#xff0c;在对话框中输入“re…

Arouter详解・常见面试题

前言&#xff1a;ARouter是一个用于 Android App 进行组件化改造的路由框架 —— 支持模块间的路由、通信、解耦。 一、路由简介&#xff1a; 路由&#xff1a;就是通过互联的网络把信息从源地址传输到目的地址的活动。完成路由这个操作的实体设备就是 路由器&#xff08;Rout…

能量提升法三:赞美

前情回顾&#xff1a; 《能量提升法二&#xff1a;感恩》 片段&#xff1a;“感恩&#xff0c;就像是在跟世界说&#xff1a;谢谢你&#xff0c;我收到了&#xff0c;我很喜欢&#xff0c;请多来点” 把它归还人海&#xff0c;就当作每一个人&#xff0c;都有可能是曾经帮助…

翼星求生服务器搭建【Icarus Dedicated Server For Linux】

一、前言 本次搭建的服务器为Steam平台一款名为Icarus的沙盒、生存、建造游戏,由于官方只提供了Windows版本服务器导致很多热爱Linux的小伙伴无法释怀,众所周知Linux才是专业服务器的唯一准则。虽然Github上已经有大佬制作了容器版本但是容终究不够完美,毕竟容器无法与原生L…

Java编程语言:辉煌的历史与未来前景

如果将软件开发世界比喻成一个宇宙&#xff0c;Java 无疑是其中最亮的星星之一。它从诞生起就改变了软件开发世界的格局。发展到今天&#xff0c;Java仍然是这个世界上最重要的编程语言之一。当然&#xff0c;它也面临着新的挑战。 Java的诞生 回溯到 1991 年&#xff0c;在 …