求教:用4988控制42步進電機,不能到達限位時立即返回
我学习arduino不久,想用它做点实用的东西。遇到以下问题尝试几天没弄好,求前辈指教!
思路:电机向前运动到限位A处回转,再向后运转到限位B处停止。限位A处没有物品时电机再向前运动。如此循环。
可是它不会到达光电限位开关处立即返回或停止,不知是编程的哪里出错?
之前用298N控制也不行,详见另一个求教贴(没人指导)
http://www.geek-workshop.com/thread-27042-1-1.html
void loop()
{
step(true, Y_DIR, Y_STP, 16000); //电机正转10圈,1600步为一圈约62mm
if(digitalRead(2)) //如果到达前方限位A时
step(false, Y_DIR, Y_STP, 16000); //电机反转
else
step(true, Y_DIR, Y_STP, 1600); //否则继续正转电机 正转1圈
delay(1000);
if(digitalRead(5)) //电机反转到达后方限位B时
step(true, Y_DIR, Y_STP, 800); //电机正转半圈
else
step(false, Y_DIR, Y_STP, 1600); //y轴电机 反转2圈
delay(1000);
} 限位开关相应的引脚在setup里面设置成输入,并且,if(digitalRead(5) == LOW or HIGH),最好这样写。 164335413 发表于 2016-7-7 09:07 static/image/common/back.gif
限位开关相应的引脚在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);
}
多加几个串口打印,输出至电脑屏
然后分析哪里应该运行到的,结果没运行
就可以确定那段代码需要完善。 step()未完成前不会进入下面的if,所以代码要改写
每前进或后退一小段距离就检测一次光电开关
看出来了,step()函数一旦执行,就要执行完,所以下面的判断没起到作用,把判断放到step函数中的for循环里。 164335413 发表于 2016-7-8 09:05 static/image/common/back.gif
看出来了,step()函数一旦执行,就要执行完,所以下面的判断没起到作用,把判断放到step函数中的for循环里。 ...
是这样的-------step()函数一旦执行,就要执行完,所以下面的判断没起到作用
可我改几个晚上了也没弄好:主要是后退到限位B点停止这部分不行,好象与前方物品拿走后再向前转动有点冲突。
我完全晕了。!!!
以前只是完全依案例实验可以,可自己重新设计一个案了就解不了。
有人能帮我改改吗?没正确的比对不知错在哪里。
如有我能帮忙的我也会的:如3D打印的一般制图与打印,电子知识也有一点点。
void step(boolean dir, byte dirPin, byte stepperPin, int steps)
{
digitalWrite(dirPin, dir);
delay(50);
while(digitalRead(5) == HIGH && steps>i){
digitalWrite(stepperPin, HIGH);
delayMicroseconds(800);
digitalWrite(stepperPin, LOW);
delayMicroseconds(800);
i++;
}
} 刚才没发全。
假如:先是向左转动,碰到左侧的开关,开关变为低电平(digitalRead(5) =LOW)while已经不满足条件,所以会出循环。后面的for循环是为了让开关再次变为高电平而做的反转一个小角度。
剩下的自己去分析
void step(boolean dir, byte dirPin, byte stepperPin, int steps)
{
i=0;
digitalWrite(dirPin, dir);
delay(50);
while(digitalRead(5) == HIGH && steps>i && digitalRead(5) == HIGH){
digitalWrite(stepperPin, HIGH);
delayMicroseconds(800);
digitalWrite(stepperPin, LOW);
delayMicroseconds(800);
i++;
}
digitalWrite(dirPin, ~dir);
delay(50);
for(i=0;i<50;i++)
{
digitalWrite(stepperPin, HIGH);
delayMicroseconds(800);
digitalWrite(stepperPin, LOW);
delayMicroseconds(800);
}
} 我真是太差了!又弄几天还是到后方时不停。试用do~while去编总是显示出错,不管怎么弄总好象差一点点。
要不请大神帮我写完编程发信息给我,如果OK暂付学费10元。回头我再对比错在哪里。
洞洞板焊好了,两个光电开关接2与3。挡住时高电平的。
页:
[1]