十二、直流电机和步进电机
1、直流电机
a、什么是电机
电机就是一种将电能转化为动能和热能的装置。
b、常见电机
(1)交流电机:两相、三相
小功率的都是两相电机一般家用的
大功率的都是三相电机,譬如工厂、高铁上用的是三相电机。
(2)直流电机:永磁、励磁
(3)步进电机、伺服电机
这类电机可以进行精确控制,其精度比微米还要小。一般用在高精度机床上,譬如数控机床。
c、直流电机详解
(1)外观
(2)接线和工作原理
(3)直流电机的驱动问题:不能用IO口直接驱动
d、直流电机实验
(1)直流电机直接接在开发板的VCC和GND插针上看电机是否转动,还可以调换位置看看电机是否反转
实验结果,开发板只要接电(甚至不用开开关)电机就转,反接后用小扇叶作指示发现反转了。
(2)单片机的IO口是数字口,本身的驱动能力很小(最多20mA级别),这个驱动能力是带不动电动机
的。实验结果:单片机IO引脚不能直接驱动直流电机转动。
(3)一般单片机需要使用专门的驱动芯片来驱动电机。驱动芯片的作用就是把单片机的小电流的控制信号
转成逻辑上相同的大电流的驱动源。这就是所谓的弱电控制强电。用电机驱动芯片来驱动直流电机,具体的电
路分析后面学习步进电机时再具体学习。
2、步进电机理论1
a、什么是步进电机:步进电机是一种直接将电脉冲转化为机械运动的机电装置,通过控制施加在电机线圈上
的电脉冲顺序、频率和数量,可以实现对步进电机的转向、速度和旋转角度的控制。在不借助带位置感应
的闭环反馈控制系统的情况下,使用步进电机与配套的驱动器共同组成的控制简便、低成本的开环控制系
统,就可以实现精确的位置和速度控制。
(1)外观:在开发板套餐中双极性步进电机是一个小圆柱形中间一个主轴,一端有四个接线插针,通过
PCB引出来,五线四相的步进电机相对双极性的步进电机大很多,外观基本就是其放大版。
(2)功能特点:可以精准控制转动的距离,在其精度范围内可以准确控制转动的角度。
(3)操作接口:有很多种的接口,有3PIN的有4PIN的,也有5PIN的,根据功能和需求的不同有不同的
操作接口。
b、步距角
(1)步进电机有一个固有的步距角,这个参数和步进电机本身有关。
(2)步进电机一般情况下只能以固有步距角的整数倍来运动,这一个固有步距角的移动就叫一个节拍。
(3)电机还有个可以比固有步距角更小的运动方法,这种方法叫细分,有电机驱动器来支持。
c、相数
步进电机的相数是指电机内部的线圈组数,目前常用的有二相、三相、四相、五相步进电机。电机相数不
同,其步距角也不同,一般二相电机的步距角为0.9°/1.8°、三相的为0.75°/1.5°等、五相的为0.36°/
0.72°。在没有细分驱动器时,用户主要靠选择不同相数的步进电机来满足自己步距角的要求。如果使用细分
驱动器,那么“相数”将变得没有意义,用户只需要在驱动器上改变细分数,就可以改变步距角。
开发板配套的双极性步进电机是二相的。
d、细分
步进电机细分控制是指对步距角再进行详细的分步控制。譬如,对一个步距角为1.8°的两相四拍电机进行
四细分控制,就是使得电机转动一步是1.8除以4,也就是0.45°来运转。 对于步进电机来说细分功能完全是
由外部驱动电路精确控制电机的相电流产生的,和具体电机无关。步进电机的细分控制是通过等角度有规律的
插入大小相等的电流合成向量,从而减小合成磁势的角度(步距角),从而达到细分目的。
3、 步进电机理论2
a、极性:单极性(unipolar)和双极性(bipolar)是步进电机最常用的两种驱动架构。
(1)单极性驱动电路使用四颗晶体管来驱动步进电机的两相相位,电机结构则包含两组带有中间抽头的
线圈,整个电机共有六条线与外界相连。这类电机有的时候又称为四相电机,但这种说法不正确有会让人混淆
,因为其本质上只有两个相位,准确的说是双相位六线式步进电机。六线式步进电机虽然称其为单极性步进电
机,实际上却可以同时使用单极性或者双极性的驱动电路。
(2)双极性步进电机则会使用8颗晶体管来驱动两组相位。双极性驱动电路可以同时驱动四线式或六线式
步进电机,虽然四线式只能使用双极性驱动电路,但是却可以大幅度降低量产型应用的成本。双极性步进电机
驱动的晶体管数目是单极性驱动电路的两倍,其中四颗下端晶体管通常是由微控制器直接驱动,上端晶体管则
需要成本较高的上端驱动电路。双极性驱动电路的晶体管只需要承受电机电压,所以它不像单极性驱动电路一
样需要钳位电路。
b、拍数:完成一个磁场周期性变化所需脉冲数或导电状态用n表示,或指电机转过一个齿距角所需脉冲数,以
四相电机为例,有四相四拍运行方式即AB-BC-CD-DA- AB,
四相八拍运行方式即 A-AB-B-BC-C-CD-D-DA-A。
(1)单相通电四拍驱动时序
正转:A-,B,A,B-
反转:B-,A,B,A-
(2)双相通电四拍驱动时序
正转:A-B,AB,AB-,A-B-
反转:A-B-,AB-.AB.A-B
(3)半步八拍驱动时序
正转:A-,A-B,B,AB,A,AB-,B-,A-B-
反转:A-B-,B-,AB-,A,AB,B,A-B,A-
(4)节拍驱动时序解释,以单相通电四拍为例
四根线: A A- B B-
电平: 0 1 0 0 第一拍
0 0 1 0 第二拍
1 0 0 0 第三拍
0 0 0 1 第四拍
4个节拍加在一起就是一个完整的周期。按照这个周期给步进电机供电,则步进电机就会转动一个步
距角。正转和反转的时序是完全相反的,无论什么拍数要反转只需要将正转的节拍时序倒过来即可。
其他拍数的驱动时序以同样的方式理解即可。双相四拍比单相四拍的动力更强,但是更耗电,半步八
拍是二者的折中方案。
c、控制器和驱动器
(1)一套步进电机的系统分为三部分:控制器+驱动器+步进电机
(2)一般情况下,控制器就是单片机,驱动器一般是接在单片机IO口上的专用驱动芯片。(譬如开发板
上的是TC1508S)
(3)控制器负责产生时序信号,驱动器负责将时序信号转成功率驱动信号来驱动步进电机。
4、开发板原理图分析说明
a、原理图分析
(1)原理图中INA、INB、INC、IND要接单片机的IO口,单片机是做控制器的,通过单片机的IO口给
驱动器芯片输入1或者0的控制信号,控制信号经过TC1508S的转换,从OUTA、OUTB、OUTC、OUTD四个引
脚输出具有驱动步进电机能力的驱动信号。
(2)接线:譬如可以用P0端口的4个引脚(实际用P0.0~P0.3)接INA、INB、INC、IND。
(3)输出端本来符号是OUTA、OUTB、OUTC、OUTD,但是有的开发板上实际丝印的符号是A-、A+、
B-、B+。这里面的对印关系是按照顺序依次对应的,接线不能接错了,不然电机就不能正常工作了。
(4)丝印符号改变主要是为了对应步进电机上面的符号,让我们方便接线,不会接错。
(5)结合之前讲的步进电机的原理可知:A-和A+是一个相线线圈的两端,而B-和B+是另一个线圈的两
端。
b、电机驱动芯片数据手册
5、步进电机编程实践1
a、接线
(1)单片机P0端口的P0.0~P0.3接电机驱动芯片TC1508S的四个输入端
(2)TC1508S的输出端接步进电机(按照丝印符号相对应即可)
(3)根据上面的接线,实际的接线逻辑是:P0.0和P0.1对应一组线圈,而P0.2和P0.3对应另一组线
圈。
b、单相四拍方式驱动
(1)时序编程:A-,B,A,B-
代码:
#include <REGX51.H>
sbit Apos = P0^0;
sbit Aneg = P0^1;
sbit Bpos = P0^2;
sbit Bneg = P0^3;
void delay(unsigned int t);
void main(void)
{
while(1)
{
//循环内实现一个周期
//一个周期其实就是各个节拍依次排列构成的,注意节拍之间要有延时
//单相四拍
//第一拍
Apos = 0;
Aneg = 1;
Bpos = 0; //B正负极只要电平一样即可,全为1和全为0效果相同
Bneg = 0;
delay(50);
//第二拍
Apos = 1;
Aneg = 0;
Bpos = 0;
Bneg = 0;
delay(50);
//第三拍
Apos = 0;
Aneg = 0;
Bpos = 0;
Bneg = 1;
delay(50);
//第四拍
Apos = 0;
Aneg = 0;
Bpos = 1;
Bneg = 0;
delay(50);
}
}
void delay(unsigned int t)
{
while(t--)
{
unsigned char i = 2;
unsigned char j = 239;
do
{
while(--j);
}while(--i);
}
}
(2)转速控制:转速是由脉冲信号的频率控制的,其实就是delay的时间
(3)正转与反转
6、步进电机编程实践2
a、双相四拍
代码:
#include <REGX51.H>
#define speed 30
sbit Apos = P0^0;
sbit Aneg = P0^1;
sbit Bpos = P0^2;
sbit Bneg = P0^3;
void delay(unsigned int t);
void main(void)
{
while(1)
{
//循环内实现一个周期
//一个周期其实就是各个节拍依次排列构成的,注意节拍之间要有延时
//双相四拍:A-B,AB,AB-,A-B-
//第一拍
Apos = 0;
Aneg = 1;
Bpos = 1; //B正负极只要电平一样即可,全为1和全为0效果相同
Bneg = 0;
delay(speed);
//第二拍
Apos = 1;
Aneg = 0;
Bpos = 1;
Bneg = 0;
delay(speed);
//第三拍
Apos = 1;
Aneg = 0;
Bpos = 0;
Bneg = 1;
delay(speed);
//第四拍
Apos = 0;
Aneg = 1;
Bpos = 0;
Bneg = 1;
delay(speed);
}
}
void delay(unsigned int t)
{
while(t--)
{
unsigned char i = 2;
unsigned char j = 239;
do
{
while(--j);
}while(--i);
}
}
b、半步八拍
代码:
#include <REGX51.H>
#define speed 30
sbit Apos = P0^0;
sbit Aneg = P0^1;
sbit Bpos = P0^2;
sbit Bneg = P0^3;
void delay(unsigned int t);
void main(void)
{
while(1)
{
//循环内实现一个周期
//一个周期其实就是各个节拍依次排列构成的,注意节拍之间要有延时
//半步八拍:A-,A-B,B,AB,A,AB-,B-,A-B-
//第一拍
Apos = 0;
Aneg = 1;
Bpos = 0; //B正负极只要电平一样即可,全为1和全为0效果相同
Bneg = 0;
delay(speed);
//第二拍
Apos = 0;
Aneg = 1;
Bpos = 1;
Bneg = 0;
delay(speed);
//第三拍
Apos = 0;
Aneg = 0;
Bpos = 1;
Bneg = 0;
delay(speed);
//第四拍
Apos = 1;
Aneg = 0;
Bpos = 1;
Bneg = 0;
delay(speed);
//第五拍
Apos = 1;
Aneg = 0;
Bpos = 0; //B正负极只要电平一样即可,全为1和全为0效果相同
Bneg = 0;
delay(speed);
//第六拍
Apos = 1;
Aneg = 0;
Bpos = 0;
Bneg = 1;
delay(speed);
//第七拍
Apos = 0;
Aneg = 0;
Bpos = 0;
Bneg = 1;
delay(speed);
//第八拍
Apos = 0;
Aneg = 1;
Bpos = 0;
Bneg = 1;
delay(speed);
}
}
void delay(unsigned int t)
{
while(t--)
{
unsigned char i = 2;
unsigned char j = 239;
do
{
while(--j);
}while(--i);
}
}