极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: supercctv

也谈Arduino与旋转编码器的两种连接方式(中断方式,普通D口)

  [复制链接]
发表于 2014-3-4 01:36:50 | 显示全部楼层
旋转编码器能控制步进电机吗?
回复 支持 反对

使用道具 举报

发表于 2014-3-5 16:05:35 | 显示全部楼层
楼主有木有想用这个控制步进电机做闭环用?
回复 支持 反对

使用道具 举报

发表于 2014-3-15 15:40:58 | 显示全部楼层
pww999 发表于 2012-8-5 19:51
试了一下

中断计数时有时会数值突变成好几百,或者几千,不准确

多次中断了,设置改一下把
回复 支持 反对

使用道具 举报

发表于 2014-5-4 20:33:17 | 显示全部楼层
pww999 发表于 2012-7-30 07:51
单片机都是单线程的吧?
程序都是由上往下执行?
往往用IF 判断 是否继续写作业 还是水开了要处理一下? ...

中断是具有优先的。和单线程没关系
不管是单片机还是pc
基于硬件的。
系统会自动对当前的寄存器进行堆栈操作,然后跳转到指定的过程,执行之后 会自动恢复堆栈里的数据到寄存器
和IF没关系 工作在二进制层,高级语言部分只需要声明中断就好 具体的代码处理会交给编译以及硬件处理;

说个最简单的例子, 386直到奔四电脑都是单线程的
运行MSDOS或者PCDOS的时候 执行一个程序  如果需要中断它 那么你就需要按CTRL+BREAK 那么程序就会被中断,因为键盘硬件的中断响应层级高。然后告诉DOS系统 需要执行“停止当前程序”的功能
中断在单片机还有很多PC的场合都是硬件级的。
PC系统死机之后 很多人选择按住电源8秒实现强制关机 这也是中断,尽管CPU已经死锁(其实就是逻辑死循环)但是这个中断是最高权限的。
回复 支持 反对

使用道具 举报

发表于 2014-5-4 20:35:19 | 显示全部楼层
勤奋工作 发表于 2013-3-31 16:05
楼主的方法在电机低速情况下可用,电机转速一高则无法识别。因为楼主判正转,反转的方法是用延时来识别的, ...

这个编码器主要是用来作为开关用的,不是用来测量电机速度的 ,楼主的代码还加了过滤的代码 3MS以内的记数都会被河蟹成1
回复 支持 反对

使用道具 举报

发表于 2014-11-25 15:45:33 | 显示全部楼层
谁有更详细的资料啊
回复 支持 反对

使用道具 举报

发表于 2014-11-25 16:19:10 | 显示全部楼层
很有用,可能会用到。
回复 支持 反对

使用道具 举报

发表于 2015-2-4 08:56:52 | 显示全部楼层
已亲试,效果不错,且对程序进行了中和:用中断0数脉冲,用digitalread判断方向,节省中断;不过使用的是工业选装编码器,400线的,转速慢还可以,稍高即丢数。
请高人解决!
回复 支持 反对

使用道具 举报

发表于 2015-5-19 11:39:35 | 显示全部楼层
一个中断就可以实现正反转计数了,另外,两个中断可以读取Z相信号,实现零点定位。
  1. #define ONE_CIRCLE 334  //pulse counts of one circle
  2. #define GEAR_RATIO 46.8   

  3. const int APin = 2;
  4. const int BPin = 3;
  5. long PulseCounts = 0;
  6. long Circles = 0;
  7. float Angle;
  8. boolean Dir;
  9. long OldCounts;
  10. float Speed;
  11. void setup()
  12. {
  13.    Serial.begin(9600);
  14.    
  15.    pinMode(APin,INPUT);
  16.    pinMode(BPin,INPUT);
  17.    attachInterrupt(0,GetPulseCounts,RISING);
  18. }

  19. void loop()
  20. {
  21.    Speed = (PulseCounts-OldCounts)*360/15631*2; //334*46.8=15631
  22.    OldCounts=PulseCounts;
  23.    Angle = (PulseCounts % 15631)*360/15631;
  24.    Serial.print(PulseCounts);
  25.    Serial.print("---------");
  26.    Serial.print(Angle);
  27.    Serial.print("-------");
  28.    Serial.println(Speed);
  29.    delay(500);
  30. }

  31. void GetPulseCounts()
  32. {
  33.    int tempAPin = digitalRead(APin);
  34.    int tempBPin = digitalRead(BPin);
  35.    if(tempAPin != tempBPin)
  36.    {
  37.      PulseCounts++;
  38.      Dir = true;
  39.    }
  40.    else
  41.    {
  42.      if(PulseCounts <= 0)
  43.      {
  44.        PulseCounts += 15631;
  45.      }
  46.      PulseCounts--;
  47.      Dir = false;
  48.    }
  49.    
  50. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2015-5-23 23:13:27 | 显示全部楼层
我用pcduino 外部中断测速,稍微快一点点就不行了。。。丢的太厉害了。。。楼主有什么好方法?
回复 支持 反对

使用道具 举报

发表于 2015-5-23 23:41:46 | 显示全部楼层
小黑 发表于 2012-7-27 18:09
有没有计数的中断啊  (我也不知道啊 )  我看着上面写的那个中断太频繁了

我这pcduino就是外部中断过于频繁,丢的特别多。。
回复 支持 反对

使用道具 举报

发表于 2015-5-23 23:43:00 | 显示全部楼层
tcsuowk001 发表于 2015-2-4 08:56
已亲试,效果不错,且对程序进行了中和:用中断0数脉冲,用digitalread判断方向,节省中断;不过使用的是工 ...

你这测试能最高能到多少?
回复 支持 反对

使用道具 举报

发表于 2015-12-17 21:03:06 | 显示全部楼层
tcsuowk001 发表于 2015-2-4 08:56
已亲试,效果不错,且对程序进行了中和:用中断0数脉冲,用digitalread判断方向,节省中断;不过使用的是工 ...

转速达到多少时就丢数?最近也是用到这个
回复 支持 反对

使用道具 举报

发表于 2016-7-17 12:28:03 | 显示全部楼层
mark.平衡小车的编码器也是这样吗?
回复 支持 反对

使用道具 举报

发表于 2017-4-7 22:13:58 | 显示全部楼层
另外我也分享一下。  刚刚测试没连接电容会乱跳。 后来加了104 电容就稳定多了。 不过 如果CLK (A端)和 DT (B端) 同时都加104电容还是有点不稳定。 之后我只是 在CLK加了电容, DT 不加, 基本上没问题了。 估计是DT加电容时有时导致DT电压时高时低。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-29 11:46 , Processed in 0.047873 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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