本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
旋转编码器介绍
旋转编码器(也叫旋钮编码器)是用来测量转速并配合PWM技术可以实现快速调速的装置,光电式旋转编码器通过光电转换,可将输出轴的角位移、角速度等机械量转换成相应的电脉冲以数字量输出(REP)。
这次介绍的是更加适合做些小实验的微型旋转编码器,总共4个引脚(5个引脚的旋转编码器多了个可确定圈数的z相)。
相关的外形图及原理图
外形图
旋转编码器底部的外形图如下图所示,A,B,C,E分别为连接到微控制器或电源的4个引脚。其中,A,B是编码信号发送相关引脚,C接地,E为按键相关引脚。
原理图
(C,E引脚与外形图不一样,但一般C引脚接地,而E引脚为按键相关引脚)
这里的CLK是指时钟线,DT是指信号信号线(data),DT和CLK都是指输出端,但本质没有什么区别,芯片通过比较这两个输出信号的差别确定旋转编码器的旋转方向。
原理
旋转编码器的内部原理图可视为:
视灰色部分为高电平,橙黄色部分为低电平,则旋转时,必定会有1个引脚输出电平先变化,并且旋转方向不同时,先变化电平的引脚不同,以逆时针旋转为例,产生的信号如下图所示。
通过分析信号,系统可以确定旋钮的旋转方向
代码配置
在此先说明一下,我用的微型旋转编码器旋转起来是一卡一卡的,并不流畅。然后通过测试发现,每‘卡’一次,Rotary_A,B都是由0变1或是由1变0,但有先后。(上述原理仍适用)
//旋转编码器
u8 XZBMQ_Data=0;//编码值
u8 Flag=9;//设置一个值,初始值不是0/1即可
void XZBMQ_Scan_Drive()
{
if (Rotary_A==Rotary_B)//Rotary_A,B即为旋转编码器的两个输出脚
{
Flag=Rotary_A;
}
if(Flag==0)
{
if (Rotary_A!=Rotary_B)
{
if (Rotary_A==1)
XZBMQ_Data++;
else
XZBMQ_Data--;
Flag=9;//变为初始值,防止错误
}
}
if(Flag==1)
{
if (Rotary_A!=Rotary_B)
{
if (Rotary_B==1)
XZBMQ_Data++;
else
XZBMQ_Data--;
Flag=9;
}
}
}