旋转编码器原理(超简单)

news2024/11/23 17:05:40

波形图

A相和B相的状态变化与旋转方向有关。当顺时针旋转时,A相引脚会先变化,然后是B相引脚。而逆时针旋转时,B相引脚会先变化,然后是A相引脚

这是两个引脚的实际波形采样,越密集的旋转的越快
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

可以发现特点,不管转得多快多慢,都是其中一个引脚先出现上升沿和下降沿

代码编写

单片机型号:GD32F103C8T6

逻辑:上升沿触发中断,在中断中检测本引脚为高电平时另一个是否为高/低电平
结合代码则在下图波形1中在蓝色波形为高电平时检测绿色波形是否为高电平,是则+1,波形2中在蓝色波形为高电平时检测绿色波形是否为低电平,是则+1,都是检测后面的那一段电平

在这里插入图片描述

#include "ec11.h"
#include "led.h"

/*
*   函数内容:初始化EC11引脚,DE与B引脚与普通引脚一样
*   函数参数:无
*   返回值:  无
*/
void Init_EC11_GPIO(void)
{
    //使能时钟
    rcu_periph_clock_enable(RCU_GPIOB);
    
    //设置输入模式,上拉
    gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_3|GPIO_PIN_9);

}

/*
*   函数内容:初始化EC11引脚,旋转判断引脚A需要使用中断
*   函数参数:无
*   返回值:  无
*/
void Init_EC11_EXITGPIO(void)
{
	//使能时钟GPIOB,CMP
    rcu_periph_clock_enable(RCU_GPIOB);
	rcu_periph_clock_enable(RCU_CFGCMP);//比较器
	
	//设置引脚模式,上拉
	gpio_mode_set(GPIOB,GPIO_MODE_INPUT,GPIO_PUPD_PULLUP,GPIO_PIN_4);
	
	//中断使能
	nvic_irq_enable(EXTI4_15_IRQn,1U);
	
	//配置中断线
	syscfg_exti_line_config(EXTI_SOURCE_GPIOB,EXTI_SOURCE_PIN4);
	
	//初始化中断线,设置为中断模式,上升沿触发
	exti_init(EXTI_4,EXTI_INTERRUPT,EXTI_TRIG_RISING);
	
    //中断线使能
    exti_interrupt_enable(EXTI_4);
    
	//中断标志位清除
	exti_interrupt_flag_clear(EXTI_4);    
}

/*
*   函数内容:中断线4-15中断服务函数,这里为了防止误触,做了旋转计数判断,需要沿一个方向多旋转几次才算成功
              注意中断服务函数中不要做操作时间长的操作
*   函数参数:无
*   返回值:  无
*/
void EXTI4_15_IRQHandler(void)
{
   //顺时针判断计数
   static uint8_t clockwiseNum=0;
   //逆时针判断计数
   static uint8_t anticlockwiseNum=0;
    
   if(RESET != exti_interrupt_flag_get(EXTI_4))  
   {
        if(gpio_input_bit_get(GPIOB,GPIO_PIN_3)==RESET) //逆时针转两格
        {
            delay_1ms(1);
            anticlockwiseNum=0;
            if(gpio_input_bit_get(GPIOB,GPIO_PIN_3)==RESET) //逆时针转两格
            {
                clockwiseNum++;
                if(clockwiseNum>=2)
                {
                    clockwiseNum=0;
                    Open_LED(led2);Open_LED(led3);
                }            
            }
        }
        else                                            //顺时针转两格
        {
            delay_1ms(1);
            clockwiseNum=0;
            if(gpio_input_bit_get(GPIOB,GPIO_PIN_3)==SET) //顺时针转两格
            {
                anticlockwiseNum++;
                if(anticlockwiseNum>=2)
                {
                    anticlockwiseNum=0;
                    CLose_LED(led2);CLose_LED(led3);
                }
            }
        }
        exti_interrupt_flag_clear(EXTI_4);
    }
}

https://www.bilibili.com/video/BV1JJ411s7p3
https://www.bilibili.com/video/BV1uz41187BK

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis从入门到精通(十四)Redis分布式缓存(二)Redis哨兵集群的搭建和原理分析

文章目录 前言5.3 Redis哨兵5.3.1 哨兵原理5.3.1.1 集群的结构和作用5.3.1.2 集群监控原理5.3.1.3 集群故障恢复原理 5.3.2 搭建哨兵集群5.3.3 RedisTemplate5.3.3.1 搭建测试项目5.3.3.2 场景测试 前言 Redis分布式缓存系列文章: Redis从入门到精通(十三)Redis分…

Git分布式版本控制系统——Git常用命令(二)

五、Git常用命令————分支操作 同一个仓库可以有多个分支,各个分支相互独立,互不干扰 分支的相关命令,具体如下: git branch 查看分支 git branch [name] 创建分支&#x…

面试题:重写equals(),为什么还要重写hashcode()

认识equals(): Object类中的equals; public boolean equals(Object obj) {return (this obj);}当我们没有重写equals(),我们是调用父类object中的方法,比较的是对象的内存地址 重写equals后, public class Student…

蓝桥杯嵌入式(G431)备赛笔记——DMA+UART

目录 CubeMX配置: 代码配置: DMA通道接收: DMA通道发送: 注意: 主函数中记得开启串口接收回调函数: 加了DMA的UART接收通道和一般的区别: 加了DMA的UART发送和一般的区别: CubeMX配置&…

Day23_学点儿Java_多态复习

1 做错的选择题 Java中的多态性是通过以下哪个机制实现的?() A. 方法重载 B. 方法覆盖 C. 抽象类 D. 接口2 多态复习 2.1 学点儿Java_Day7_继承、重载、重写、多态、抽象类 2.2 面向对象四大基本特征 封装、抽象、继承、多态 封装 面向…

【翻译】再见, Clean Code!

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 【翻译】再见, Clean Code!正文那是一个深夜次日早晨这只是一个阶段 【翻译】再见…

CTF-SHOW SSRF

web351 存在一个flag.php页面,访问会返回不是本地用户的消息,那肯定是要让我们以本地用户去访问127.0.0.1/flag.php web352 代码中先判断是否为HTTP或https协议,之后判断我们传入的url中是否含有localhost和127.0.0,如果没有则…

JAVA集合ArrayList

目录 ArrayList概述 add(element) 用法 add(index, element)用法 remove(element)用法 remove(index)用法 get(index)用法 set(index,element) 练习 test1 定义一个集合,添加字符串,并进行遍历&…

【JavaWeb】Day42.MySQL概述——多表查询

介绍 多表查询:查询时从多张表中获取所需数据 单表查询的SQL语句:select 字段列表 from 表名; 如果要执行多表查询,只需要使用逗号分隔多张表即可,如: select 字段列表 from 表1, 表2; 例如:查询…

解决mac本git安装后找不到命令的问题

不熟悉mac配置,折腾了半天,记录一下。 1.问题描述2.解决方法 1.问题描述 从https://sourceforge.net/projects/git-osx-installer/files/下载的git安装包: 安装时提示: 这里的解决办法是按住control键再打开文件安装。 安装完…

数据分析案例(一):地区收入的PCA主成分分析

练习1 地区收入的PCA主成分分析 0.变量说明 1.导包操作 核心思路:导入基础数据操作库包,PCA、k-means 库包,数据可视化库包 import pandas as pd import numpy as np from sklearn.decomposition import PCA from sklearn.preprocessing i…

补体系统研究解决方案BioPorto补体抗体

靶点研究新热点:补体系统 21世纪以来,人们对补体的认识从基于血液的抗菌素系统逐步转变为免疫和组织稳态的全局调节器。近年,对补体激活机制、结构、功能方面的研究更是取得了显著的进展,令补体系统研究跻身热门研究主题之一。 补…

基于SSM新疆旅游管理系统的设计与实现(内附设计LW + PPT+ 源码下载)

摘 要 随着经济的飞速发展人们对于旅游的热衷度也日益提升,新疆因特殊的地理优势具备了天然的旅游资源,天山山脉将新疆的地理区域划分为了南疆和北疆,北疆因气候湿润且河流草场较多造就了得天独厚的自然旅游资源,南疆沙漠广布且…

图像JPEG压缩(附python代码)

JPEG压缩是一种有损压缩技术,常用于数字图像。它通过减少图像文件大小来实现压缩,但会造成一定程度的图像质量损失。 目录 一、JPEG压缩1.1 JPEG压缩原理1.2 JPEG压缩优点1.3 JPEG压缩缺点 二、图像退化中加入JPEG压缩2.1 优势2.1.1 更逼真的模拟2.1.2 提…

OceanMind海睿思助力企业“数据入表”经济利益流入与生命周期管理

通过多年信息系统的建设与应用,企业积累了大量的数据。同时随着时间的推进,数据规模正以加速度快速增长。从国家到企业,都越来越关注所拥有的数据资源及其蕴含的深厚价值。很多企业已经逐渐认知到数据是重要的战略资源,数据资产化…

Acwing.3999 最大公约数(gcd欧拉函数)

题解 给定两个正整数 a,m&#xff0c;其中 a<m。 请你计算&#xff0c;有多少个小于 m 的非负整数 x满足&#xff1a; gcd(a,m)gcd(ax,m) 输入格式 第一行包含整数 T &#xff0c;表示共有 T 组测试数据。 每组数据占一行&#xff0c;包含两个整数 a,m 。 输出格式 每…

2024年第十四届MathorCup数学应用挑战赛C题解析(更新中)

2024年第十四届MathorCup数学应用挑战赛C题解析&#xff08;更新中&#xff09; 题目题目解析(更新中&#xff09;问题一问题二问题三 题目 C题 物流网络分拣中心货量预测及人员排班电商物流网络在订单履约中由多个环节组成&#xff0c;图1是一个简化的物流 网络示意图。其中&a…

UI自动化测试案例

备注:本文为博主原创文章,未经博主允许禁止转载。如有问题,欢迎指正。 个人笔记(整理不易,有帮助,收藏+点赞+评论,爱你们!!!你的支持是我写作的动力) 笔记目录:笔记本~笔记目录_airtest和selenium那个好用-CSDN博客 个人随笔:工作总结随笔_8、以前工作中都接触过哪…

Ansys Zemax | 如何将光栅数据从Lumerical导入至OpticStudio(下)

附件下载 联系工作人员获取附件 本文介绍了一种使用Ansys Zemax OpticStudio和Lumerical RCWA在整个光学系统中精确仿真1D/2D光栅的静态工作流程。将首先简要介绍方法。然后解释有关如何建立系统的详细信息。 本篇内容将分为上下两部分&#xff0c;上部将首先简要介绍方法工作…

如何处理ubuntu22.04LTS安装过程中出现“Daemons using outdated libraries”提示

Ubuntu 22.04 LTS 中使用命令行升级软件或安装任何新软件时&#xff0c;您可能收到“Daemons using outdated libraries”&#xff0c;“Which services should be restarted?”的提示&#xff0c;提示下面列出备选的重启服务&#xff0c;如下。 使用以下命令&#xff0c;能够…