搜索
bottom↓
回复: 15

求几个有关旋转编码开关程序思路的帖子链接

[复制链接]

出0入0汤圆

发表于 2020-4-29 13:37:55 | 显示全部楼层 |阅读模式
因搜索功能关闭,很难翻到这些帖子了。劳驾各位动手给出链接,多谢。

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2020-4-29 13:58:15 | 显示全部楼层
本帖最后由 lcw_swust 于 2020-4-29 14:00 编辑

思路啊,我是这样的:旋转编码器就是两路开关信号,在一个信号的下降沿读取另一个开关的电平值,是高电平就加一、是低电平则减一。
也可以定时读取两路开关的值,相当于两位二进制数,有4种状态,通过状态的变化来判断旋转方向和值。

出0入0汤圆

发表于 2020-4-29 14:26:51 | 显示全部楼层
有没有一圈100格那种

出0入0汤圆

 楼主| 发表于 2020-4-29 15:24:57 来自手机 | 显示全部楼层
lcw_swust 发表于 2020-4-29 13:58
思路啊,我是这样的:旋转编码器就是两路开关信号,在一个信号的下降沿读取另一个开关的电平值,是高电平就 ...

现在就用这种思路,太理论化了。实际使用效果是正反旋转方向判别都是对的,只是每转一格加或减的值都是好几个数,而且还不是定值

出0入0汤圆

发表于 2020-4-29 16:28:00 | 显示全部楼层
本帖最后由 lcw_swust 于 2020-4-29 16:31 编辑
master5888 发表于 2020-4-29 15:24
现在就用这种思路,太理论化了。实际使用效果是正反旋转方向判别都是对的,只是每转一格加或减的值都是好 ...


可能需要消抖,比如在开关上并电容。
用示波器看看才好。
我在产品中就是这种思路,定时查询,且并电容消抖。
还有就是编码器本身可能有接触不良,如示波器用久了旋钮调节有时会乱跳,拆开旋扭后扳一下弹片,加一点油就好了。

出1330入193汤圆

发表于 2020-4-29 16:30:48 | 显示全部楼层
https://www.amobbs.com/thread-4317619-1-1.html?_dsign=5e934b8d

https://www.amobbs.com/thread-5686734-1-1.html?_dsign=b3c2f012

出0入0汤圆

发表于 2020-4-29 16:44:35 | 显示全部楼层
nade 发表于 2020-4-29 14:26
有没有一圈100格那种

有啊,搜电子手轮,里面拆出来就是编码器

出30入54汤圆

发表于 2020-4-29 17:12:16 | 显示全部楼层
32的话直接用定时器的编码器功能就妥了

出0入0汤圆

 楼主| 发表于 2020-4-29 17:34:01 来自手机 | 显示全部楼层
lb0857 发表于 2020-4-29 16:30
https://www.amobbs.com/thread-4317619-1-1.html?_dsign=5e934b8d

https://www.amobbs.com/thread-568673 ...

谢谢。就是需要这种能实用的工程例子

出0入0汤圆

 楼主| 发表于 2020-4-29 17:35:08 来自手机 | 显示全部楼层
lcw_swust 发表于 2020-4-29 16:28
可能需要消抖,比如在开关上并电容。
用示波器看看才好。
我在产品中就是这种思路,定时查询,且并电容消 ...

是的,需要考虑消抖。并了电容效果也不是很好

出0入17汤圆

发表于 2020-4-29 17:46:18 | 显示全部楼层
下降/上升沿中断呢,在中断里面判断电平。

出0入0汤圆

 楼主| 发表于 2020-4-30 09:14:10 来自手机 | 显示全部楼层
HZKJ 发表于 2020-4-29 17:46
下降/上升沿中断呢,在中断里面判断电平。

原来用的就是上下沿中断判电平,稍微转动一下就加/减好几个数。今天改为只用下降沿中断判电平,一下好了,怎么转动都受控,完全没问题,真是奇了怪了,哈哈。注:引脚加电容消抖

出0入0汤圆

发表于 2020-4-30 09:29:57 | 显示全部楼层
要消抖可加上一颗 7474 的 FIFO 会更好处理些。

出0入21汤圆

发表于 2020-4-30 09:53:58 | 显示全部楼层
我给一个做货的程序给你,我直接复制出来的.
你放在100uS的中断里面运行.
KeySpinData2这个变量的bit7表示方向,bit0-6表示当前旋转的值.

  1. //=============================================================================//旋转编码器读取2
  2. void KeyScan2(void)
  3. {
  4.         static unsigned char UpState,OkState,Count;
  5.         unsigned char State,Flag;
  6.        
  7.         State=0;
  8.         Flag=0;
  9.         if(KEY_A2==0)        State |=0x02;
  10.         if(KEY_B2==0)        State |=0x01;
  11.        
  12.         if(UpState != State){
  13.                 UpState =State;
  14.                 Count=0;
  15.         }
  16.         else{
  17.                 if(Count<1){
  18.                         Count++;
  19.                 }
  20.                 else{
  21.                         if(OkState !=State){
  22.                                 if(OkState==0){
  23.                                         if(State==0x01){
  24.                                                 Flag=1;
  25.                                         }
  26.                                         if(State==0x02){
  27.                                                 Flag=2;
  28.                                         }
  29.                                 }
  30.                                 else if(OkState==3){
  31.                                         if(State==0x02){
  32.                                                 Flag=1;
  33.                                         }
  34.                                         if(State==0x01){
  35.                                                 Flag=2;
  36.                                         }
  37.                                 }
  38.                                
  39.                                 if(Flag==1){                //++
  40.                                         if(KeySpinData2 &0x80){
  41.                                                 if((KeySpinData2 &0x7F) <0x7F) KeySpinData2++;
  42.                                         }
  43.                                         else{
  44.                                                 KeySpinData2=1;
  45.                                         }
  46.                                         KeySpinData2 |=0x80;
  47.                                 }
  48.                                 else if(Flag==2){        //--
  49.                                         if(KeySpinData2 &0x80){
  50.                                                 KeySpinData2=1;
  51.                                         }
  52.                                         else{
  53.                                                 if((KeySpinData2 &0x7F) <0x7F) KeySpinData2++;
  54.                                         }
  55.                                         KeySpinData2 &=0x7F;
  56.                                 }
  57.                         }
  58.                         OkState =State;
  59.                 }
  60.         }
  61. }
复制代码

出0入17汤圆

发表于 2020-4-30 20:39:16 | 显示全部楼层
master5888 发表于 2020-4-30 09:14
原来用的就是上下沿中断判电平,稍微转动一下就加/减好几个数。今天改为只用下降沿中断判电平,一下好了 ...

上升或者下降沿 只能用一个呢,这是一个完整的周期。

出0入0汤圆

发表于 2020-5-2 23:51:50 | 显示全部楼层
学习了!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-28 11:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表