极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11198|回复: 1

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

[复制链接]
发表于 2014-12-2 13:10:26 | 显示全部楼层 |阅读模式
写了一个控制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);
}}
回复

使用道具 举报

 楼主| 发表于 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);
}}
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-9 17:09 , Processed in 0.032530 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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