当前位置: 首页 > ops >正文

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.xdnf.cn/news/4977.html

相关文章:

  • QT6(35)4.8定时器QTimer 与QElapsedTimer:理论,例题的界面搭建,与功能的代码实现。
  • CSS display: none
  • 2025 年数维杯数学建模B题完整论文代码模型
  • 2025 年数维杯数学建模 C 题完整论文代码模型
  • Linux——进程信号
  • MySQL中的连接池
  • java------------反射
  • JAVA,大花猫大黑狗例题
  • 敦普水性无铬锌铝涂层:汽车紧固件防锈15年,解决螺栓氢脆腐蚀双痛点
  • linux中的日志分割
  • sklearn自定义pipeline的数据处理
  • c++中new和malloc 分配内存有什么不同
  • VSCode远程无法选择虚拟环境问题
  • 官方SDK停更后的选择:开源维护的Bugly Unity SDK
  • 《深挖Java中的对象生命周期与垃圾回收机制》
  • 麒麟系统安装 Nginx 作为非 Web 程序的完整指南
  • 自定义prometheus exporter实现监控阿里云RDS
  • 【彻底卸载nginx并部署nginx1.22.1+ssl模块等】
  • 供应链管理系统建设方案,技术方案(Word)
  • SpringAI--基于MySQL的持久化对话记忆实现
  • 当当网Top500书籍信息爬取与分析
  • 事务失效的场景
  • 循环卷积(Circular Convolutions)
  • 227. 基本计算器 II
  • Tomcat 日志体系深度解析:从访问日志配置到错误日志分析的全链路指南
  • VUE2课程计划表练习
  • 推送到Gerrit时报错,缺少Change-Id
  • component :is是什么?
  • 多轴钻孔组合机床设计与关键技术研究
  • 【nestjs】一般学习路线