|
|
写了一个控制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);
}} |
|