企业宣传,产品推广,广告招商,广告投放联系seowdb

CW32模块经常使用 EC11旋转编码器

旋转 编码器 是一种将旋转位移转换为一连串数字脉冲 信号 的旋转式 传感器 。这些脉冲用来控制角位移。读数系统理论驳回差分形式,行将两个波形一样但相位差为180°的不同信号启动比拟,以便提高输入信号的质量和稳固性。读数是在两个信号的差异基础上构成的,从而消弭了搅扰。

模块实物展现:

资料下载 链接: 资料 提取码:8889

2. 规格 参数

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

上班电压:5V

上班 电流 :1MA

模块尺寸:18 x 25 mm

旋转角度: 360度

通讯 协定:相位差

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

3.移植环节

咱们的指标是在立创·CW32F030C8T6开发板上能够判别旋转方向、旋转次数和能否按下的性能。首先要失掉资料,检查数据手册应如何成功,再移植至咱们的工程。

3.1检查资料

旋转编码器是经过两个引脚的相位差,成功的旋转方向判别(以后的CLK引脚一致称说为A相,DT引脚为B相)

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

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

而EC11按旋转的输入举措可以分为两种。

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

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

转一格半个脉冲

转一格完整脉冲

因此咱们只有 检测 A相或许B相有出现高下电平跳变时,就判别另一相形态,来选择旋转方向。依据以下真值表,可以发现:

当两相反时为回升沿或许同时为降低沿时,则为顺时针;

当两相不同时为回升沿或许不同时为降低沿时,则为逆时针;

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

旋转编码器是 机械 结构的,是机械结构就防止不了在旋转或许按下时有颤抖,这里驳回 定时器 每隔10ms扫描一次性编码器能否有举措,成功10ms内的消抖。

在终止服务函数中,依据真值表确定旋转的方向。

3.2引脚选用

该模块有5个引脚,详细引脚衔接见 表 各引脚衔接。

3.3移植至工程

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

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

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

/* * Change Logs: * DaAuthorNotes * 2024-06-19LCKFB-LPfit version */#include "ec11.h"#include "stdio.h"/****************************************************************** * 函 数 名 称:Encoder_GPIO_Init * 函 数 说 明:旋转编码器引脚初始化 * 函 数 形 参:无 * 函 数 返 回:无 * 作者:LC * 备注:经常使用定时器每10Ms扫描一次性能否有旋转,即经过定时器启动消抖******************************************************************/void Encoder_GPIO_Init(void){GPIO_InitTypeDef GPIO_InitStruct;// GPIO初始化结构体BM_TimeBaseInitTypeDef BTIM_TimeBaseInitStruct;// 定时器初始化结构体RCC_GPIO_ENABLE();// 使能GPIO时钟BTIM_RCC_ENABLE();// 使能BTIM时钟// 制止终止,以安保地性能NVIC__disable_irq();// 开启BTIM1终止,并关联到NVICNVIC_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,以降低时钟频// 经常使用上述性能初始化定时器BTIM1BTIM_TimeBaseInit(BSP_TIMER, &BTIM_TimeBaseInitStruct);// 使能BTIM1的溢出终止BTIM_ITConfig(BSP_TIMER, BTIM_IT_OV, ENABLE);// 启动定时器BTIM1BTIM_Cmd(BSP_TIMER, ENABLE);}/****************************************************************** * 函 数 名 称:Encoder_Sf * 函 数 说 明:判别旋转编码器能否有往哪一个方向旋转 * 函 数 形 参:无 * 函 数 返 回:1=正转 2=反转 * 作者:LC * 备注:哪一边正转哪一边反转不须要太在意,你说的算******************************************************************/char Encoder_Scanf(void){stat 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: * DateAuthorNotes * 2024-06-19LCKFB-LPfirst version */#ifndef _BSP_ENCODER_H_#define _BSP_ENCODER_H_#include "board.h"#define RCC_GPIO_ENABLE()__RCC_GPIOA_CLK_ENABLE()#define PORT_GPIOCW_GPIOA//SW引脚#define GPIO_ENCODER_SWGPIO_PIN_7//CLK引脚#define GPIO_ENCODER_LCKGPIO_PIN_6//DT引脚#define GPIO_ENCODER_DTGPIO_PIN_4//失掉CLK引脚的形态#define GET_CLK_STATEGPIO_RePin(PORT_GPIO, GPIO_ENCODER_LCK)//失掉DT引脚的形态#define GET_DT_STATEGPIO_ReadPin(PORT_GPIO, GPIO_ENCODER_DT)//失掉SW引脚的形态#define GET_SW_STATEGPIO_ReadPin(PORT_GPIO, GPIO_ENCODER_SW)//定时器扫描#define BTIM_RCC_ENABLE()__RCC_BTIM_CLK_ENABLE() // 使能定时器时钟#define BSP_TIMERCW_BTIM1// 定时器#define BSP_TIMER_IRQBTIM1_IRQn// 定时器终止#define BSP_TIMER_IRQHANDLERBTIM1_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: * DateAuthorNotes * 2024-06-19LCKFB-LPfirst version */#include "board.h"#include "stdio.h"#include "bsp_.h"#include "ec11.h"int32_t main(void){board_init();// 开发板初始化uart1_init(115200);// 串口1波特率115200Encoder_GPIO_Init();printf("encoder demo startrn");while(1){if( Encoder_Sw_Down() == 1 )//旋转编码器被按下{printf("Encoder downrn");}}}

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

模块移植成功案例代码:

链接:

提取码:LCKF审核编辑 黄宇

© 版权声明
评论 抢沙发
加载中~
每日一言
不怕万人阻挡,只怕自己投降
Not afraid of people blocking, I'm afraid their surrender