164335413 发表于 2016-7-7 09:07 
限位开关相应的引脚在setup里面设置成输入,并且,if(digitalRead(5) == LOW or HIGH),最好这样写。
谢谢你的关心!
刚才在setup中设了pinMode(X, INPUT),也改成if(digitalRead(5) == HIGH)。效果还是不行。
应该是那几个if或else的次序与位置不对吧。
它总是走完后才会检测一次,不是光电开关有高电平立即改变电机转向。
一个周期只会暂停一下、再反向再转。去掉delay后也不会完全停下来。
能帮我改改编程吗?萬分期待!!
#define EN 7 //步进电机使能端,低电平有效
#define Y_STP 3 //y轴 步进控制
#define Y_DIR 6 //y轴 步进电机方向控制
/*
//函数:step 功能:控制步进电机方向,步数。
//参数:dir 方向控制, dirPin对应步进电机的DIR引脚,stepperPin 对应步进电机的step引脚, steps 步进的步数
//无返回值
*/
void step(boolean dir, byte dirPin, byte stepperPin, int steps)
{
digitalWrite(dirPin, dir);
delay(50);
for (int i = 0; i < steps; i++) {
digitalWrite(stepperPin, HIGH);
delayMicroseconds(800);
digitalWrite(stepperPin, LOW);
delayMicroseconds(800);
}
}
void setup(){//将步进电机用到的IO管脚设置成输出
pinMode(Y_DIR, OUTPUT);
pinMode(Y_STP, OUTPUT);
pinMode(EN, OUTPUT);
digitalWrite(EN, LOW);
pinMode(2, INPUT);
pinMode(5, INPUT);
}
void loop(){
step(true, Y_DIR, Y_STP, 16000); //y轴电机 反转2圈,1600步为一圈62mm
if(digitalRead(2)==HIGH) //到達前方限位時,電機反轉
step(false, Y_DIR, Y_STP, 16000); //y轴电机 反转2圈,1600步为一圈62mm
else
step(true, Y_DIR, Y_STP, 16000); //y轴电机 正转1圈,1600步为一圈62mm
delay(1000);
if(digitalRead(5)==HIGH) //到達后方限位時,電機反轉
step(true, Y_DIR, Y_STP, 800); //y轴电机 正转半圈,1600步为一圈62mm
else
step(false, Y_DIR, Y_STP, 16000); //y轴电机 反转2圈,1600步为一圈62mm
delay(1000);
}
|