STC32G12K128-旋转编码器-软件去抖

STC32G12K128-旋转编码器-软件去抖

  • 简介
  • 代码

简介

EC11旋转编码器是一种可以连续旋转的器件A,B,C为旋转编码引脚,带按键的有D,E引脚。引脚功能:

  • A:编码器A相;
  • B:编码器B相;
  • C:公共端-一般接到GND;
  • D/E:按键,按下时D,E导通,和普通按键功能相似;

当旋转编码器时:A,B两个端子的开关相继导通。 内部机械结构的设计保证了:顺时针旋转时A超前于B的相位。逆时针旋转时B超前于A的相位。
在这里插入图片描述

在这里插入图片描述

解码原理:

  • A相接单片机外部中断引脚,设为下降沿触发;
  • B相接单片机GPIO引脚,设置为输入引脚;
  • 旋转编码器时A相下降沿触发中断,中断服务程序里延时50us判断A相是否为电平(去抖操作)
  • A相下降去抖后延时100us判断B相电平,低电平是顺时针旋转,高电平是逆时针旋转;
  • 两个延时时间根据实际情况耐心微调,可以达到很好的去抖效果,本例实测超慢速度~超快速度,均能连续正确解码旋转方向值;

代码

drv_encoder.h

#ifndef __DRV_ENCODER_H__
#define __DRV_ENCODER_H__enum {E_ENCODER_N=0,E_ENCODER_L=1,E_ENCODER_R
};void drv_encoder_init(void);uint8_t drv_encoder_value(void);void drv_encoder_notify(void);#endif

drv_encoder.c


#include "STC32G_Timer.h"
#include "STC32G_GPIO.h"
#include "STC32G_NVIC.h"
#include "STC32G_Exti.h"
#include "STC32G_Delay.h"#include "app_config.h"
#include "drv_encoder.h"
#include "debug.h"#if TCFG_DRV_ENCODER_SUPPORT#define D_ENCIO_A   P33     // 编码器A相
#define D_ENCIO_B   P34     // 编码器B相
static uint8_t encoder_value = E_ENCODER_N;void delay_us(unsigned int us)
{unsigned char data i;while(--us) {_nop_();_nop_();i = 3;while (--i);}
}void drv_encoder_init(void)
{EXTI_InitTypeDef	Exti_InitStructure;P3_SPEED_LOW(GPIO_Pin_3|GPIO_Pin_4);// P3_SPEED_HIGH(GPIO_Pin_3|GPIO_Pin_4);P3_DRIVE_MEDIUM(GPIO_Pin_3|GPIO_Pin_4);// P3_DRIVE_HIGH(GPIO_Pin_3|GPIO_Pin_4);// P3_PULL_UP_ENABLE(GPIO_Pin_3|GPIO_Pin_4);P3_PULL_UP_DISABLE(GPIO_Pin_3|GPIO_Pin_4);// P3_MODE_IO_PU(GPIO_Pin_3|GPIO_Pin_4);P3_MODE_IN_HIZ(GPIO_Pin_3|GPIO_Pin_4);P3_DIGIT_IN_ENABLE(GPIO_Pin_3|GPIO_Pin_4);Exti_InitStructure.EXTI_Mode      = EXT_MODE_Fall;//中断模式,   EXT_MODE_RiseFall,EXT_MODE_FallExt_Inilize(EXT_INT1, &Exti_InitStructure);				//初始化NVIC_INT1_Init(ENABLE,Priority_1);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3}/*** @brief   旋转编码器 通知* @param   无* @note    * @return  无
*/
void drv_encoder_notify(void)
{encoder_value = E_ENCODER_N;
}/*** @brief   获取旋转编码器值* @param   无* @note    同时设置编码器值为none* @return  0:无操作,1:左旋转(逆时针),2:右旋转(顺时针)
*/
uint8_t drv_encoder_value(void)
{uint8_t enc_value = encoder_value;    drv_encoder_notify();return enc_value;
}/*** @brief   编码器A相中断处理函数* @note    下降沿触发* @return  无
*/
void INT1_ISR_Handler (void) interrupt INT1_VECTOR		//进中断时已经清除标志
{// TODO: 旋转编码器去抖,A相中断下降沿触发,延时50us判断A相是否为低电平,为低延时100us判断B相电平 0=右旋转(顺时针),1=左旋转(逆时针)D_ENCIO_A = 1;delay_us(50);if (0 == D_ENCIO_A) {D_ENCIO_B = 1;delay_us(100);if (D_ENCIO_B == 0) {encoder_value = E_ENCODER_R;} else {encoder_value = E_ENCODER_L;}}    
}#endif //TCFG_DRV_ENCODER_SUPPORT

main.c

#include "drv_encoder.h"void main(void)
{uint8_t enc_value;// 系统初始化// ......// 旋转编码器drv_encoder_init();enc_value = drv_encoder_value();if (E_ENCODER_N != enc_value) {			if (E_ENCODER_L == enc_value) {log_d("E_ENCODER_L\n");} else if (E_ENCODER_R == enc_value) {log_d("E_ENCODER_R\n");}}
}

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

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

相关文章

配置Jupyter Notebook环境及Token认证(Linux服务器)

配置Jupyter Notebook环境及Token认证(Linux服务器) 背景 在Ubuntu 18.04.6 LTS服务器(IP: 39.105.167.2)上,基于虚拟环境pytorch_env,通过Mac终端(SSH)配置Jupyter Notebook环境&…

从零开始学Flink:开启实时计算的魔法之旅

在凌晨三点的数据监控大屏前,某电商平台的技术负责人突然发现一个异常波动:支付成功率骤降15%。传统的数据仓库此时还在沉睡,而基于Flink搭建的实时风控系统早已捕捉到这个信号,自动触发预警机制。当运维团队赶到时,系…

基于k8s的Jenkins CI/CD平台部署实践(三):集成ArgoCD实现持续部署

基于k8s的Jenkins CI/CD平台部署实践(三):集成ArgoCD实现持续部署 文章目录 基于k8s的Jenkins CI/CD平台部署实践(三):集成ArgoCD实现持续部署一、Argocd简介二、安装Helm三、Helm安装ArgoCD实战1. 添加Arg…

[C++类和对象]类和对象的引入

面向过程和面向对象 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用来逐步解决问题 C是基于面向对象的,关注的是对象,将一件事情分成不同的对象,靠对象之间完成交互 类的引入 C语言结构体中只能定义变量,在C中,结构体不仅仅可以定义变量,而且可以定义函…

AWS之存储服务

目录 一、传统存储术语 二、传统存储与云存储的关系 三、云存储之AWS 使用场景 文件存储 数据块存储 对象存储 EBS、EFS、S3对比 EBS块存储 S3对象存储 S3 使用案例 S3 存储类 EFS文件存储 一、传统存储术语 分类 接口/技术类型 应用场景特点 关系及区别 机械硬…

WPDRRC 模型:构建动态闭环的信息安全防御体系

WPDRRC 模型是一种信息安全整体架构设计模型,由预警(Warning)、保护(Protection)、检测(Detection)、反应(Reaction)、恢复(Recovery)和反击&…

Redis 数据类型详解(二):Hash 类型全解析

文章目录 一、什么是 Redis 的 Hash 类型?二、Hash为什么在有些时候比String好用三、常见命令1.HSET key field value2.HGET key field3.HMSET4.HMGET5.HGETALL6.HKEYS7.HVALS8.HINCRBY9.HSETNX 四、应用场景五、性能优势六、注意事项总结 提示:以下是本…

Go Modules 的基本使用

在 Go Modules 项目中,首次运行时下载依赖包的正确流程需要根据项目情况区分处理。以下是详细步骤和最佳实践: 一、首次初始化项目的标准流程 1.1 创建项目目录并初始化模块 mkdir myproject && cd myproject go mod init github…

RISC-V AIA SPEC学习(五)

第六章 Interrupts for Virtual Machines(VS Level) 核心内容 1.VS级别外部中断支持:​​ ​​客户中断文件(Guest Interrupt File)​​:虚拟机的每个vCPU拥有独立的IMSIC中断文件,允许直接接收设备MSI。​​vstopi CSR​​:类似stopei,用于虚拟机内部处理最高优先级中…

【Python-Day 11】列表入门:Python 中最灵活的数据容器 (创建、索引、切片)

Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

【AXI总线专题】-AXI-LITE总线解读

【AXI总线专题】-AXI-LITE总线解读 1.axi-lite概述2.信号定义Write address channelWrite data channelWrite response channelRead address channelRead data channel 3.测试4.仿真波形5.工程文件 参考手册 《3-2-03米联客2022版AXI4总线专题-20211123.pdf》 《IHI0022E_amba_…

在企业级项目中高效使用 Maven-mvnd

1、引言 1.1 什么是 Maven-mvnd? Maven-mvnd 是 Apache Maven 的一个实验性扩展工具(也称为 mvnd),基于守护进程(daemon)模型构建,目标是显著提升 Maven 构建的速度和效率。它由 Red Hat 推出,通过复用 JVM 进程来减少每次构建时的启动开销。 1.2 为什么企业在构建过…

网络字节序 - 大端

回顾主机字节序 - 大小端 发送主机将发送缓冲区中的数据按内存地址从低到高的顺序发出接收主机把从网络上接收到的数据按内存地址从底到高的顺序依次保存到接收缓冲区TCP/IP 规定,网络数据流应采用大端字节序,即低地址高字节,也就是说&#…

《被讨厌的勇气》书摘

阿德勒心理学考虑的不是过去的“原因”,而是现在的“目的”。你的朋友并不是因为不想到外面去,才制造出不安的情绪。是先有了“不出去”这个目的,之后才会为了达到这个目的而制造出不安或者恐惧之类的情绪。 个人见解:这是阿德勒…

打造专属AI好友:小智AI聊天机器人详解

打造专属AI好友:小智AI聊天机器人详解 在当下的科技热潮中,AI正迅速改变着我们的生活,成为了科技领域的新宠。而今,借助开源项目的力量,你可以亲手打造一个智能小助手——小智AI聊天机器人。它不仅是一个技术探索的窗…

如何利用爬虫获得1688商品详情:实战指南

在电商运营和市场分析中,获取1688商品详情数据是一项重要任务。本文将详细介绍如何利用爬虫技术获取1688商品详情,包括准备工作、爬虫实现步骤以及注意事项。 一、准备工作 (一)注册1688开放平台账号 在1688开放平台注册开发者…

如何优化系统启动时间--基于米尔瑞萨MYD-YG2LX开发板

1.概述 MYD-YG2LX采用瑞萨RZ/G2L作为核心处理器,该处理器搭载双核Cortex-A551.2GHzCortex-M33200MHz处理器,其内部集成高性能3D加速引擎Mail-G31 GPU(500MHz)和视频处理单元(支持H.264硬件编解码),16位的DDR4-1600 / DDR3L-1333内…

QML 图像变换(缩放、平移、旋转)

目录 引言相关阅读基础知识工程结构核心代码解析示例1:图像缩放(ImageScale.qml)代码说明运行效果 示例2:图像平移(ImageTransform.qml)代码说明运行效果 示例3:图像旋转(ImageRotat…

Linux 系统命令使用指南1

适用于 Red Hat / CentOS / Rocky Linux 等系统的基本初始化配置操作。 🔒 1. 关闭 SELinux(临时生效) setenforce 0⚠️ 注意:此命令仅临时关闭 SELinux,重启后可能恢复。要永久关闭,请修改 /etc/selinux…

1.2.1 Linux音频系统发展历程简介

Linux音频系统的发展经历了从最初的简单驱动到今天多层次、模块化音频架构。简要梳理其主要历程: 早期的OSS(Open Sound System) 在90年代及2000年代初,Linux主要使用OSS来支持音频。OSS直接为硬件设备(如声卡&#…