[模块]EC11旋转编码器

功能说明

编码器有什么用
配合UI设计
点击选择 长按退出 正反转加减

特点:采用增量编码器可以规避信号抖动引起的误差;

引脚说明

[模块]EC11旋转编码器_第1张图片

信号输出

A B 信号的差分输出,转到一个卡点,信号转动一个周期;
旋转一周 20个周期;
有些还有Z相,其中AB相是用来计数,z相输出零点信号。
[模块]EC11旋转编码器_第2张图片
在这里插入图片描述

使用逻辑分析采集信号:
逆时针
[模块]EC11旋转编码器_第3张图片

顺时针
[模块]EC11旋转编码器_第4张图片

硬件设计

电路 参考xxx

[模块]EC11旋转编码器_第5张图片
滤波消抖
[模块]EC11旋转编码器_第6张图片

芯片自带编码

这种方案可以有效防止数据抖动的影响

软件设计

使用MX(HAL)

[模块]EC11旋转编码器_第7张图片
采用双边计数(4倍)提高了精度。

软件编码

初始化编码器

HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim,  TIM_Encoder_InitTypeDef *sConfig)

开启编码器

HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel)

定时读取当前的编码绝对值:(逆时针转动增大,顺时针转动减小)

encode_cnt =  __HAL_TIM_GET_COUNTER(&htim3);

判断当前的转动方向:

encode_dir =  __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3);

设置编码器当前数值:

__HAL_TIM_SetCounter(&htim3,100);

应用-编码器控制PWM占空比

舵机控制周期在20ms(频率为50Hz,对于72M主频软件计数器采用72-1分频,计数周期为20000个数),0.5ms-2.5ms(对应计数范围在500-2500,变范围为在0-2000)依次对应0度到180度;
对于PWM需要设置占空比数据在500-2500之间;

PWM的配置

[模块]EC11旋转编码器_第8张图片
[模块]EC11旋转编码器_第9张图片

转换关系

该数值不受旋转编码器绝对值的影响,又因为在编码器读计数的过程中涉及到溢出wrap的问题(0往下就回到65535),不利于数值的计算;

为方便计算,将编码的初值设置在其他位置,比如100;这样及规定了编码的数据范围,简化了对于0点位置的数值计算问题。

 if(encode_cnt < 100)
    {
      __HAL_TIM_SetCounter(&htim3,100);
    }
    else if(encode_cnt > 180)
    {
      __HAL_TIM_SetCounter(&htim3,180);
    }

假设:将旋转1周对应到舵机180度的变化;1周则编码内计数为1420 对应到PWM数值范围0-2000;通过读取编码器的绝对值,转换后设置PWM:

pwmVal = 500 + (encode_cnt - 100)*25;//500-2500 20ms-20000
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, pwmVal);

测速应用

在计算速度需要用到编码器的增量值,方向通过编码器方向自动判断;
增量值 = 当前值 - 之前值(数值是无符号整形,故不考虑过0溢出的问题)
假设是轮组,带有减速机构,减速比R;
转动角度= 编码器增量值/软件计数倍数(上下计数则是4倍)/编码器线数/减速比RX2PI
角速度 = 转动角度/编码器采样周期
线速度 = 角速度 X 轮径

参考资料

你可能感兴趣的:(单片机)