Arthur1088 发表于 2014-12-2 13:10:26

2相步进电机实现循环正反转的控制问题,请帮忙看看程序~~~

写了一个控制2相步进电机正反转时间间隔为5s的程序。但是调试时结果是:先正转5s,然后一直反转下去了。。。。。请帮忙看看loop()里面是什么问题?
int IN1=8;
int IN2=9;
int IN3=10;
int IN4=11;
int key=7;
unsigned long stepon=5000;
unsigned long stepoff=5000;
boolean direct=true;
int steps=0;
int stepstat;
//unsigned long time=millis();
void setup()
{
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(key,INPUT);
stepstat=HIGH;
}
void step_code(int steps)
{
switch(steps)
{
case 1:
{
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
break; }

case 2:
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
break;}

case 3:
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
break;}

case 4:
{
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
break;}
default:
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);
break;}
}
}

boolean key_scan() //检测外部按键是否有按下;
{
if(digitalRead(key) == HIGH)
{
delay(10); //前沿延时消抖;
if(digitalRead(key) == HIGH)
{ direct = ! direct;} //有按下,取反direct;
while(digitalRead(key) == HIGH); //等待按键松开,后沿不消抖处理;
}
return direct;
}
void loop()
{
while(1)
{
   if(key_scan())
{unsigned long time=millis();
    if( stepstat=HIGH)
{   if(time<stepon)
         { steps ++;
         if(steps > 4) steps = 1; }
    else
    if(time>stepon)
       {stepon=time;            //记录当前时间长度,第一次为500ms,赋值给ledOn
      stepoff=time+5000;
      {steps --;
         if (steps < 1) steps = 4; }
         stepstat=LOW;
       //   { steps ++;
       //   if(steps > 4) steps = 1; }
      }
}   
   else if( stepstat=LOW)
         if(time>stepoff)
       {stepoff=time;
       stepon=time+5000;
       { steps ++;
      if(steps > 4) steps = 1; }
      stepstat=HIGH;
       //    {steps --;
       //    if (steps < 1) steps = 4; }
       }
}
else
steps=0;
step_code(steps);
delay(20);
}}

Arthur1088 发表于 2014-12-2 15:14:35

修改了一下 还是没反应
int IN1=8;
int IN2=9;
int IN3=10;
int IN4=11;
int key=7;
unsigned long timegap=5000;
unsigned long begintime=0;
boolean direct=true;
int steps=0;
//int stepstat=HIGH;
void setup()
{
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(key,INPUT);
}
void step_code(int steps)
{
switch(steps)
{
case 1:
{
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
break; }

case 2:
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
break;}

case 3:
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
break;}

case 4:
{
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
break;}
default:
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);
break;}
}
}

boolean key_scan() //检测外部按键是否有按下;
{
if(digitalRead(key) == HIGH)
{
delay(10); //前沿延时消抖;
if(digitalRead(key) == HIGH)
{ direct = ! direct;} //有按下,取反direct;
while(digitalRead(key) == HIGH); //等待按键松开,后沿不消抖处理;
}
return direct;
}
void loop()
{
while(1)
{
   if(key_scan())
{unsigned long time=millis();
if(time-begintime>timegap)
{begintime=time;
//if(stepstat==HIGH)
{steps --;
       if (steps < 1) steps = 4; }
}
else
{ steps ++;
      if(steps > 4) steps = 1; }
}
else
steps=0;
step_code(steps);
delay(20);
}}
页: [1]
查看完整版本: 2相步进电机实现循环正反转的控制问题,请帮忙看看程序~~~