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

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");}}
}

相关文章:

  • 常用电阻阻值表E24(5%)和E96(1%)
  • 面试题:Java集合框架高频面试题总结
  • 【基础】模型上下文协议(Model Context Protocol, MCP)根本原理与工作机制详解
  • canoe的安装总结
  • 我的AD快捷键方案【留存】
  • JAVA多态——向上转型
  • Vmware 最新下载教程和安装教程,外带免下载文件
  • 【软件设计师:多媒体】14.多媒体技术及其应用
  • 【C/C++】C语⾔内存函数
  • 空间复杂度** 与 **所需辅助空间**
  • LVGL源码学习之渲染、更新过程(1)---标记和激活
  • 我国脑机接口市场规模将破38亿元,医疗领域成关键突破口
  • SDC命令详解:使用all_inputs命令进行查询
  • 每天批次导入 100 万对账数据到 MySQL 时出现死锁
  • 一、对linux驱动文件编写时结构认识与记录
  • gpu硬件,gpu驱动,cuda,CUDA Toolkit,cudatoolkit,cudnn,nvcc概念解析
  • 操作系统 第2章节 进程,线程和作业
  • 【PhysUnits】3.3 SI 基础量纲单位(units/base.rs)
  • Leetcode刷题 由浅入深之字符串——541. 反转字符串Ⅱ
  • 振动临近失效状态,怎么频谱会是梳子?
  • 上海劳模风采馆焕新升级后重新开放,展示480位劳模先进故事
  • 成就彼此,照亮世界:“中欧建交50周年论坛”在沪成功举行
  • 印巴战火LIVE丨“快速接近战争状态”:印度袭击巴军事基地,巴启动反制军事行动
  • 人民日报钟声:平等对话是解决大国间问题的正确之道
  • 前4个月我国货物贸易进出口同比增长2.4%,增速较一季度加快1.1个百分点
  • 商务部:中方愿同各国一道加强合作,促进跨境电商健康可持续发展