|
|
本帖最后由 Hasense.Yan 于 2015-1-7 17:12 编辑
1.问题背景:用Arduino Uno测速旋转编码器,用得到的数据及时驱动步进马达旋转,希望达到速度同步,及编码器旋转速度快,则马达转速快.
2.编程思路: 在LOOP循环中实时检测编码器A B信号.完用定时器中断每隔500ms取一次计数值
3.现在问题: 在中断函数中查看计数值(代码备注中的//****AA处),数值显示正常,一旦跳出中断函数,在其它位置查看计数值(如备注中的//******BB处),则数据显示错误.- #include "MsTimer2.h"
- const int Plu = 6; //步进马达脉冲
- const int Dir = 7; //步进马达方向
- const int BtnS1 = 4;
- const int BtnS10 = 3;
- const int EA = 8; // 编码器信号A
- const int EB = 9; // 编码器信号B
- volatile unsigned long intNspeed ; // 编码器反向旋转计数
- volatile unsigned long intPspeed; // 编码器正向旋转计数
- volatile unsigned long intspeed; // 编码器旋转计数
- unsigned long tStop1 ,tStop2;
- int intperiod;
- boolean bState,bspeed;
- boolean bRun,bStop;
- void Step(unsigned int ratio) // 驱动步进函数
- {
- digitalWrite(Plu,HIGH);
- delayMicroseconds(ratio);
- digitalWrite(Plu,LOW);
- delayMicroseconds(ratio);
- }
- void Speed() // 定时中断函数
- {
- if(intNspeed>0)
- {
- intspeed=intNspeed;
-
- }
- if(intPspeed>0)
- {
- intspeed=intPspeed;
-
- }
- intNspeed=0;
- intPspeed=0;
- //Serial.println(intspeed); //**********AA 此处数据显示正常(0到200变化)
- }
- void setup()
- {
- Serial.begin(9600);
- intperiod=500;
- pinMode(4, OUTPUT);
- pinMode(13, OUTPUT);
- pinMode(Plu, OUTPUT);
- pinMode(Dir, OUTPUT);
- pinMode(BtnS1, INPUT_PULLUP);
- pinMode(BtnS10, INPUT_PULLUP);
-
- MsTimer2::set(intperiod, Speed); // 500ms period
- MsTimer2::start();
- bState=false;
- intNspeed=0;
- intPspeed=0;
- intspeed=0;
- }
- void loop()
- {
- if(!bspeed) //
- {
- if(digitalRead(EA)==HIGH && bState==LOW)
- {
-
- if(digitalRead(EB)==HIGH)
- {
- intNspeed++;
- digitalWrite(Dir,LOW);
- bRun=true;
- }
- else
- {
- intPspeed++;
- digitalWrite(Dir,HIGH);
- bRun=true;
-
- }
- }
- bState=digitalRead(EA);
- }
- // 判断旋转编码器停止
- if(((digitalRead(EA)==HIGH && digitalRead(EB)==HIGH) || (digitalRead(EA)==LOW && digitalRead(EB)==LOW)|| (digitalRead(EA)==HIGH && digitalRead(EB)==LOW)|| (digitalRead(EA)==LOW && digitalRead(EB)==HIGH))&& bRun)
- {
- if(!bStop)
- {
- tStop1=millis();
- bStop=true;
- }
- tStop2=millis();
- if((tStop2-tStop1)>100)
- {
- bStop=false;
- bRun=false;
- tStop1=0;
- tStop2=0;
- }
- }
- else
- {
- bStop=false;
- tStop1=0;
- tStop2=0;
- }
- /////////////
- if(bRun)
- {
- //Serial.println(intspeed); //**********BB 显示不正常(0到20 不正确跳变)
- Step(intspeed);
-
- }
- }
复制代码 求大神指点,为何两处显示同一数据,但值不一样
或有更好的方案处理旋转编码器实时驱动步进电机,谢谢... |
|