简单介绍EC11编码器
相比于开关,编码器是一个可以转的东西。EC11编码器并不复杂。
![](https://img-blog.csdnimg.cn/6a57bdb62c624f38b54edb4eb426e7d7.png)
这样的编码器在旋转的过程中,其实就是3个引脚的导通状态发生变化。
这张图阐明了内部的简单结构,其中黄的地方是一个结点,我们成为C,那么在假设在顺时针转动的时候每经过一个格子,必然是A和C导通-->B和C导通-->A和C不导通-->B和C不导通这个过程.(比起上图上的,AB触点其实很窄,可以实现AB同时在C上,AB同时不在C上)
逆时针的话就是B和C导通-->A和C导通-->B和C不导通-->A和C不导通正好反过来了
如果我们给AB一个上拉电压,C接到负极,就形成了上图的波形。
我们进行一个对A下降沿的中断触发。
A下降沿触发-->检测B的电平
void pinA_falling_exit() //假设A下降沿中断发生进入这个函数
{
if(readPin(pinB) == 1) //读取一下B的电平
{
//如果B是高电平,是顺时针转
} else {
//如果B是高电平,是逆时针转
}
}
每次咔咔转一格触发一次函数。当然顺时针还是逆时针因编码器不同而不同了。
现在应该可以理解这种编码器的图了吧。
哎,我们只用到了3个脚,EC11编码器另一面还有2个是干什么的呢?其实那是个一开关,EC11编码器可以垂直按下去,当一个小开关。
一般来说C引脚,也就是最特殊的那个引脚,是EC11编码器中间的那个引脚。
为什么用EC11编码器
最主要的特点是-----便宜!
为什么用电位器?
大多数电位器不支持无限转。而且我们主要需要的变化量是往哪边转?转了多少?来配合音游玩蛇。
有更好的编码器供选择吗?
有分辨率更高的光电编码器等等。
EC11的缺点
ec11本质上是开关,存在消抖。ec11转动的时候有咔咔的手感(可能不是缺点)。
怎么消抖?
最便宜的方法 AC和BC各并联一个100nf小电容。
RC微积分电路,施密特触发器,施密特触发器推D触发器等各种电路。
不推荐硬件延时消抖,在音游手台中,务必减小每1ms的延迟。
为什么要消抖?
其实如果编码器模拟鼠标这种位置量的话不太需要消抖的。因为抖动带来的偏差对于整体微乎其微。
机械键盘按键需要消抖吗?
实测1000hz回报率也不需要。
编码器模拟
加上编码器,可以很好的模拟鼠标等操作。
鼠标报文8bit x 4
只需发送一个位移量就好了。
#define MoveX 1;
#define MoveY 2;
uint8_t mouseData[] = {0, 0, 0, 0};
mouseData[MoveX] = 10;
sendRepoet(mouseData);
delay();//必须大于回间隔时间
mouseData[MoveX] = 0;
sendRepoet(mouseData);
//鼠标X轴向右移动10
mouseData[MoveX] = -10;
sendRepoet(mouseData);
delay();
mouseData[MoveX] = 0;
sendRepoet(mouseData);
//鼠标X轴向左移动10
存在一个问题在于,我们往往是以中断的方式进这个函数,而中断里面往往有可能不能使用延时函数(中断优先级),那么就需要一些别的解决方法。
STM32F103 HAL库开发中,外部中断中使用HAL_Delay();会让程序停止执行(默认的中断优先级)
比如分开设置报文的代码段(主函数),发送报文的代码段(设置为定时器定时中断)分开等等.....