极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14504|回复: 2

求教:用298N控制步進電機停止后回轉不穩定

[复制链接]
发表于 2016-6-22 11:29:05 | 显示全部楼层 |阅读模式
   我在嘗試用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);

}
回复

使用道具 举报

发表于 2016-6-23 16:25:14 | 显示全部楼层
电机发热太严重可能是你接错线了!还有,其实你可以用步进电机库来写这个程序更简便
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-25 09:19:10 | 显示全部楼层
jiangzd 发表于 2016-6-23 16:25
电机发热太严重可能是你接错线了!还有,其实你可以用步进电机库来写这个程序更简便

謝謝你的關心。
這幾天又忙起來了,晚點我再試試。
我在小工廠做工程,初學arduino就想運用它實際幫作業員減少一點工作量。
主要是停止之后再啟動,方向不確定。-----我希望它只向前走,卻有時向前有時向后。好象是停止之前的脈沖周期沒完成,跟啟動后的脈沖有干涉。程式改很久也不成功
后來又改用直流電機好象也不行。
如果可以,請再費心指教一下。
謝謝!

回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 11:15 , Processed in 0.038242 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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