编码器">简单介绍EC11编码器
与开关相比,编码器是一种可以转动的东西。EC编码器并不复杂。
这种编码器实际上是在旋转过程中。
这张图解释了内部的简单结构,其中黄色是一个结点,我们成为了C,所以假设顺时针旋转时每次经过一个格子,必然是这个过程.(与上图相比,AB其实触点很窄,可以实现AB同时在C上,AB同时不在C上)
逆时针就是恰恰相反
中断触发A的下降边缘。
A下降沿触发-->检测B的电平
void pinA_falling_exit() //假设A下降沿中断进入函数 { if(readPin(pinB) == 1) ////读取B的电平 { //如果B电平高,顺时针转 } else { //如果B是高电平,是逆时针转 } }
每次点击一格触发函数。当然,顺时针或逆时针因编码器而异。
现在应该可以理解这种编码器的图了吧。
啊,我们只用了三只脚,EC另一边还有两个编码器干什么的?实际上,这是一个开关,EC作为一个小开关,11编码器可以垂直按下。
一般来说,C引脚,也就是最特别的引脚,是的EC编码器中间的引脚。
为什么用EC11编码器
最重要的特点是便宜!
大多数电位器不支持无限转动。我们需要的主要变化是在哪里转动?转了多少?配合声音玩蛇。
光电编码器分辨率较高等。
ec本质上是开关,有抖动。ec11旋转时有点击感(可能不是缺点)。
怎么消抖?
最便宜的方法 AC和BC各并联一个100nf小电容。
RC微积分电路、施密特触发器、施密特触发器推D触发器等电路。
不建议硬件延迟抖动。在音频游戏手台中,必须减少每1次ms的延迟。
事实上,如果编码器模拟鼠标的位置量,则不需要抖动。因为抖动带来的偏差对整体来说很小。
实测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); /// mouseData[MoveX] = -10; sendRepoet(mouseData); delay(); mouseData[MoveX] = 0; sendRepoet(mouseData); ////
一个问题是,我们经常以中断的方式进入这个函数,而延迟函数(中断优先级)可能无法用于中断,因此我们需要一些其他的解决方案。
STM32F103 HAL在仓库开发中,外部中断停止执行程序(默认中断优先级)
比如分开设置报文的代码段(主函数),发送报文的代码段(设置为定时器定时中断)分开等等...