for 发表于 2014-3-4 01:36:50

旋转编码器能控制步进电机吗?:)

for 发表于 2014-3-5 16:05:35

楼主有木有想用这个控制步进电机做闭环用?

savagego 发表于 2014-3-15 15:40:58

pww999 发表于 2012-8-5 19:51 static/image/common/back.gif
试了一下

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


多次中断了,设置改一下把

darkorigin 发表于 2014-5-4 20:33:17

pww999 发表于 2012-7-30 07:51 static/image/common/back.gif
单片机都是单线程的吧?
程序都是由上往下执行?
往往用IF 判断 是否继续写作业 还是水开了要处理一下? ...

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

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

darkorigin 发表于 2014-5-4 20:35:19

勤奋工作 发表于 2013-3-31 16:05 static/image/common/back.gif
楼主的方法在电机低速情况下可用,电机转速一高则无法识别。因为楼主判正转,反转的方法是用延时来识别的, ...

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

太行摄狼 发表于 2014-11-25 15:45:33

谁有更详细的资料啊

1090805647 发表于 2014-11-25 16:19:10

很有用,可能会用到。

tcsuowk001 发表于 2015-2-4 08:56:52

已亲试,效果不错,且对程序进行了中和:用中断0数脉冲,用digitalread判断方向,节省中断;不过使用的是工业选装编码器,400线的,转速慢还可以,稍高即丢数。
请高人解决!

葱拌豆腐 发表于 2015-5-19 11:39:35

一个中断就可以实现正反转计数了,另外,两个中断可以读取Z相信号,实现零点定位。#define ONE_CIRCLE 334//pulse counts of one circle
#define GEAR_RATIO 46.8   

const int APin = 2;
const int BPin = 3;
long PulseCounts = 0;
long Circles = 0;
float Angle;
boolean Dir;
long OldCounts;
float Speed;
void setup()
{
   Serial.begin(9600);
   
   pinMode(APin,INPUT);
   pinMode(BPin,INPUT);
   attachInterrupt(0,GetPulseCounts,RISING);
}

void loop()
{
   Speed = (PulseCounts-OldCounts)*360/15631*2; //334*46.8=15631
   OldCounts=PulseCounts;
   Angle = (PulseCounts % 15631)*360/15631;
   Serial.print(PulseCounts);
   Serial.print("---------");
   Serial.print(Angle);
   Serial.print("-------");
   Serial.println(Speed);
   delay(500);
}

void GetPulseCounts()
{
   int tempAPin = digitalRead(APin);
   int tempBPin = digitalRead(BPin);
   if(tempAPin != tempBPin)
   {
   PulseCounts++;
   Dir = true;
   }
   else
   {
   if(PulseCounts <= 0)
   {
       PulseCounts += 15631;
   }
   PulseCounts--;
   Dir = false;
   }
   
}

kevinfrankchen 发表于 2015-5-23 23:13:27

我用pcduino 外部中断测速,稍微快一点点就不行了。。。丢的太厉害了。。。楼主有什么好方法?

kevinfrankchen 发表于 2015-5-23 23:41:46

小黑 发表于 2012-7-27 18:09 static/image/common/back.gif
有没有计数的中断啊(我也不知道啊 )我看着上面写的那个中断太频繁了

我这pcduino就是外部中断过于频繁,丢的特别多。。

kevinfrankchen 发表于 2015-5-23 23:43:00

tcsuowk001 发表于 2015-2-4 08:56 static/image/common/back.gif
已亲试,效果不错,且对程序进行了中和:用中断0数脉冲,用digitalread判断方向,节省中断;不过使用的是工 ...

你这测试能最高能到多少?

rqchen12221004 发表于 2015-12-17 21:03:06

tcsuowk001 发表于 2015-2-4 08:56 static/image/common/back.gif
已亲试,效果不错,且对程序进行了中和:用中断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电压时高时低。
页: 1 [2]
查看完整版本: 也谈Arduino与旋转编码器的两种连接方式(中断方式,普通D口)