搜索
bottom↓
回复: 126

原创,可靠的旋转编码器解码程序,C语言编写,套用很方便(非中断,采用定时读IO方式,解码采用

  [复制链接]

出0入0汤圆

发表于 2011-12-30 20:17:50 | 显示全部楼层 |阅读模式
本程序用于测试,编译器采用CodeVisionAVR
#include <delay.h>
#include <mega8.h>

#define IN_A PINB.1
#define IN_B PINB.2
unsigned char encoder_now;//本次值
unsigned char encoder_ago;//上次值

flash signed char encoder_tab[4][4]=
{
{0        ,1        ,-1        ,0},
{-1,        0,        0,        1},               
{1        ,0,        0        ,-1        },
{0        ,-1        ,1        ,0        },       
};
signed char encoder_read(void)
{
    signed char a=0;
    unsigned char encoder_filter=0;  //滤波

    while(a<10)//判断次数,进行滤波
    {
        encoder_now=IN_A;
        encoder_now<<=1;
        encoder_now+=IN_B;
        if(encoder_filter==encoder_now)a++;
        else a=0;
        encoder_filter=encoder_now;
    }

    a=encoder_tab[encoder_now][encoder_ago];
    encoder_ago=encoder_now;
    return a;
}

main()
{
while (1)
      {

      switch(encoder_read())
      {
      case 1:
            PORTB.2=1;
          delay_ms(10);
      break;
      
      case -1:
            PORTB.3=1;
          delay_ms(10);
      break;
      
      case 0:
        PORTB.2=0;
        PORTB.3=0;
         
      break;
      }

      };

}

仿真波形图 (原文件名:未命名.JPG)


说明一下示波器输入A,B为模拟的编码器的两线输入波形,C,D为解码后的输出正负,和脉冲个数,值得一提的是实际编码器每拨动一格就会有两个脉冲输出,所以把连续的两个脉冲作为一个有效的加减标志可以提高可靠性(本例未体现)
粗略的推导过程ourdev_709097QY8GUZ.xls(文件大小:14K) (原文件名:推导过程.xls)
程序及仿真ourdev_709104R2A1F2.rar(文件大小:57K) (原文件名:程序.rar)


所用编码器图片 (原文件名:2011-12-30-20-30-47.jpg)


原理波形图 (原文件名:原理波形.jpg)

出0入0汤圆

发表于 2011-12-30 20:49:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-30 21:43:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-30 21:51:16 | 显示全部楼层
标记

出0入0汤圆

发表于 2011-12-30 22:05:51 | 显示全部楼层
先记号,再研究!

出0入0汤圆

发表于 2011-12-30 22:06:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-30 22:49:02 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2011-12-30 22:50:46 | 显示全部楼层
make coder

出0入0汤圆

发表于 2011-12-30 22:52:52 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-30 22:54:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-30 23:21:21 | 显示全部楼层
标它个记

出0入0汤圆

发表于 2011-12-30 23:33:20 | 显示全部楼层
学习学习

出0入97汤圆

发表于 2011-12-30 23:38:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-30 23:49:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-1 13:12:33 | 显示全部楼层
妙哉,妙哉!!!,简洁明了,很好用,谢谢

出0入0汤圆

发表于 2012-1-1 13:19:27 | 显示全部楼层
好贴marK一下

出0入0汤圆

发表于 2012-1-1 21:15:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-1 22:23:45 | 显示全部楼层
正要试试

出0入4汤圆

发表于 2012-1-1 22:31:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-1 22:52:02 | 显示全部楼层
好贴marK一下

出0入0汤圆

发表于 2012-1-1 22:59:55 | 显示全部楼层
好资料。mark

出0入0汤圆

发表于 2012-1-1 23:04:39 | 显示全部楼层
mark

出5入8汤圆

发表于 2012-1-2 14:55:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-2 20:09:18 | 显示全部楼层
while(a<10)//判断次数,进行滤波
    {
        encoder_now=IN_A;
        encoder_now<<=1;
        encoder_now+=IN_B;
        if(encoder_filter==encoder_now)a++;
        else a=0;
        encoder_filter=encoder_now;
    }
______________________________
请教LZ是怎样进行滤波的?好像是信号翻转?

出0入0汤圆

 楼主| 发表于 2012-1-2 20:52:54 | 显示全部楼层
encoder_now=IN_A;  
encoder_now<<=1;  
encoder_now+=IN_B;
是把两个独立输入数据合并成两位二进制数

if(encoder_filter==encoder_now)a++;  
else a=0;
是判断输入数据的稳定度,即上次数据与本次数据的对比相同,则累计a,累计满10次则为稳定的输入而退出循环,否则抛弃无效的干扰输入值,继续判断。(10次可以自己修改,越大越可靠性更好。但是也不宜过大,因为判断所占用的时间会增多,还会丢掉有效输入值)
encoder_filter=encoder_now;
是把本次的值保存一下,以便作为下次判断的上次数据

出0入0汤圆

发表于 2012-1-2 21:29:13 | 显示全部楼层
谢谢LZ的解释,滤波的时间间隔是不是也有要求,倘若速度特别慢,是不是有可能有一部分不能进行滤波?

出0入0汤圆

发表于 2012-1-3 00:20:10 | 显示全部楼层
现在太累了,过两天看

出0入134汤圆

发表于 2012-1-3 00:24:02 | 显示全部楼层
以后可能用到

出0入0汤圆

发表于 2012-1-3 01:20:57 | 显示全部楼层
支持强烈,预备中。

出0入0汤圆

发表于 2012-1-3 08:08:12 | 显示全部楼层
本摊Millwood0以前详细说过这个查表的方法,按键也可以这么用,而且连加功能实现起来很简单 

出0入0汤圆

发表于 2012-1-3 09:39:37 | 显示全部楼层
mark,旋转编码器.

出0入0汤圆

发表于 2012-1-3 14:05:01 | 显示全部楼层
MARk

出0入0汤圆

发表于 2012-1-3 20:09:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-4-17 19:49:27 | 显示全部楼层
xuexixuexi

出0入0汤圆

发表于 2012-4-18 09:41:16 来自手机 | 显示全部楼层
学习!谢谢楼主!

出0入0汤圆

发表于 2012-4-18 11:01:27 | 显示全部楼层
这个要mark一下。

出0入0汤圆

发表于 2012-4-18 11:21:23 | 显示全部楼层
你的程序还干点别的事情不?只做一个编码器还是很好的程序,要是各种中断信号都上来,你看看效果。
推荐使用价格低廉的CPLD做吧,或者推荐一款芯片LS7366专门做编码器解码的芯片

出0入0汤圆

发表于 2012-4-18 13:10:40 | 显示全部楼层
lvyunzeng 发表于 2012-4-18 11:21
你的程序还干点别的事情不?只做一个编码器还是很好的程序,要是各种中断信号都上来,你看看效果。
推荐使 ...

恩,确实。用扫描读IO方式是有局限性的,就算用定时器中断

5线的盘,6000RPM的速度估计这个程序就会干的很吃力。

出0入0汤圆

 楼主| 发表于 2012-4-18 17:57:30 | 显示全部楼层
采用定时调用子程序即可,主程序只是用于演示效果才这么做

出0入0汤圆

发表于 2012-4-18 18:16:03 | 显示全部楼层
上一个我写的,思路和楼主一样,定时中断采样A,B相,进入采样时,关闭中断,确保采样期间不受干扰

volatile uint8_t State[4] = {0x00};        //存储A,B相的状态,{00,10,11,01}:正转,
                                                //{00,01,0x11,10}:反转,A相在高位,B相在低位       
volatile uint16_t PulseCounter1=0;        //正转脉冲数
volatile uint16_t PulseCounter2=0;        //反转脉冲数,正反转并非绝对

void T0Init(void)
{
        TCNT0 = 0xA0;                        //中断时间0.8ms
        TIMSK |= _BV(TOIE0);        //使能T0的溢出中断
        TCCR0 = 0x03;                        //预分频为64,普通模式,无比较匹配
}

ISR(TIMER0_OVF_vect)
{
        cli();
        uint8_t i;
//        PORTD &= ~_BV(PD2);
        TCNT0 = 0xA0;
        if(State[3] != GetABStatus())
        {
                for(i=0;i<3;i++)
                        State[i] = State[i+1];
                State[3] = GetABStatus();
        }
        if((0x00 == State[0])&&(0x02 == State[1])&&(0x03 == State[2])&&(0x01 == State[3]))
        {
                State[0]=0;State[1]=0;State[2]=0;State[3]=0;
                PulseCounter1++;
                //UartSendStr("Dir = 0\r\n",20);       
        }
        if((0x00 == State[0])&&(0x01 == State[1])&&(0x03 == State[2])&&(0x02 == State[3]))
        {
                State[0]=0;State[1]=0;State[2]=0;State[3]=0;
                PulseCounter2++;
                //UartSendStr("Dir = 1\r\n",20);
        }
        sei();
}

出0入0汤圆

发表于 2012-4-18 21:29:37 | 显示全部楼层
正需要啊,谢谢

出0入0汤圆

发表于 2012-4-18 22:01:36 | 显示全部楼层
楼主给力,正好买了。

出0入0汤圆

发表于 2012-4-18 22:12:05 | 显示全部楼层
好思路,谢谢楼主

出0入0汤圆

发表于 2012-5-24 16:12:54 | 显示全部楼层
芳芳亮了 哈哈

出0入0汤圆

发表于 2012-5-24 17:10:45 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2012-5-25 17:27:12 | 显示全部楼层
先记号,谢谢楼主!!!

出0入0汤圆

发表于 2012-8-22 11:25:34 | 显示全部楼层
mark 旋转编码器

出0入0汤圆

发表于 2012-9-28 08:24:46 | 显示全部楼层
学习,谢谢!!!

出0入20汤圆

发表于 2012-9-28 08:28:57 | 显示全部楼层
支持一下

出0入0汤圆

发表于 2012-9-28 08:29:56 | 显示全部楼层
学习了,谢谢

出0入0汤圆

发表于 2012-9-28 08:34:23 | 显示全部楼层
mark, xue xi la

出50入10汤圆

发表于 2012-9-29 17:05:52 | 显示全部楼层
mark, xue xi la

出0入0汤圆

发表于 2012-10-18 16:41:44 | 显示全部楼层
想要学习还是得挖掘古墓!

出0入0汤圆

发表于 2012-10-18 16:48:52 | 显示全部楼层

mark  标记一下!

出0入0汤圆

发表于 2012-10-22 14:33:15 | 显示全部楼层
Thanks for sharing!

出0入0汤圆

发表于 2012-11-28 15:57:27 | 显示全部楼层
greatcai458 发表于 2012-4-18 17:57
采用定时调用子程序即可,主程序只是用于演示效果才这么做

LZ定时器设置的是多少时间扫描一次

出0入0汤圆

发表于 2012-12-28 15:18:03 | 显示全部楼层
赶巧要研究编码器,下载了试验一下。
谢谢楼主和楼上的分享!

出0入4汤圆

发表于 2013-1-19 15:18:53 | 显示全部楼层
想问楼主,值得一提的是实际编码器每拨动一格就会有两个脉冲输出,所以把连续的两个脉冲作为一个有效的加减标志可以提高可靠性(本例未体现)
这个做出来了没?

出0入4汤圆

发表于 2013-1-19 18:25:14 | 显示全部楼层
1ongquan 发表于 2012-1-3 08:08
本摊Millwood0以前详细说过这个查表的方法,按键也可以这么用,而且连加功能实现起来很简单  ...

兄弟,你说的Millwood0的查表方法给个链接吧·~~~3Q~~急求

出0入296汤圆

发表于 2013-1-19 18:35:57 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2013-1-19 18:46 编辑

假设函数IS_PIN_A_HIGH()和IS_PIN_B_HIGH()是读取A,B两个引脚的状态
假设有两个外中断INT0和INT1都已经配置为双边沿触发模式,则解码如下:

  1. //! 编码计数器

  2. static volatile uint32_t s_wQDCounter = 0;

  3. ISR(INT0_vect)
  4. {
  5.     if (IS_PIN_A_HIGH() && IS_PIN_B_HIGH()) {
  6.         s_wQDCounter++;
  7.     } else {
  8.         s_wQDCounter--;
  9.     }
  10. }

  11. ISR(INT1_vect)
  12. {
  13.     if (IS_PIN_A_HIGH() && IS_PIN_B_HIGH()) {
  14.         s_wQDCounter--;
  15.     } else {
  16.         s_wQDCounter++;
  17.     }
  18. }
复制代码
读取全局变量s_wQDCounter的时候别忘记加入中断保护。如果要追求效率,可以将计数器类型修改为uint16_t。

--------------------------
以上就是中断法,可以用引脚电平变化中断来做。上面的代码是4倍频。如果要2倍频,去掉任何一个中断处理程序即可。
如果要单倍频,选择任意一个外中断,并选择只对某个边沿触发即可。

多年测试,稳定可靠~
记住一句口诀:

任意边沿触发模式下,A和B进行电平比较:
对A触发的中断:同加异减
对B触发的中断:同减异加
反之亦然

总结到最后,就是 同加异减,同减异加

出0入0汤圆

发表于 2013-1-19 19:35:56 来自手机 | 显示全部楼层
mark         

出0入76汤圆

发表于 2013-1-20 00:09:58 | 显示全部楼层
本帖最后由 foxpro2005 于 2013-1-20 00:14 编辑
Gorgon_Meducer 发表于 2013-1-19 18:35
假设函数IS_PIN_A_HIGH()和IS_PIN_B_HIGH()是读取A,B两个引脚的状态
假设有两个外中断INT0和INT1都已经配置 ...


傻孩子大侠总结得不错,感觉软件上还应该增加抗干扰处理的部分...(在硬件上信号线最好用带屏蔽的线,或者在有的场合还可能要使用带Z相(零位)脉冲输出的正交编码器)。

出0入296汤圆

发表于 2013-1-20 00:17:20 | 显示全部楼层
foxpro2005 发表于 2013-1-20 00:09
傻孩子大侠总结得不错,感觉还应该增加上抗干扰处理的部分...


所谓的软件抗干扰,其实只是自己心里舒服,实际情况是,加不如不加(有干扰的时候,不是你加抗干扰就能解决的,
而是干扰本身会引入丢脉冲或错脉冲的问题,加了所谓的抗干扰算法并不能解决错脉冲的问题)……另外,现在
大部分芯片在IO口上都有硬件的Filter,基本上也不用担心这个问题。

出0入76汤圆

发表于 2013-1-20 00:29:16 | 显示全部楼层
如果用定时器扫描法来解码,感觉应该在抗干扰方面应该会好一点儿,但是编码器的线数(脉冲数)不能太高。

出0入0汤圆

发表于 2013-1-21 13:23:52 | 显示全部楼层
zhanyanqiang 发表于 2013-1-19 18:25
兄弟,你说的Millwood0的查表方法给个链接吧·~~~3Q~~急求

millwood是在一个帖子里面回复的程序,我也找不到了,不过程序很简单,我大概写一个,思路是一样的

/*******************************************************************************************************
-- FILE NAME        test.c
-- DISCRIPT        
-- COPYRIGHT
-- CREAT BY         Zhang Danhui longquanshuang@yahoo.cn
-- CREAT DATA       20121118
-- VISION           0.01
-- MODIFI
--
--
*******************************************************************************************************/
#include “rolltry.h”

/*******************************************************************************************************
* Function Name   - getRolltry
* Descripe        - 旋转编码旋钮的驱动,周期性调用这个函数,读取旋钮的增量
* Input           -
* Output          -
* Return          -
* Other           - PIN_A()  PIN_B() 是获取旋钮AB两个引脚电平的宏
*******************************************************************************************************/
int getRolltry(void ){
   
    const signed int slLookTable[] = {0, 1, -1, 1,####};/* 这个表需要自己建 */
    static unsigned char temp1;
   
    temp1 <= 2;
    temp1 &= 0xf0;
   
    if(PIN_A()) {
        temp1 |= 0x01;
    }  
    if(PIN_B()) {
        temp1 |= 0x02;
    }
    return slLookTable[temp1];

}
/*******************************************************************************************************
** End Of File
*******************************************************************************************************/

出0入0汤圆

发表于 2013-2-17 18:35:00 | 显示全部楼层
MARK!
家里有台海尔洗衣机用的就是旋转编码器,用了一年经常丢码出错,看上去这个小东西做得好还真不容易

出0入0汤圆

发表于 2013-3-21 09:47:21 | 显示全部楼层
1ongquan 发表于 2013-1-21 13:23
millwood是在一个帖子里面回复的程序,我也找不到了,不过程序很简单,我大概写一个,思路是一样的

/*** ...

你好,上面的表格我不是很明白。能否解释一下

出0入0汤圆

发表于 2013-3-21 14:33:35 | 显示全部楼层
很好 就是没看懂

出0入0汤圆

发表于 2013-3-21 15:52:17 | 显示全部楼层
还是用中断吧,用定时扫描既累还浪费资源,稍不注意还容易出现漏洞

出0入0汤圆

发表于 2013-3-21 16:13:59 | 显示全部楼层
mark         

出0入0汤圆

发表于 2013-3-27 17:48:53 | 显示全部楼层
标记 谢谢

出0入0汤圆

发表于 2013-3-27 18:14:03 来自手机 | 显示全部楼层
马克        

出0入0汤圆

发表于 2013-3-28 23:27:07 | 显示全部楼层
正在研究这个东西,学习了。谢谢!

出0入0汤圆

发表于 2013-4-16 11:11:09 | 显示全部楼层
Gorgon_Meducer 发表于 2013-1-20 00:17
所谓的软件抗干扰,其实只是自己心里舒服,实际情况是,加不如不加(有干扰的时候,不是你加抗干扰就能解 ...

能用软件消除硬件上的干扰码?
比如突然的脉冲,软件忽视之。

出0入296汤圆

发表于 2013-4-16 15:38:25 | 显示全部楼层
gujiamao_love 发表于 2013-4-16 11:11
能用软件消除硬件上的干扰码?
比如突然的脉冲,软件忽视之。

只要你的实际信号与干扰信号的频率差别很大,软件就是有办法的。工业上更常见的方法是采用Z相来进行
单圈复位。

出0入4汤圆

发表于 2013-4-16 16:06:10 | 显示全部楼层
不知谁的手可以拧6000RPM

出0入0汤圆

发表于 2013-4-23 19:41:21 | 显示全部楼层
Gorgon_Meducer 发表于 2013-4-16 15:38
只要你的实际信号与干扰信号的频率差别很大,软件就是有办法的。工业上更常见的方法是采用Z相来进行
单圈 ...

感谢回答。
举个例子吧,正常电平,突然一个毛刺,软件如何做才能避免这个毛刺呢。

出0入296汤圆

发表于 2013-4-23 23:24:35 | 显示全部楼层
gujiamao_love 发表于 2013-4-23 19:41
感谢回答。
举个例子吧,正常电平,突然一个毛刺,软件如何做才能避免这个毛刺呢。 ...

我提供的算法里面,是不处理这个问题的——我觉得硬件可以处理,一般IO都有Filter。
如果不采用我说的4倍频法,并且也没有硬件的IOFilter,则可以采用边沿触发法,就是
对某一个边沿设置中断,触发,触发以后,在中断处理程序里面连续采样多次,假设
我们识别到的是上升沿,那么在处理程序里面就检测电平是不是高电平,如果是,则
用一个专门的滤波计数器++,这个时候,并不退出中断处理程序,而是继续检测电平
看看是不是高电平——如果是,则继续++,如果不是,则--,如果减到0了,则说明
这是一次误触发,如果数值超过了预设的门限,则认定为是一个有效触发。一般对于
高频率毛刺,由于毛刺频率与 目标信号频率相差很多,则该算法可以有效滤除毛刺。

出0入0汤圆

发表于 2013-4-24 00:58:32 来自手机 | 显示全部楼层
谢谢分享了,很好的资料

出0入0汤圆

发表于 2013-4-24 07:41:36 | 显示全部楼层
学习,谢谢!!!

出0入8汤圆

发表于 2013-4-24 08:39:52 | 显示全部楼层
非常不错,慢慢研究一下

出0入0汤圆

发表于 2013-4-24 09:00:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2013-4-24 10:15:50 | 显示全部楼层
Gorgon_Meducer 发表于 2013-4-23 23:24
我提供的算法里面,是不处理这个问题的——我觉得硬件可以处理,一般IO都有Filter。
如果不采用我说的4倍 ...

除了感谢,没有别的了。

出0入0汤圆

发表于 2013-4-24 11:01:23 | 显示全部楼层
傻孩子分析得透彻

出0入0汤圆

发表于 2014-4-17 16:02:21 | 显示全部楼层
mark。。。

出0入0汤圆

发表于 2014-4-17 18:15:24 来自手机 | 显示全部楼层
学习标记

出0入0汤圆

发表于 2014-4-17 21:37:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2014-4-17 22:40:56 | 显示全部楼层
果断mark啊

出0入0汤圆

发表于 2014-10-6 17:02:03 | 显示全部楼层
本帖最后由 3DA502 于 2014-10-6 17:03 编辑
1ongquan 发表于 2013-1-21 13:23
millwood是在一个帖子里面回复的程序,我也找不到了,不过程序很简单,我大概写一个,思路是一样的

/*** ...


该代码1ms执行一次,本帖最靠谱代码

  1. int8_t  g_cRollCount;

  2. static const int8_t c_cRollBook[16] = {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 0};

  3.    
  4. void get_rolltry(int8_t * pRollCount)
  5. {
  6.      static uint8_t s_chPinTemp;
  7.      
  8.      s_chPinTemp <<= 2;
  9.      s_chPinTemp &= 0x0f;
  10.      
  11.      if(IS_ROLLTRY_B()){
  12.          s_chPinTemp |= 1;
  13.      }
  14.      
  15.     if(IS_ROLLTRY_A()){
  16.          s_chPinTemp |= 2;
  17.      }
  18.       
  19.      *pRollCount += c_cRollBook[s_chPinTemp];
  20.      
  21. }
复制代码

出0入0汤圆

发表于 2014-10-6 17:25:35 | 显示全部楼层
MARK一下

出0入0汤圆

发表于 2014-10-6 17:32:09 | 显示全部楼层
mark2014

出0入0汤圆

发表于 2014-10-9 17:11:50 | 显示全部楼层
3DA502 发表于 2014-10-6 17:02
该代码1ms执行一次,本帖最靠谱代码

你的表格滤掉了好多状态

出0入0汤圆

发表于 2014-10-9 17:23:31 | 显示全部楼层
泼个冷水,这个程序只能在低速使用,高速的速度跟不上,低速的如果是旋钮这些东西,只要方向不错,丢个把脉冲也无所谓

出0入0汤圆

发表于 2014-10-9 18:18:56 | 显示全部楼层
huangxiaolpbany 发表于 2014-10-9 17:23
泼个冷水,这个程序只能在低速使用,高速的速度跟不上,低速的如果是旋钮这些东西,只要方向不错,丢个把脉 ...

扫描方式速度是问题,可是不是所有芯片都有支持任意沿触发的中断的,比如51的外中断只有下降沿。所以读IO的方式还是得用。
速度不是每个地方都要求那么高的。有的设备用了测试尺寸用光电的那种,精度不是很高,所以低分辨率的也好,速度也不快。但是要求往复误差为0,即使没有Z相的帮助,没有机械开关参考的情况下,也一点不差,往复几万次,也不能有误差。所以方法很重要了。

出0入0汤圆

发表于 2014-10-10 16:10:53 | 显示全部楼层
请解释一下这句的意思:
a=encoder_tab[encoder_now][encoder_ago];

出0入0汤圆

发表于 2014-10-11 15:29:39 | 显示全部楼层
我发过一个程式,用一个中断,除中断设定程式,其它的一行搞定,没去抖,
http://www.amobbs.com/thread-4517043-1-1.html

出0入0汤圆

发表于 2015-5-18 17:39:18 | 显示全部楼层
Mark!学习一下

出0入0汤圆

发表于 2015-5-28 00:15:10 | 显示全部楼层
mark,看各位大神写的关于编码器的实例。受益匪浅

出0入0汤圆

发表于 2015-6-11 20:09:16 来自手机 | 显示全部楼层
marK   (≧3≦)

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-20 10:12

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

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