STM32F103C8T6驱动旋转编码器模块

下图是这次使用的旋转编码器模块
在这里插入图片描述

STM32F103C8T6驱动旋转编码器模块

  • 产品说明
  • 使用测试
  • 硬件连接
  • 代码如下
    • main.c
    • rotary_encoder.h.c
    • rotary_encoder.h.h
  • 脉冲数和正反转演示图
  • 工程文件

产品说明

旋转编码器可通过旋转,可以计数正方向和反方向 转动过程中输出脉冲的次数,旋转计数不像电位计, 这种转动计数是没有限制的。配合旋转编码器上的 按键,可以复位到初始状态,即从0开始计数。

使用测试

增量式编码器:因为通过检测脉冲的数量和方向来确定旋转的角度和方向。每个脉冲代表一个固定的角度变化,通常有A相和B相两个信号输出,可以通过脉冲的相位差来确定旋转方向。
所以我就先直接拿逻辑分析仪测试了一下,将+接到3.3V或者5V,将GND接到地。将SW,DT,CLK接到逻辑分析仪端口,效果如图所示。
在这里插入图片描述
可以清晰的看出来规律,正转DT下降沿CLK=0,DT上升沿CLK=1。反转DT下降沿CLK=1,DT上升沿CLK=0。SW按下为低电平,所以利用这点就可以编写代码了。

硬件连接

接线如下所示

STM32编码器
3.3V+
GNDGND
PB12SW
PB13DT
PB14CLK

代码如下

功能:串口打印出脉冲数和正反转和SW的状态
使用说明:由于有些文件没有给,自行补充uart打印和引用bool的头文件

main.c

#include "system.h"int main()
{system_init();//USER_LED_Set(1);while(1){if(SW_Get()==0){//USER_LED_Set(0);printf("编码器被按下\r\n");while(SW_Get()==0);}//else USER_LED_Set(1);}
}

rotary_encoder.h.c

#include "rotary_encoder.h"/*
PB12 -- SW
PB13 -- DT
PB14 -- CLK
*/
void rotary_encoder_init(void)
{RCC->APB2ENR|=(1<<3); //使能GPIOB时钟//初始化PB12 PB13 PB14 上拉输入GPIOB->CRH &=0xf000ffff; GPIOB->CRH |=0x08880000; GPIOB->ODR |=(7<<12);//初始化PB13 PB14 SW 上拉输入RCC->APB2ENR|=(1<<0); //开启AFIO时钟AFIO->EXTICR[3] |=(1<<4); //选择EXTI13外部中断的输入源为GPIOB13
//	AFIO->EXTICR[3] |=(1<<8); //选择EXTI14外部中断的输入源GPIOB14EXTI->FTSR |=(1<<13);//EXTI13下降沿引起中断EXTI->RTSR |=(1<<13);//EXTI13上升沿引起中断
//	EXTI->FTSR |=(1<<14);//EXTI14下降沿引起中断EXTI->IMR |=(1<<13);//打开EXTI13中断
//	EXTI->IMR |=(1<<14);//打开EXTI14中断NVIC->ISER[1] |=(1<<8);//启用EXTI10-15中断NVIC->IP[40] &=0x00; //清空优先级NVIC->IP[40] |=((0X03<<4)|0X03);//抢占优先级和响应优先级
}bool positive_status=0;
bool reversal_status=0;
uint16_t positive_num=0;
uint16_t reversal_num=0;
void EXTI15_10_IRQHandler(void)
{if(EXTI->PR&(1<<13)){if(!(GPIOB->IDR&(1<<13))) //下降沿触发{if(CLK_Get()==0)positive_status=1;else reversal_status=1;}else //上升沿触发{if((CLK_Get()==1)&&(positive_status==1)){positive_status=0;positive_num++;printf("正转\r\n");printf("正转脉冲数:%d\r\n",positive_num);}if((CLK_Get()==0)&&(reversal_status==1)){reversal_status=0;reversal_num++;printf("反转\r\n");printf("反转脉冲数:%d\r\n",reversal_num);}			}EXTI->PR|=(1<<13); //清除中断标志位}
}

rotary_encoder.h.h

#ifndef __rotary_encoder_h_
#define __rotary_encoder_h_#include "system.h"/*
PB12 -- SW
PB13 -- DT
PB14 -- CLK
*///SW
#define SW_Get() (((GPIOB->IDR)&(1<<12))?1:0)
//DT
#define DT_Get() (((GPIOB->IDR)&(1<<13))?1:0)
//CLK
#define CLK_Get() (((GPIOB->IDR)&(1<<14))?1:0)void rotary_encoder_init(void);#endif

脉冲数和正反转演示图

在这里插入图片描述

工程文件

代码百度云版

代码CSDN版

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6-Rhodamine 6G NH2,氨基罗丹明6G,具有高荧光性质的罗丹明家族染料之一

6-Rhodamine 6G amine&#xff0c;6-Rhodamine 6G NH2&#xff0c;氨基罗丹明6G&#xff0c;具有高荧光性质的罗丹明家族染料之一 文章关键词&#xff1a;6-Rhodamine 6G amine&#xff0c;6-Rhodamine 6G NH2&#xff0c;氨基罗丹明6G 一、基本信息 产品简介&#xff1a;6-…

代码随想录算法训练营DAY20 | 二叉树(7) (续)

一、LeetCode 236 二叉树的最近公共祖先 题目链接&#xff1a;236.二叉树的最近公共祖先https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/ 思路&#xff1a;利用后序遍历是天然回溯过程、方便实现自底向上查找的原理&#xff0c;递归寻找公…

C++11重要特性总结

C11特性 1.统一列表初始化{}使用原理 2. 声明关键字 auto关键字 decltypenullptr 3. 范围for5. stl增加的容器6. 右值引用左值和右值的区分左值和右值引用场景移动构造移动赋值 右值引用move()完美转发forward()模板中的万能引用forward作用 7. 新的类成员函数移动构造移动赋值…

数据结构中线性表简述

线性表是数据结构中最简单、最常用的一种结构&#xff0c;它是由一组具有相同数据类型的元素组成的数据集合。线性表中的元素之间存在顺序关系&#xff0c;每个元素都有一个前驱元素和一个后继元素&#xff0c;除了第一个元素没有前驱元素&#xff0c;最后一个元素没有后继元素…

ThreadLocal(2):运用场景

通过上一章介绍&#xff0c;我们已经基本了解ThreadLocal的特点。但是它具体是运用在什么场景中呢&#xff1f; 接下来让我们看一个案例&#xff1a; 事务操作。 1 转账案例 1.1 场景构建 ​ 这里我们先构建一个简单的转账场景&#xff1a; 有一个数据表account&#xff0c;…

Vue | (二)Vue组件化编程 | 尚硅谷Vue2.0+Vue3.0全套教程

文章目录 &#x1f4da;模块与组件、模块化与组件化&#x1f4da;非单文件组件&#x1f407;基本使用&#x1f407;关于组件的几个注意点&#x1f407;组件的嵌套 &#x1f4da;单文件组件&#x1f407;一个.vue 文件的组成&#x1f407;实例 学习链接&#xff1a;尚硅谷Vue2.0…

【洛谷题解】B2034 计算 2 的幂

题目链接&#xff1a;计算 2 的幂 - 洛谷 题目难度&#xff1a;入门 涉及知识点&#xff1a;pow函数返回值 题意&#xff1a; 分析&#xff1a;用pow计算再强制转换即可 AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int main(){int a;ios::syn…

初始回溯算法

回溯算法一般用于对数据枚举后选取符合条件的结果并最终返回结果集的问题&#xff0c;之所以叫回溯法&#xff0c;是因为它可进可退 要想理解回溯的本质&#xff0c;还是要通过具体的题目去学习。 路径问题 https://www.nowcoder.com/practice/b736e784e3e34731af99065031301b…

GZ036 区块链技术应用赛项赛题第9套

2023年全国职业院校技能大赛 高职组 “区块链技术应用” 赛项赛卷&#xff08;9卷&#xff09; 任 务 书 参赛队编号&#xff1a; 背景描述 随着异地务工人员的增多&#xff0c;房屋租赁成为一个广阔是市场&#xff1b;目前&#xff0c;现有技术中的房屋租赁是由…

Git 客户端可视化工具tortoisegit

Git 使用教程 git一点通 (kdocs.cn) 二、Git 客户端可视化工具-推荐 1.常用工具 tortoisegit 官网 https://tortoisegit.org/ 推荐 sourcetree 官网 https://www.sourcetreeapp.com/ 2.tortoisegit安装 2.1 下载安装包 2.2 下载语言包 2.3 安装 2.4 安装语言包 5.使用 5.1 新建…

strongswan教程

在 CentOS 7 上使用 StrongSwan 5.7.2 建立 IPSec VPN 连接&#xff0c;可以按照以下步骤进行配置&#xff1a; 准备3台服务器&#xff1a; A:192.168.3.209&#xff0c;私网172.18.1.0/24 B:192.168.3.29&#xff0c;私网172.18.2.0/24 C:192.168.3.154&#xff0c;私网10…

LeetCode--代码详解 104. 二叉树的最大深度

104. 二叉树的最大深度 题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&…