我在嘗試用arduino控制步進電機做自動控制,遇到以下問題請高手指教一下:
思路:電機向前運動到限位A處回轉,再向后運轉到限位B處停止。限位A處沒有物品時電機再向前運動。如此循環。
可我發現電機停止后不是統一向前動,而有時向前有時向后。是編程的哪里出錯?或是有別的方法嗎?(如用4988控制板等)
另有一個問題,電機與298N控制板發熱嚴重。還在上網查學中。
程式如下:
int Pin0 = 8;
int Pin1 = 9;
int Pin2 = 10;
int Pin3 = 11;
int _step =0 ;
boolean dir; //= -1;正反转
int stepperSpeed = 20;//电机转速,1ms一步
void setup()
{
pinMode(Pin0, OUTPUT); //PIN8
pinMode(Pin1, OUTPUT); //PIN9
pinMode(Pin2, OUTPUT); //PIN10
pinMode(Pin3, OUTPUT); //PIN11
pinMode(4,INPUT);
pinMode(5,INPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
}
void loop()
{
if(digitalRead(4)) //到達前方限位時,電機反轉
{
up();
}
else{
down();
}
if(digitalRead(5)) //到達后方限位時,電機停止
{ digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
}
else{
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}
}
void down()
{
switch(_step){
case 0:
//stepperSpeed++;
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, HIGH);//32A
break;
case 1:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, HIGH);//10B
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, HIGH);
break;
case 2:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, HIGH);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
break;
case 3:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, HIGH);
digitalWrite(Pin2, HIGH);
digitalWrite(Pin3, LOW);
break;
case 4:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, HIGH);
digitalWrite(Pin3, LOW);
break;
case 5:
digitalWrite(Pin0, HIGH);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, HIGH);
digitalWrite(Pin3, LOW);
break;
case 6:
digitalWrite(Pin0, HIGH);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
break;
case 7:
digitalWrite(Pin0, HIGH);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, HIGH);
break;
default:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
break;
}
_step++;
if(_step>7){ _step=0; }
delay(stepperSpeed);
}
void up()
{
switch(_step){
case 0:
//stepperSpeed++;
digitalWrite(Pin0, HIGH);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);//32A
break;
case 1:
digitalWrite(Pin0, HIGH);
digitalWrite(Pin1, LOW);//10B
digitalWrite(Pin2, HIGH);
digitalWrite(Pin3, LOW);
break;
case 2:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, HIGH);
digitalWrite(Pin3, LOW);
break;
case 3:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, HIGH);
digitalWrite(Pin2, HIGH);
digitalWrite(Pin3, LOW);
break;
case 4:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, HIGH);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
break;
case 5:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, HIGH);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, HIGH);
break;
case 6:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, HIGH);
break;
case 7:
digitalWrite(Pin0, HIGH);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, HIGH);
break;
default:
digitalWrite(Pin0, LOW);
digitalWrite(Pin1, LOW);
digitalWrite(Pin2, LOW);
digitalWrite(Pin3, LOW);
break;
}
_step++;
if(_step>7){ _step=0; }
delay(stepperSpeed);
} |