0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CW32模块使用 EC11旋转编码器

CW32生态社区 来源:CW32生态社区 作者:CW32生态社区 2024-09-09 18:26 次阅读

旋转编码器是一种将旋转位移转换为一连串数字脉冲信号的旋转式传感器。这些脉冲用来控制角位移。读数系统通常采用差分方式,即将两个波形一样但相位差为180°的不同信号进行比较,以便提高输出信号的质量和稳定性。读数是在两个信号的差别基础上形成的,从而消除了干扰。

1.模块来源

模块实物展示:

wKgZombezTaAE2hMAAAizv4lfuY91.webp



资料下载链接:https://pan.baidu.com/s/18pp1KaT2V_llizWvdIXtKA?pwd=8889
资料提取码:8889

2.规格参数

>>>

模块的厂家资料下载请查看百度网盘链接

工作电压:5V

工作电流:1MA

模块尺寸:18 x 25 mm

旋转角度: 360度

通信协议:相位差

管脚数量:5 Pin(2.54mm间距排针

3.移植过程

我们的目标是在立创·CW32F030C8T6开发板上能够判断旋转方向、旋转次数和是否按下的功能。首先要获取资料,查看数据手册应如何实现,再移植至我们的工程。

3.1查看资料

旋转编码器是通过两个引脚的相位差,实现的旋转方向判断(以后的CLK引脚统一称呼为A相,DT引脚为B相)

当是顺时针旋转时,A相超前B相90度,即A相为下降沿时,B相为低电平;A相为上升沿时,B相为高电平。

当是逆时针旋转时,B相超前A相90度,即A相为下降沿时,B相为高电平;A相为上升沿时,B相为低电平。

wKgaombezTeAVtH6AAA3KtpXk8811.webp

而EC11按旋转的输出动作可以分为两种。

一种是转两格,A、B端输出一个完整脉冲(转一格就只是由低电平->高电平或由高电平->低电平);

一种就是转一格,A、B对C端输出一个完整脉冲。

wKgZombezTeAFFzZAAALcjDaCxY05.webp


转一格半个脉冲

wKgaombezTiAbIQVAAAOisBuVHI11.webp


转一格完整脉冲

因此我们只需检测A相或者B相有发生高低电平跳变时,就判断另一相状态,来决定旋转方向。根据以下真值表,可以发现:

当两相同时为上升沿或者同时为下降沿时,则为顺时针;

当两相不同时为上升沿或者不同时为下降沿时,则为逆时针;

下B相 右A相 上升沿 下降沿
上升沿 顺时针 逆时针
下降沿 逆时针 顺时针

旋转编码器是机械结构的,是机械结构就避免不了在旋转或者按下时有抖动,这里采用定时器每隔10ms扫描一次编码器是否有动作,实现10ms内的消抖。

wKgZombezTiAHXRlAACKclU9UZE27.webp

wKgaombezTiAPV_ZAABbeDWaFEQ91.webp

在中断服务函数中,根据真值表确定旋转的方向。

wKgZombezTmAMenMAADdiih9-AE98.webp

3.2引脚选择

该模块有5个引脚,具体引脚连接见 表 各引脚连接。

wKgaombezTmAMH-SAACDGPfYy7s71.webp

3.3移植至工程

打开自己的工程。(这里工程参考见入门手册工程模板)

移植步骤中的导入.c和.h文件与第二章的第1小节【DHT11温湿度传感器】相同,只是将.c和.h文件更改为ec11.c与ec11.h。这里不再过多讲述,移植完成后面修改相关代码。

在文件ec11.c中,编写如下代码。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-19     LCKFB-LP    first version
 */

#include "ec11.h"
#include "stdio.h"


/******************************************************************
 * 函 数 名 称:Encoder_GPIO_Init
 * 函 数 说 明:旋转编码器引脚初始化
 * 函 数 形 参:无
 * 函 数 返 回:无
 * 作       者:LC
 * 备       注:使用定时器每10Ms扫描一次是否有旋转,即通过定时器进行消抖
******************************************************************/
void Encoder_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;                     // GPIO初始化结构体
    BTIM_TimeBaseInitTypeDef BTIM_TimeBaseInitStruct;     // 定时器初始化结构体

    RCC_GPIO_ENABLE();        // 使能GPIO时钟
    BTIM_RCC_ENABLE();        // 使能BTIM时钟

    // 禁止中断,以安全地配置NVIC
    __disable_irq();

    // 开启BTIM1中断,并关联到NVIC
    NVIC_EnableIRQ(BSP_TIMER_IRQ);

    // 允许中断,恢复中断状态
    __enable_irq();

    GPIO_InitStruct.Pins =  GPIO_ENCODER_SW|          // GPIO引脚
                            GPIO_ENCODER_LCK|
                            GPIO_ENCODER_DT;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;    // 上拉输入
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;          // 输出速度高
    GPIO_Init(PORT_GPIO, &GPIO_InitStruct);           // 初始化


    // 配置定时器模式、周期和预分频器
    BTIM_TimeBaseInitStruct.BTIM_Mode = BTIM_Mode_TIMER;       // 设置为定时器模式
    BTIM_TimeBaseInitStruct.BTIM_Period = 625 - 1;             // 设置周期,使得定时器每10ms产生一次溢出中断
    BTIM_TimeBaseInitStruct.BTIM_Prescaler = BTIM_PRS_DIV1024; // 预分频器设置为1024,以降低时钟频

    // 使用上述配置初始化定时器BTIM1
    BTIM_TimeBaseInit(BSP_TIMER, &BTIM_TimeBaseInitStruct);

    // 使能BTIM1的溢出中断
    BTIM_ITConfig(BSP_TIMER, BTIM_IT_OV, ENABLE);

    // 启动定时器BTIM1
    BTIM_Cmd(BSP_TIMER, ENABLE);
}


/******************************************************************
 * 函 数 名 称:Encoder_Scanf
 * 函 数 说 明:判断旋转编码器是否有往哪一个方向旋转
 * 函 数 形 参:无
 * 函 数 返 回:1=正转 2=反转
 * 作       者:LC
 * 备       注:哪一边正转哪一边反转不需要太在意,你说的算
******************************************************************/
char Encoder_Scanf(void)
{
    static GPIO_PinState EC11_CLK_Last= GPIO_Pin_RESET; //EC11的LCK引脚上一次的状态(A相)
    static GPIO_PinState EC11_DT_Last = GPIO_Pin_RESET; //EC11的DT引脚上一次的状态(B相)
    char ScanResult = 0;
    //当A发生跳变时采集B当前的状态,并将B与上一次的状态进行对比。
    if(GET_CLK_STATE !=EC11_CLK_Last)
    {           //若A 0->1 时,B 1->0 正转;若A 1->0 时,B 0->1 正转;
                //若A 0->1 时,B 0->1 反转;若A 1->0 时,B 1->0 反转
        if(GET_CLK_STATE == 1)     //EC11_A和上一次状态相比,为上升沿
        {
            //EC11_B和上一次状态相比,为下降沿
            if((EC11_DT_Last == 1)&&(GET_DT_STATE == 0))
                ScanResult = 1;  //正转
             //EC11_B和上一次状态相比,为上升沿
            if((EC11_DT_Last == 0)&&(GET_DT_STATE == 1))
                ScanResult = 2; //反转

            //>>>>>>>>>>>>>>>>下面为正转一次再反转或反转一次再正转处理< << << << << << << <<  >>>>>>>>>>>>>>>下面为正转一次再反转或反转一次再正转处理< << << << << << << <<  

在文件ec11.h中,编写如下代码。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-19     LCKFB-LP    first version
 */
#ifndef _BSP_ENCODER_H_
#define _BSP_ENCODER_H_

#include "board.h"

#define RCC_GPIO_ENABLE()   __RCC_GPIOA_CLK_ENABLE()

#define PORT_GPIO           CW_GPIOA

//SW引脚
#define GPIO_ENCODER_SW     GPIO_PIN_7

//CLK引脚
#define GPIO_ENCODER_LCK    GPIO_PIN_6

//DT引脚
#define GPIO_ENCODER_DT     GPIO_PIN_4

//获取CLK引脚的状态
#define GET_CLK_STATE   GPIO_ReadPin(PORT_GPIO, GPIO_ENCODER_LCK)
//获取DT引脚的状态
#define GET_DT_STATE    GPIO_ReadPin(PORT_GPIO, GPIO_ENCODER_DT)
//获取SW引脚的状态
#define GET_SW_STATE    GPIO_ReadPin(PORT_GPIO, GPIO_ENCODER_SW)

//定时器扫描
#define BTIM_RCC_ENABLE()            __RCC_BTIM_CLK_ENABLE() // 使能定时器时钟
#define BSP_TIMER                    CW_BTIM1                // 定时器
#define BSP_TIMER_IRQ                BTIM1_IRQn              // 定时器中断
#define BSP_TIMER_IRQHANDLER         BTIM1_IRQHandler        // 定时器中断服务函数


void Encoder_GPIO_Init(void);//旋转编码器初始化
unsigned char Encoder_Sw_Down(void);//编码器是否按下
int Encoder_Rotation_left(void);//左转服务函数
int Encoder_Rotation_right(void);//右转服务函数


#endif

4.移植验证

在自己工程中的main主函数中,编写如下。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-19     LCKFB-LP    first version
 */
#include "board.h"
#include "stdio.h"
#include "bsp_uart.h"
#include "ec11.h"

int32_t main(void)
{
    board_init();        // 开发板初始化

    uart1_init(115200);  // 串口1波特率115200

    Encoder_GPIO_Init();
    printf("encoder demo startrn");
    while(1)
    {
        if( Encoder_Sw_Down() == 1 )//旋转编码器被按下
        {
            printf("Encoder downrn");
        }
    }
}

移植现象:向右旋转10次,向左旋转10次,按下一次。

wKgZombezTqAaLTVAACKQjalaL418.webp

模块移植成功案例代码:

链接:https://pan.baidu.com/s/18_4-IfR_pzyy1QvyQE7XkQ?pwd=LCKF

提取码:LCKF

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 旋转编码器
    +关注

    关注

    5

    文章

    155

    浏览量

    25880
  • EC11
    +关注

    关注

    0

    文章

    5

    浏览量

    8867
  • CW32
    +关注

    关注

    1

    文章

    161

    浏览量

    494
收藏 人收藏

    评论

    相关推荐

    旋转编码器EC11在stm32中怎么用啊?

    旋转编码器EC11,在stm32中怎么用啊?是要接外部中断,还是定时的特定引脚啊?看到论坛里有人发的,有人说接到定时特定引脚,STM32
    发表于 05-07 07:00

    EC11旋转编码器简单介绍

    元器件编码器旋转编码器
    jf_95215556
    发布于 :2022年09月28日 19:41:48

    请问STM32CubeMX配置Encoder模式如何驱动EC11旋转编码器

    请问STM32CubeMX配置Encoder模式如何驱动EC11旋转编码器
    发表于 11-18 07:48

    EC11编码器的相关资料分享

    EC11编码器EC11编码器通常又被称作为旋转编码器,一般主要是用于亮度、温度、频率,音量调节等
    发表于 11-24 06:51

    旋转编码器EC11驱动的相关资料推荐

    旋转编码器EC11驱动/*-------->>>>>>>>--------注意事项:EC11旋转编码器
    发表于 01-12 08:01

    常用的旋转编码器ec11介绍

    变化了。常用的旋转编码器ec11如下:这种编码器一共有五个针脚,两个是按压的微动开关使用,和其他功能毫无关系。剩
    发表于 01-20 06:46

    EC11旋转编码器的相关资料分享

    1、概述本文所使用的编码器EC11旋转编码器,该编码器由两个部分组成,第一部分(3脚ACB)分别为编码
    发表于 02-23 07:30

    ec11编码器接法及分类介绍,工作原理、性能及应用解析

    ec11旋转编码器是一种光电式旋转测量装置,它把被测的角位移或者直接转换成数字信号。如若ec11编码器
    的头像 发表于 03-03 13:49 7.6w次阅读

    EC11系列ALPS 11型金属轴型编码器的数据手册免费下载

    本文档的主要内容详细介绍的是EC11系列ALPS 11型金属轴型编码器的数据手册免费下载。
    发表于 05-27 08:00 35次下载
    <b class='flag-5'>EC11</b>系列ALPS <b class='flag-5'>11</b>型金属轴型<b class='flag-5'>编码器</b>的数据手册免费下载

    EC11系列金属轴型编码器的数据手册免费下载

    本文档的主要内容详细介绍的是EC11系列金属轴型编码器的数据手册免费下载。
    发表于 12-17 17:08 66次下载
    <b class='flag-5'>EC11</b>系列金属轴型<b class='flag-5'>编码器</b>的数据手册免费下载

    旋转编码器是什么,它的优势都有哪些

    旋转编码器分为增量型编码器绝对型编码器两种,型号有EC08、EC11
    发表于 12-02 17:34 4460次阅读

    EC11编码器和单片机通信

    EC11编码器EC11编码器通常又被称作为旋转编码器,一般主要是用于亮度、温度、频率,音量调节等
    发表于 11-16 14:51 31次下载
    <b class='flag-5'>EC11</b><b class='flag-5'>编码器</b>和单片机通信

    N76E003 旋转编码器 EC11

    1、概述本文所使用的编码器EC11旋转编码器,该编码器由两个部分组成,第一部分(3脚ACB)分别为编码
    发表于 12-29 19:23 29次下载
    N76E003  <b class='flag-5'>旋转</b><b class='flag-5'>编码器</b> <b class='flag-5'>EC11</b>

    ec11编码器 有什么驱动芯片吗

    EC11编码器是一种常用的编码器,通常用于工业自动化、机器人、数控机床等领域。为了驱动EC11编码器的正常工作,需要使用相应的驱动芯片。下面
    的头像 发表于 12-13 10:43 1161次阅读

    基于合宙Air780E开发板集成ec11旋转编码器实例

    一个基于Air780E开发板,集成ec11旋转编码器的实例。
    的头像 发表于 08-08 10:13 367次阅读
    基于合宙Air780E开发板集成<b class='flag-5'>ec11</b><b class='flag-5'>旋转</b><b class='flag-5'>编码器</b>实例