打印
[程序源码]

编码器产生误码

[复制链接]
1032|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
junyee|  楼主 | 2014-12-13 13:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
  以前以为编码开关和普通开关是一样的,向左旋则触发一路信号,向右则触发另一路信号.
  把实物焊接好才发现不是那么回事.用万用表量根本看不出区别,把开关拆了,还是看不懂.
  接上示波器,瞬间明了.

(这张图片是引用网络上的)

可以看出,在一路信号被拉低的过程中,另一路信号随旋转方向不同,会产生 方向相反的脉冲信号

我使用的是STM8S103F3P6 的单片机,
PA2 PA3 分别上拉10K,接至旋转编码器的两个输出脚,公共脚接地.

实现有两种方式,
一种是 定时检测,
在测试过程中发现就算一秒钟检测100次,也会有数据丢失的情况(旋得太快了).

只好改用中断检测:
思路是这样的,设PA3为下降沿触发中断. 在下降沿时PA2为高则判断是左转,为低则判断为右转.
看起来很简单啊?
在调试时发现仍然不妙,尝试旋转一下编码开关,从示波器中看到只有一个下降沿一个上升沿,可从调试信息来看.
它产生了数次中断.
这是什么原因呢???请大侠指教!!!
难道是硬件抖动?于是我串个电容到编码开关上,效果依然不理想.
只好软件消抖了,如下:

#include "common.h"

u8 delay_EXTI=0;

void EXTI_Init()//外部中断初始化
{
  EXTI_CR1=0X02;//PA口下降沿触发中断
}

#pragma vector=0x05
__interrupt void EXTI_PA()
{
  if (delay_EXTI !=0) return;

//  UART1_SendU8(PA_IDR);
  if (PA_IDR_IDR3 ==0)
  {
    if (PA_IDR_IDR2 ==1)
    {
      UART1_SendStr("left  ");
    }
    else
    {
      UART1_SendStr("right ");
    }
  }
  delay_EXTI = 10 ;
}


delay_EXIT 被定时器每MS一次,不断地减1,直至到0.
能看到效果了.

只是仍然产生了不少误码.





怎么办,没辄了.


相关帖子

沙发
mazhao141| | 2014-12-13 23:37 | 只看该作者
本帖最后由 mazhao141 于 2014-12-14 00:12 编辑

你为什么不用定时器捕获?STM8S的定时器提供了专门的编码器接口。详见 手册Encoder interface mode这一节。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
junyee + 1 谢谢我看看手册先
板凳
coody| | 2014-12-14 11:47 | 只看该作者
其是有相位的两路脉冲A、B。
其实最简单的方式是:任意一路脉冲接外中断,在中断中判断另一路的电平句顶方向。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
junyee + 1 我就是这样做的.
地板
cauhorse| | 2014-12-14 16:14 | 只看该作者
这个用正交编码接口处理不是正好嘛。

使用特权

评论回复
5
junyee|  楼主 | 2014-12-17 15:51 | 只看该作者
谢谢大家,我的问题解决了.

每当发生中断后如果 PA2,PA3 不复位(高电平)的话,忽略后面的中断.
这样正常使用的情况下,就基本上看不到误码了.

谢谢大家,,因为TIM1 太复杂了,没用上,也就没留意到这个 定时器中的编码器接口

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

251

帖子

6

粉丝