tom_hsh 发表于 2013-4-2 11:35:32

步进机28BYJ-48 arduino学习

不懂用arduino的stepper库,在网上找资料学习,以下是我的学习笔记---------这只是个人理解,希望有人指出不对的地方
   步进机28BYJ-48的步距脚为5.626/64,就是电机要64个脉冲才转一圈,减速比1:64,就是电机要转64圈,输出的轴才转一圈,所以转一圈要64*64=2096个脉冲
下边的程序是步进机每个1秒转一圈的程序:
//定义引脚
int Pin0 = 8;
int Pin1 = 9;
int Pin2 = 10;
int Pin3 = 11;

int _step = 0;

boolean dir = false;//正反转

int stepperSpeed = 1;//电机转速,1ms一步
//脉冲总数,或者说步的总数
int stepsum=0;
void setup()

{

pinMode(Pin0, OUTPUT);
pinMode(Pin1, OUTPUT);
pinMode(Pin2, OUTPUT);
pinMode(Pin3, OUTPUT); }



void loop()
{
//进步机的驱动方式,有八种
switch(_step){
    case 0:
      digitalWrite(Pin0, LOW);
      digitalWrite(Pin1, LOW);
      digitalWrite(Pin2, LOW);
      digitalWrite(Pin3, HIGH);
    break;
    case 1:
      digitalWrite(Pin0, LOW);
      digitalWrite(Pin1, LOW);
      digitalWrite(Pin2, HIGH);
      digitalWrite(Pin3, HIGH);
    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, HIGH);
      digitalWrite(Pin1, HIGH);
      digitalWrite(Pin2, LOW);
      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;
}


//判断是正转还是反转
if(dir)
{
    _step++;

}else{

    _step--;
}

//每八步一个驱动方式的循环
if(_step>7){
   
    _step=0;

}

if(_step<0){
   
    _step=7;

}

delay(stepperSpeed);

//计算脉冲数,每4096个脉冲停1秒
stepsum++;
if(stepsum==4096)
{
    Serial.println(stepsum);
    stepsum=0;
    delay(1000);
}

}

tom_hsh 发表于 2013-4-2 11:37:55

有时间用C++做类库就可以重用这代码了

bacon6581 发表于 2013-4-2 13:07:37

不错 不错 很详细了!

shellcode 发表于 2013-4-2 14:25:59

不知道控制伺服电机是不是一样呢。

bacon6581 发表于 2013-4-2 19:36:19

本帖最后由 bacon6581 于 2013-4-2 19:37 编辑

shellcode 发表于 2013-4-2 14:25 static/image/common/back.gif
不知道控制伺服电机是不是一样呢。

我买的工业用伺服电机带驱动器,驱动器的其中一种控制方式是方向脉冲+步进脉冲。

方向脉冲:高电平往一个方向转,低电平往另一个方向转
步进脉冲:一个脉冲(如10μs高电平+10μs低电平)电机旋转一步。

使能信号两个端口可以不用连

个人觉得伺服电机相对于步进电机的优点:
转速快,3000转/分钟。发热小。没什么噪声。误差不累计。

shellcode 发表于 2013-4-3 00:08:35

是的,伺服贵了点,你用来控制什么呢?

bacon6581 发表于 2013-4-6 08:15:30

shellcode 发表于 2013-4-3 00:08 static/image/common/back.gif
是的,伺服贵了点,你用来控制什么呢?

做个自动化装置,还在研究中

shellcode 发表于 2013-4-10 02:01:35

bacon6581 发表于 2013-4-6 08:15 static/image/common/back.gif
做个自动化装置,还在研究中

加油好好研究。

太行摄狼 发表于 2013-5-28 17:35:44

能给个硬件电路吗

Mr.Chocoball 发表于 2014-2-5 11:25:13

:lol不错不错不错不错

Brown 发表于 2014-5-16 13:27:33


case里面要按照顺序写吧?AB-B-BC-C-CD-D-DA-A,对应的接口给HIGH。
我用了你的代码测试,电机发抖,但是不转。我用的是UNO+ULN2003APG驱动板,5V供电,所有的接线顺序都试过了,可是不行。 用的10、11、12、13口,这个问题很头疼!附上代码:
//步进机每个1秒转一圈的程序:
//定义引脚
int Pin0 = 10;
int Pin1 = 11;
int Pin2 = 12;
int Pin3 = 13;

int _step = 0;

boolean dir = false;//正反转

int stepperSpeed = 1;//电机转速,1ms一步
//脉冲总数,或者说步的总数
int stepsum=0;
void setup()

{
pinMode(Pin0,OUTPUT);
pinMode(Pin1,OUTPUT);
pinMode(Pin2,OUTPUT);
pinMode(Pin3,OUTPUT);
}


void loop()
{
//进步机的驱动方式,有八种
switch(_step){
    case 0://******************AB
      digitalWrite(Pin0, HIGH);
      digitalWrite(Pin1, HIGH);
      digitalWrite(Pin2, LOW);
      digitalWrite(Pin3, LOW);
    break;
    case 1://******************B
      digitalWrite(Pin0, LOW);
      digitalWrite(Pin1, HIGH);
      digitalWrite(Pin2, LOW);
      digitalWrite(Pin3, LOW);
    break;

    case 2://******************BC
      digitalWrite(Pin0, LOW);
      digitalWrite(Pin1, HIGH);
      digitalWrite(Pin2, HIGH);
      digitalWrite(Pin3, LOW);
    break;

    case 3://******************C
      digitalWrite(Pin0, LOW);
      digitalWrite(Pin1, LOW);
      digitalWrite(Pin2, HIGH);
      digitalWrite(Pin3, LOW);
    break;

    case 4://******************CD
      digitalWrite(Pin0, LOW);
      digitalWrite(Pin1, LOW);
      digitalWrite(Pin2, HIGH);
      digitalWrite(Pin3, HIGH);
    break;

    case 5://******************D
      digitalWrite(Pin0, LOW);
      digitalWrite(Pin1, LOW);
      digitalWrite(Pin2, LOW);
      digitalWrite(Pin3, HIGH);
    break;

    case 6://******************DA
      digitalWrite(Pin0, HIGH);
      digitalWrite(Pin1, LOW);
      digitalWrite(Pin2, LOW);
      digitalWrite(Pin3, HIGH);
    break;

    case 7://******************A
      digitalWrite(Pin0, HIGH);
      digitalWrite(Pin1, LOW);
      digitalWrite(Pin2, LOW);
      digitalWrite(Pin3, LOW);
    break;

    default:
      digitalWrite(Pin0, LOW);
      digitalWrite(Pin1, LOW);
      digitalWrite(Pin2, LOW);
      digitalWrite(Pin3, LOW);
    break;
}

//判断是正转还是反转
if(dir)
{
    _step++;
}
else
{
    _step--;
}

//每八步一个驱动方式的循环
if(_step>7)
{
    _step=0;
}

if(_step<0)
{
    _step=7;
}

delay(stepperSpeed);

//计算脉冲数,每4096个脉冲停1秒
stepsum++;
if(stepsum==4096)
{
    Serial.println(stepsum);
    stepsum=0;
    delay(1000);
}

}

vanxining 发表于 2014-8-8 23:07:32

64*64=4096

parbie 发表于 2015-3-15 17:25:58

测试了下,次转动要大于360度,几分钟后就多转了半圈,请教楼主为什么

1304054224 发表于 2015-9-23 14:53:12

朋友,我刚接触步进机,用arduino如何控制步进机的正反转,

jundi0808 发表于 2015-11-21 20:18:07

请教一下 我这样按楼主的程序做,4096 个脉冲后 ,步进电机会转 两圈 。这的电机难道是1:16的减速,但我的电机照片 就是淘宝那种很常见的28BYJ-28 啊,不知道为何 两个电机烧写楼主的程序都会 转满2圈
页: [1] 2
查看完整版本: 步进机28BYJ-48 arduino学习