步进机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);
}
}
有时间用C++做类库就可以重用这代码了 不错 不错 很详细了! 不知道控制伺服电机是不是一样呢。 本帖最后由 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 static/image/common/back.gif
是的,伺服贵了点,你用来控制什么呢?
做个自动化装置,还在研究中 bacon6581 发表于 2013-4-6 08:15 static/image/common/back.gif
做个自动化装置,还在研究中
加油好好研究。 能给个硬件电路吗 :lol不错不错不错不错
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);
}
} 64*64=4096 测试了下,次转动要大于360度,几分钟后就多转了半圈,请教楼主为什么 朋友,我刚接触步进机,用arduino如何控制步进机的正反转,
请教一下 我这样按楼主的程序做,4096 个脉冲后 ,步进电机会转 两圈 。这的电机难道是1:16的减速,但我的电机照片 就是淘宝那种很常见的28BYJ-28 啊,不知道为何 两个电机烧写楼主的程序都会 转满2圈
页:
[1]
2