加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

arduino+L298N驱动两相四线(五线)步进电机

(2015-07-18 10:46:12)
标签:

arduino

两相

步进电机

驱动程序

l298n

分类: arduino
欢迎光临京西古道研究网站,对京西古道详细分类介绍,内容不断充实:http://www.jxgd.info/


一、两相和四相步进电机
步进电机有多种,主要分为两相和四相,有四线,有五线,还有六线的,容易把人搞迷糊

两相和四相步进电机的区别:http://www.chinabaike.com/z/keji/jixie/2012/0605/1125308.html 

两相步进电机在定子上只有两个绕组,有四根出线,整步为1.8°,半步为0.9°。在驱动器中,只要对两相绕组电流通断和电流方向进行控制就可以了。而四相步进电机在定子上有四个绕组,有八根出线,整步为0.9°,半步为0.45°,不过驱动器中需要对四个绕组进行控制,电路相对复杂了。

  所以两相电机配两相步进驱动器,四相八线电机有并联、串联、单极型三种接法。并联接法:四相绕组两两相并,绕组的电阻与电感成倍减小,电机运行时加速性能好,高速带载力矩大,但是电机需要输入两倍于额定电流的电流,发热较大,对驱动器输出能力要求相应提高。而在串联使用时,绕组的电阻与电感成倍的增大,电机低速运行时稳定,噪音和发热较小,对驱动器要求不高,但高速力矩损耗大。所以用户可根据要求来选择四相八线的步进电机接线方法。


四相步进电机可以用arduino IDE 自带的实例里的程序和库驱动,在文件-》示例-》stepper中。但是两相的驱动不了。

二、两相步进电机实验器件
这里只谈两相步进电机,特征是有四或五根出线,五跟线中有一根是外壳接地线,跟其他四线不通。其他四线导通的是一个绕组,共两个绕组四根线,绕组之间不通。

我用于实验的是下图电机,这是个推杆电机,它的轴正转会伸出,反转会缩进,所以我后面的子程序名叫up()/down()。
图中A和B是两个绕组,四根线的顺序不能错。

arduino板可以任意板,我用的是老掉牙的Duemilanove;

驱动板用的是L298N,非常常见;
接线:务必不要错了,不然查错非常头大!
L298输入1-4 对应 arduino数字端口 8,9,10,11
L298输出out1--A+白,OUT2--A-蓝,out3--B+黄,out4--B-绿


三、程序
我把程序贴在这,其实很简单,我把驱动的8拍的时序直接用switch   case 写明白,不用什么数组和逻辑,程序长但是好懂,好查错。

端口4是用来控制方向的,接高电平就正转(up),接低电平就发转(down)。

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);
  pinMode(Pin1, OUTPUT);
  pinMode(Pin2, OUTPUT);
  pinMode(Pin3, OUTPUT);
  pinMode(4,INPUT);
}

void loop()
{
  if(digitalRead(4))
 
  up();
  }else{
  down();
  }
}

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);

}





0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有