class="markdown_views prism-dracula">
开始浏览正文之前,请大家先花几分钟看完这段视频:
步进电机是如何工作的
步进电机(stepping motor)
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件,是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角),是现代数字程序控制系统中的主要执行元件,应用极为广泛。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响。
当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为”步距角”,它的旋转是以固定的角度一步一步运行的。
可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
步进电机是一种感应电机,它的工作原理是利用电子电路,将直流电变成分时供电的多相时序控制电流,用这种电流为步进电机供电,步进电机才能正常工作,驱动器就是为步进电机分时供电的多相时序控制器。
虽然步进电机已被广泛地应用,但步进电机并不能像普通的直流电机、交流电机在常规下使用。它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。因此用好步进电机却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。
步进电机作为执行元件,是机电一体化的关键产品之一,广泛应用在各种自动化控制系统中。随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。
步进电机又称为脉冲电机,基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩。
由于步进电机是一个把电脉冲转换成离散的机械运动的装置,具有很好的数据控制特性,因此,计算机成为步进电机的理想驱动源,随着微电子和计算机技术的发展,软硬件结合的控制方式成为了主流,即通过程序产生控制脉冲,驱动硬件电路。单片机通过软件来控制步进电机,更好地挖掘出了电机的潜力。因此,用单片机控制步进电机已经成为了一种必然的趋势,也符合数字化的时代趋势。
步进电机和伺服电机、舵机有何区别?
伺服电机不仅仅只包含一个电机,通常是包含电机、传感器和控制器的电机系统(具体可以参考伺服电机/舵机 控制 )。
舵机是个俗称,适用于航模上,其实是一种低端的但最常见的伺服电机系统,价格低廉但精度较低。
单片机控制示例
相信通过视频及文字内容,大家对步进电机相关原理已经非常熟悉。下面通过Arduino Pro MINI开发板进行一项简易的步进电机控制实验。
实验前要准备的元件
- 28BYJ-48 五线四相步进电机
- ULN2003驱动芯片
- Arduino Pro MINI开发板
- 杜邦线若干
示例代码一:
可以直接在Arduino IDE的File> Examples> Stepper> MotorKnob里直接导入示例代码。
Stepper.h是Arduino IDE自带的控制步进电机的标准库。
/*
* MotorKnob
*
* A stepper motor follows the turns of a potentiometer
* (or other sensor) on analog input 0.
*
* http:
* This example code is in the public domain.
*/
#include
#define STEPS 100
Stepper stepper(STEPS, 8 , 9 , 10 , 11 );
int previous = 0 ;
void setup() {
stepper.setSpeed(30 );
}
void loop() {
int val = analogRead(0 );
stepper.step(val - previous);
previous = val ;
}
Stepper函数是用来创建步进电机实例的,共有如下两种用法:
steps代表电机转一圈所用的步数。这个一般是步进电机出厂是就固定的。
- 也可以通过步距角计算得出:
转一圈的步数 = 360 / 步距角
Stepper(steps, pin1, pin2)
Stepper(steps, pin1, pin2, pin3, pin4)
pin1,pin2,pin3,pin4是连接至步进电机的引脚。
根据电机的引线数确定。pin3,pin4是可选的。
setSpeed(rpms)函数是用来设置步进电机的速度,即每分钟该转的步数。
根据实例代码,当转动电位器,步进电机也会转动一定角度。
示例代码二:
调用大神写好的库当然可以节约大量的开发时间,不过懂得原理也是非常有必要的。下面通过五线四相步进电机来进行简单说明:
五线四相步进电机的工作方式
`四相步进电机可以在:`
- 四相单拍 : 通电顺序为 A-B-C-D
- 四相双拍1 : 通电顺序为 AB-BC-CD-DA
- 四相双拍2 : 通电顺序为 AC-BC-BD-DA
- 四相八拍 : 通电顺序为 A-AB-B-BC-C-CD-D-DA-A
`四种工作方式下工作。`
下面依照8拍驱动方式编写相关代码:
#define motor_pin_1 8 //A
#define motor_pin_2 9 //B
#define motor_pin_3 10 //C
#define motor_pin_4 11 //D
int shiJian =10 ;
void steps_to_move_N(){
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, LOW);
delay(shiJian);
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, LOW);
delay(shiJian);
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, LOW);
delay(shiJian);
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, LOW);
delay(shiJian);
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, LOW);
delay(shiJian);
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, HIGH);
delay(shiJian);
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, HIGH);
delay(shiJian);
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, HIGH);
delay(shiJian);
}
void steps_to_move_Z(){
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, HIGH);
delay(shiJian);
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, HIGH);
delay(shiJian);
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, HIGH);
delay(shiJian);
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, LOW);
delay(shiJian);
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, LOW);
delay(shiJian);
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, LOW);
delay(shiJian);
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, LOW);
delay(shiJian);
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, LOW);
delay(shiJian);
}
void setup(){
pinMode(motor_pin_1, OUTPUT);
pinMode(motor_pin_2, OUTPUT);
pinMode(motor_pin_3, OUTPUT);
pinMode(motor_pin_4, OUTPUT);
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, HIGH);
}
void loop(){
steps_to_move_Z();
}
示例代码三:
下面的代码适用于Arduino系列,以及AVR单片机编程,修改后可直接用于其他单片机。
本段代码是对示例代码二中函数的简化表述方式。
#define motor_pin_1 8
#define motor_pin_2 9
#define motor_pin_3 10
#define motor_pin_4 11
int shiJian =10 ;
unsigned char clockWise[]={0x01 ,0x03 ,0x02 ,0x06 ,0x04 ,0x0c ,0x08 ,0x0d };
void zzz(){
for (int i=0 ;i<8 ;i++){
PORTB = clockWise[i];
delay(shiJian);
}
}
void fff(){
for (int i=0 ;i<8 ;i++){
PORTB = clockWise[8 -i];
delay(shiJian);
}
}
void setup(){
DDRB=0xFF ;
PORTB=0xFF ;
}
void loop(){
zzz();
fff();
}
以上内容就是控制步进电机的几种简易方法,各有优缺点大家根据自己的喜好和需要进行选择。不足之处还请大家批评指正。
感谢一直关注着禾灮成长进步的朋友们。你们的信任、支持和鼓励,鞭策着我们一路走到了今天。
感谢所有的合作伙伴,我们相互促进,共同见证了彼此的成长。
感谢所有曾经在禾灮彼此倚靠、相互鼓励、携手同心、砥砺同行的兄弟姐妹。这里承载了我们的青春与热血。
禾灮,感谢有你。
未来,我们将一如既往,砥砺前行。
禾灮·小楊
2018.07.05