STM32 旋转编码器

devtools/2025/2/4 21:24:49/

 旋转编码器简介

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

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

硬件电路

接线图:

代码配置

这里的中断配置与上一章的对射式红外传感器配置一样,只需要改一下引脚,以及通道配置,这里配置了两个引脚,所以需要配置两个中断通道(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);}	}


http://www.ppmy.cn/devtools/156097.html

相关文章

数据结构--栈

栈的基本概念 1.栈的概念 栈(Stack):是限制在表的一端进行插入和删除操作的线性表。又称为后进先出LIFO (Last In First Out)或先进后出FILO (First In Last Out)线性表。 栈顶(Top):允许进行插入、删除操作的一端,又称为表尾。用栈顶指针(…

Kotlin 2.1.0 入门教程(九)

类型检查和转换 在 Kotlin 中,可以执行类型检查以在运行时检查对象的类型。类型转换能够将对象转换为不同的类型。 is 和 !is 操作符 要执行运行时检查以确定对象是否符合给定类型,请使用 is 操作符或其否定形式 !is。 if (obj is String) {print(ob…

计算机网络——流量控制

流量控制的基本方法是确保发送方不会以超过接收方处理能力的速度发送数据包。 通常的做法是接收方会向发送方提供某种反馈,如: (1)停止&等待 在任何时候只有一个数据包在传输,发送方发送一个数据包,…

caddy2配置http_basic用于验证用户名密码才允许访问页面

参考: basicauth (Caddyfile指令) — Caddy v2中文文档 1,查看caddy是否已经包含了Basic Auth插件 命令:caddy list-modules | grep http_basic 如果显示: http.authentication.providers.http_basic 则代表包含 Basic Auth 模…

linux下ollama更换模型路径

Linux下更换Ollama模型下载路径指南   在使用Ollama进行AI模型管理时,有时需要根据实际需求更改模型文件的存储路径。本文将详细介绍如何在Linux系统中更改Ollama模型的下载路径。 一、关闭Ollama服务   在更改模型路径之前,需要先停止Ollama服务。…

《程序人生》工作2年感悟

一些杂七杂八的感悟: 1.把事做好比什么都重要, 先树立量良好的形象,再横向发展。 2.职场就是人情世故,但也不要被人情世故绑架。 3.要常怀感恩的心,要记住帮助过你的人,愿意和你分享的人,有能力…

Java基础知识总结(二十六)--Arrays

用于操作数组对象的工具类&#xff0c;里面都是静态方法。 asList方法&#xff1a;将数组转换成list集合。 String[] arr {"abc","kk","qq"}; List<String> list Arrays.asList(arr);//将arr数组转成list集合。 将数组转换成集合&am…

OpenAI推出Deep Research带给我们怎样的启示

OpenAI 又发新产品了&#xff0c;这次是面向深度研究领域的智能体产品 ——「Deep Research」&#xff0c;貌似被逼无奈的节奏… 在技术方面&#xff0c;Deep Research搭载了优化后o3模型并通过端到端强化学习在多个领域的复杂浏览和推理任务上进行了训练。因没有更多的技术暴露…