极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18093|回复: 9

求教:用4988控制42步進電機,不能到達限位時立即返回

[复制链接]
发表于 2016-7-6 14:13:59 | 显示全部楼层 |阅读模式
我学习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);
}
回复

使用道具 举报

发表于 2016-7-7 09:07:31 | 显示全部楼层
限位开关相应的引脚在setup里面设置成输入,并且,if(digitalRead(5) == LOW or HIGH),最好这样写。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-7 15:04:14 | 显示全部楼层
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);
}
回复 支持 反对

使用道具 举报

发表于 2016-7-7 16:48:27 | 显示全部楼层
多加几个串口打印,输出至电脑屏
然后分析哪里应该运行到的,结果没运行
就可以确定那段代码需要完善。
回复 支持 反对

使用道具 举报

发表于 2016-7-7 17:13:52 | 显示全部楼层
step()未完成前不会进入下面的if,所以代码要改写
每前进或后退一小段距离就检测一次光电开关

回复 支持 反对

使用道具 举报

发表于 2016-7-8 09:05:12 | 显示全部楼层
看出来了,step()函数一旦执行,就要执行完,所以下面的判断没起到作用,把判断放到step函数中的for循环里。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-14 11:38:41 | 显示全部楼层
164335413 发表于 2016-7-8 09:05
看出来了,step()函数一旦执行,就要执行完,所以下面的判断没起到作用,把判断放到step函数中的for循环里。 ...

是这样的-------step()函数一旦执行,就要执行完,所以下面的判断没起到作用
可我改几个晚上了也没弄好:主要是后退到限位B点停止这部分不行,好象与前方物品拿走后再向前转动有点冲突。
我完全晕了。!!!
以前只是完全依案例实验可以,可自己重新设计一个案了就解不了。
有人能帮我改改吗?没正确的比对不知错在哪里。
如有我能帮忙的我也会的:如3D打印的一般制图与打印,电子知识也有一点点。
回复 支持 反对

使用道具 举报

发表于 2016-7-15 09:17:20 | 显示全部楼层
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++;
  }
}
回复 支持 反对

使用道具 举报

发表于 2016-7-15 09:29:32 | 显示全部楼层
刚才没发全。
假如:先是向左转动,碰到左侧的开关,开关变为低电平(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);
}
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-20 22:51:42 | 显示全部楼层
我真是太差了!又弄几天还是到后方时不停。试用do~while去编总是显示出错,不管怎么弄总好象差一点点。
   要不请大神帮我写完编程发信息给我,如果OK暂付学费10元。回头我再对比错在哪里。
   洞洞板焊好了,两个光电开关接2与3。挡住时高电平的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 07:37 , Processed in 0.044480 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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