步进电机的控制-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5605|回复: 9

[未解决] 步进电机的控制

[复制链接]
发表于 2019-1-16 14:32 | 显示全部楼层 |阅读模式
我用直流电机驱动l298n 控制步进电机,
通过分别给A,B,C,D四根步进电机的线输入低电平信号来控制步进电机转

问题:
我写好了一个子程序,每次控制步进电机转1圈。
可是在用开关点动触发转1圈的时候,
步进电机有时候会出现反转现象、又或是说出现正转一半突然反转的情况。

明明子程序单独调试是可以正转1圈,但在多次的点动触发情况下,会出现这种乱跑的现象。
求大佬们告诉我下这是什么情况?一般怎么解决...

程序的部分内容:

int AA=22;//步进电机的四个管脚
int BB=23;
int CC=24;
int DD=25;
int g=1;//这个为步进电机的转速

int key=1;//临时开关,(key那一块我用的是红外遥控....大家就当个普通开关看下,不然全部复制过来太长了而且没必要....)

void setup()
{

    Serial.begin(9600);
    pinMode(AA,1);//步进电机的四个管脚
    pinMode(BB,1);
    pinMode(CC,1);
    pinMode(DD,1);

    pinMode(key,1);

}

void loop()
{

if(key==1){bujin(1);}

}


void bujin(int i)
{
  int k;
  if(i>=0){
            for(k=i*50;k>0;k--)
            {
              digitalWrite(AA,0);digitalWrite(BB,1);digitalWrite(CC,1);digitalWrite(DD,1);delay(g);
              digitalWrite(AA,1);digitalWrite(BB,1);digitalWrite(CC,0);digitalWrite(DD,1);delay(g);
              digitalWrite(AA,1);digitalWrite(BB,0);digitalWrite(CC,1);digitalWrite(DD,1);delay(g);
              digitalWrite(AA,1);digitalWrite(BB,1);digitalWrite(CC,1);digitalWrite(DD,0);delay(g);
             }

       }

  if(i<0){  i=-i;//这里i取反,保证i为正值
            for(k=i*50;k>0;k--)
            {
              digitalWrite(AA,0);digitalWrite(BB,1);digitalWrite(CC,1);digitalWrite(DD,1);delay(g);
              digitalWrite(AA,1);digitalWrite(BB,1);digitalWrite(CC,0);digitalWrite(DD,1);delay(g);
              digitalWrite(AA,1);digitalWrite(BB,0);digitalWrite(CC,1);digitalWrite(DD,1);delay(g);
              digitalWrite(AA,1);digitalWrite(BB,1);digitalWrite(CC,1);digitalWrite(DD,0);delay(g);
             }   
       }      
  }


发表于 2019-1-18 08:19 | 显示全部楼层
还是用专用模块吧,便宜,还好用~~
发表于 2019-1-17 00:46 | 显示全部楼层
本帖最后由 connexion 于 2019-1-17 00:55 编辑

int p2, p3, p4, p5;

int tim;

int pins[] {
  2,  //IN1 on the ULN2003 Board, BLUE end of the Blue/Yellow motor coil
  3,  //IN2 on the ULN2003 Board, PINK end of the Pink/Orange motor coil
  4,  //IN3 on the ULN2003 Board, YELLOW end of the Blue/Yellow motor coil
  5   //IN4 on the ULN2003 Board, ORANGE end of the Pink/Orange motor coil
};


void setup() {
  // put your setup code here, to run once:
  tim = 3000;
  Serial.begin(9600);
  for (int pin = 0; pin < 4; pin++) {
    pinMode(pins[pin], OUTPUT);
    digitalWrite(pins[pin], LOW);
  }
}

void cwstep1() { //正转
  p2 = digitalRead(2);
  p3 = digitalRead(3);
  p4 = digitalRead(4);
  p5 = digitalRead(5);

  if (p2 == LOW && p3 == LOW && p4 == LOW && p5 == LOW) {
    delayMicroseconds(tim);
    digitalWrite(5, HIGH);
  } else if (p2 == LOW && p3 == LOW && p4 == LOW && p5 == HIGH) {
    delayMicroseconds(tim);
    digitalWrite(4, HIGH);
  } else if (p2 == LOW && p3 == LOW && p4 == HIGH && p5 == HIGH) {
    delayMicroseconds(tim);
    digitalWrite(5, LOW);
  } else if (p2 == LOW && p3 == LOW && p4 == HIGH && p5 == LOW) {
    delayMicroseconds(tim);
    digitalWrite(3, HIGH);
  } else if (p2 == LOW && p3 == HIGH && p4 == HIGH && p5 == LOW) {
    delayMicroseconds(tim);
    digitalWrite(4, LOW);
  } else if (p2 == LOW && p3 == HIGH && p4 == LOW && p5 == LOW) {
    delayMicroseconds(tim);
    digitalWrite(2, HIGH);
  } else if (p2 == HIGH && p3 == HIGH && p4 == LOW && p5 == LOW) {
    delayMicroseconds(tim);
    digitalWrite(3, LOW);
  } else if (p2 == HIGH && p3 == LOW && p4 == LOW && p5 == LOW) {
    delayMicroseconds(tim);
    digitalWrite(5, HIGH);
  } else if (p2 == HIGH && p3 == LOW && p4 == LOW && p5 == HIGH) {
    delayMicroseconds(tim);
    digitalWrite(2, LOW);
  }
}

void ccwstep1() {//逆转
  p2 = digitalRead(2);
  p3 = digitalRead(3);
  p4 = digitalRead(4);
  p5 = digitalRead(5);

  if (p2 == LOW && p3 == LOW && p4 == LOW && p5 == LOW) {
    delayMicroseconds(tim);
    digitalWrite(2, HIGH);
    digitalWrite(5, HIGH);
  } else if (p2 == HIGH && p3 == LOW && p4 == LOW && p5 == HIGH) {
    delayMicroseconds(tim);
    digitalWrite(5, LOW);
  } else if (p2 == HIGH && p3 == LOW && p4 == LOW && p5 == LOW) {
    delayMicroseconds(tim);
    digitalWrite(3, HIGH);
  } else if (p2 == HIGH && p3 == HIGH && p4 == LOW && p5 == LOW) {
    delayMicroseconds(tim);
    digitalWrite(2, LOW);
  } else if (p2 == LOW && p3 == HIGH && p4 == LOW && p5 == LOW) {
    delayMicroseconds(tim);
    digitalWrite(4, HIGH);
  } else if (p2 == LOW && p3 == HIGH && p4 == HIGH && p5 == LOW) {
    delayMicroseconds(tim);
    digitalWrite(3, LOW);
  } else if (p2 == LOW && p3 == LOW && p4 == HIGH && p5 == LOW) {
    delayMicroseconds(tim);
    digitalWrite(5, HIGH);
  } else if (p2 == LOW && p3 == LOW && p4 == HIGH && p5 == HIGH) {
    delayMicroseconds(tim);
    digitalWrite(4, LOW);
  } else if (p2 == LOW && p3 == LOW && p4 == LOW && p5 == HIGH) {
    delayMicroseconds(tim);
    digitalWrite(2, HIGH);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  for (int i = 0; i < 4096; i++) {
    cwstep1();
  }
  delayMicroseconds(tim);
  for (int i = 0; i < 4096; i++) {
    ccwstep1();
  }
  delayMicroseconds(tim);
}
假定开始的电平为1110
转动的时候:0111、1011、1101转动结束翻转的时候要对上
1011
0111
1110
1101

如果对上了0111、1110、1101这三个就会乱跑。不加延时函数的话可能会丢步(也会乱跑)




发表于 2019-1-17 13:00 | 显示全部楼层
复制过去,步进电机抖动得厉害,就是不转
发表于 2019-1-17 13:01 | 显示全部楼层
connexion 发表于 2019-1-17 00:46
int p2, p3, p4, p5;

int tim;

复制过去,步进电机抖动得厉害,就是不转
发表于 2019-1-17 22:12 | 显示全部楼层
lspring 发表于 2019-1-17 13:01
复制过去,步进电机抖动得厉害,就是不转

你需要看步进电机的时序图来搞
发表于 2019-1-19 16:36 | 显示全部楼层
https://raw.githubusercontent.com/BretStateham/28BYJ-48/master/Overview/28BYJ-48%20Stepper%20Motor%20and%20ULN2003%20Driver.pptx
发表于 2019-1-20 00:36 | 显示全部楼层
connexion 发表于 2019-1-17 22:12
你需要看步进电机的时序图来搞

好吧。谢谢了
发表于 2019-1-20 00:41 | 显示全部楼层

你其实可以先试试线序调转一下
发表于 2021-9-11 16:04 | 显示全部楼层
不解,同样的疑问
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 23:40 , Processed in 0.238686 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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