STM32 旋转编码器

ops/2025/2/3 18:33:30/

 旋转编码器简介

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

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

硬件电路

接线图:

代码配置

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

相关文章

pandas(三)Series使用

一、Series基础使用 import pandasd {x:100,y:200,z:300} s1 pandas.Series(d) #将dict转化为Series print(s1)print("") l1 [1, 2, 3] l2 [a, b, c] s2 pandas.Series(l1, indexl2) #list转为Series print(s2)print("") s3 pandas.Series([11…

非根目录部署 nextjs 项目,资源文件 请求404 的问题

最近在学习next项目编写的代码放到服务器上静态资源404 先分析问题 到服务器上查看是有资源目录的是不是项目配置有问题是不是nginx配置有问题 经过排查1和2是没有问题的目前来看只有3 检查一下nginx配置 尝试着把静态资源的配置禁用 问题解决 我的next项目用的是pm2管理…

Josephus Problem II CSES - 2163

有3种方法 Solution 1 - ordered_set Utilizing the ordered_set This data structure is an extension of the general set in C. It allows searching for the K-th smallest element in O(log n) time complexity. #include <iostream> using namespace std; #…

【大数据技术】教程01:搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell)

搭建完全分布式高可用大数据集群&#xff08;VMwareCentOSFinalShell&#xff09; 资源下载 VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.isoFinalShell 4.5.12 注&#xff1a;请在阅读本篇文章前&#xff0c;将以上资源下载下来。 写在前面 本章主要介…

C# 装箱和拆箱(以及 as ,is)

装箱&#xff08;Boxing&#xff09;是指将值类型转换为引用类型的过程 拆箱&#xff08;Unboxing&#xff09;是将引用类型转换回值类型的过程。 int a 1;object b a; //装箱object obj 10;int num (int)obj; //拆箱ArrayList list new ArrayList();list.Add(123);//装箱…

告别页面刷新!如何使用AJAX和FormData优化Web表单提交

系列文章目录 01-从零开始学 HTML&#xff1a;构建网页的基本框架与技巧 02-HTML常见文本标签解析&#xff1a;从基础到进阶的全面指南 03-HTML从入门到精通&#xff1a;链接与图像标签全解析 04-HTML 列表标签全解析&#xff1a;无序与有序列表的深度应用 05-HTML表格标签全面…

python3+TensorFlow 2.x 基础学习(一)

目录 TensorFlow 2.x基础 1、安装 TensorFlow 2.x 2、TensorFlow 2.x 基础概念 2、1 Eager Execution 2、2 TensorFlow 张量&#xff08;Tensor&#xff09; 3、使用Keras构建神经网络模型 3、1 构建 Sequential 模型 3、2 编译模型 1、Optimizer&#xff08;优化器&a…

ROS-SLAM

基本概念 SLAM 即 Simultaneous Localization and Mapping&#xff0c;中文名为同时定位与地图构建&#xff0c;是机器人、自动驾驶、增强现实等领域中的关键技术。 在未知环境中&#xff0c;搭载特定传感器的主体&#xff08;如机器人、无人机等&#xff09;在运动过程中&am…