1.直流电机
1.1、什么是电机
将电能转化为动能的一种机械设备。
1.2、常见电机
(1)交流电机:两相、三相
(2)直流电机:永磁、励磁
(3)步进电机(精度低)、伺服电机(精度高)—— 用于精确控制
1.3、直流电详解
(1)外观
(2)接线(正负极接上即可)和工作原理
(3)直流电机的驱动问题:不能用IO口直接驱动(电流不足)
1.4、直流电机实验
(1)直流电机直接接在开发板的主板的VCC和GND引出接口上看电机是否转动,还可以调换VCC和GND看电机是否反转了。
(2)单片机的IO口是数字口,本身的驱动能力非常小(最多20mA级别),这个驱动能力是带不动电机的。
(3)一般单片机需要使用专门的驱动芯片来驱动电机。驱动芯片的作用就是把单片机的小电流的控制信号转成逻辑上相同的大电流的驱动源。这就是所谓的弱电控制强电。用电机驱动芯片来驱动直流电机,具体电路分析在后面。
#include <reg51.h>
sbit ALine = P0^0;
sbit BLine = P0^1;
void main(void)
{
ALine = 1;
BLine = 0;
while (1);
}
2.步进电机理论
2.1、什么是步进电机
(1)外观
(2)功能特点
(3)操作接口(4、5、6线)
2.2、步距角:步长
(1)步进电机有一个固有步距角,这个参数和步进电机本身有关。
(2)步进电机一般情况下只能以固有步距角的整数倍来运动,这一个固有步距角的移动就叫一个节拍。
(3)步进电机还有个可以比固有步距角更小的运动方法,这种方法叫细分,有电机驱动器来支持的。
(4)相数:我们用的是两相电机(4线)。相数越多,控制精度越高。
2.3、极性
(1)单极性
(2)双极性(常用打印机:两相双极性四线式步进电机)
2.4、拍数
(1)单相四拍 A/ B A B/ 正转 B/ A B A/ 反转
正转的时序节拍反过来就是反转
四根线上的电平(轮到输入哪个拍,哪个拍就为1)
A A/ B B/
0 1 0 0 第1拍
0 0 1 0 第2拍
1 0 0 0 第3拍
0 0 0 1 第4拍
4个节拍加起来就是一个完整的周期,按照这个周期给步进电机供电,则步进电机就会转动1个步距角。
(2)双相四拍(动力强耗电量大) A/B AB AB/ A/B/ 正转
A/B AB AB/ A/B/
A A/ B B/
0 1 1 0 第1拍
1 0 1 0 第2拍
1 0 0 1 第3拍
0 1 0 1 第4拍
(3)半步八拍(将上面两种折中各取一个间隔) A/ A/B B AB A AB/ B/ A/B/
2.5、控制器和驱动器
(1)一套步进电机的系统需要三部分:控制器+驱动器+步进电机
控制器:提供控制信号
驱动器:提供驱动电流
步进电机:负责转动
(2)一般情况下:控制器就是单片机,驱动器一般是接在单片机的IO口上面的专用电机驱动芯片(比如TC1508S)
(3)控制器负责产生时序信号,驱动器负责将时序信号转成功率驱动信号给步进电机。
4.开发板原理图分析说明
4.1、原理图分析
(1)原理图中INA、INB、INC、IND将来要接单片机的IO口,单片机是做控制器的,通过单片机的IO口给驱动器芯片输入1或者0的控制信号,控制信号经过TC1117的转换,从OUTA、OUTB、OUTC、OUTD四个引脚输出具有驱动步进电机能力的驱动信号。
(2)接线:比如可以用P0端口的4个引脚(P0.0~P0.3)接INA、INB、INC、IND。
(3)输出端本来符号是OUTA、OUTB、OUTC、OUTD,但是开发板上实际丝印的符号是:A-、A+、B-、B+。所以这里面有个对应关系:OUTA对应A-、OUTB对应A+、OUTC对应B-、OUTD对应B+。
(4)丝印符号改变主要是为了对应步进电机上面的符号,让我们方便接线不会接错。
(5)结合之前讲的步进电机的原理:A-和A+是一个相线线圈的2端,B-和B+是另一个线圈。
4.2、电机驱动芯片数据手册
TC1508S(双通道直流马达驱动器)
5.步进电机编程实践1
5.1、接线
(1)P0端口的P0.0~P0.3接电机驱动芯片TC1508S的4个输入端
(2)TC1508S的4个输出端接步进电机(按照丝印符号相对应即可)
(3)根据上面的接线,实际得到的接线逻辑是:P0.0和P0.1对应一组线圈,而P0.2和P0.3对应另一组线圈。
5.2、单相四拍方式驱动
(1)时序编程 A/ B A B/
#include <reg51.h>
#define TIME 30 // 延时时间
sbit APositive = P0^0;
sbit ANegative = P0^1;
sbit BPositive = P0^2;
sbit BNegative = P0^3;
void delay(unsigned char i)
{
unsigned char a, b;
for (a=i; a>0; a--)
for (b=240; b>0; b--);
}
void main(void)
{
while (1)
{
// 循环内实现1个周期
// 一个周期其实就是各个节拍依次排列构成的,注意节拍之间要延时
// 单相4拍 A/ B A B/
APositive = 0;
ANegative = 1;
BPositive = 0; // B负和B正这两根线电平只要一样即可,两个1和
BNegative = 0; // 两个0效果是一样的
delay(TIME);
APositive = 0;
ANegative = 0;
BPositive = 1; // B负和B正这两根线电平只要一样即可,两个1和
BNegative = 0; // 两个0效果是一样的
delay(TIME);
APositive = 1;
ANegative = 0;
BPositive = 0; // B负和B正这两根线电平只要一样即可,两个1和
BNegative = 0; // 两个0效果是一样的
delay(TIME);
APositive = 0;
ANegative = 0;
BPositive = 0; // B负和B正这两根线电平只要一样即可,两个1和
BNegative = 1; // 两个0效果是一样的
delay(TIME);
}
}
(2)转速控制
转速是由脉冲信号的频率控制的,其实就是delay的时间。
(3)正转和反转
#include <reg51.h>
#define TIME 30 // 延时时间
sbit APositive = P0^0;
sbit ANegative = P0^1;
sbit BPositive = P0^2;
sbit BNegative = P0^3;
void delay(unsigned char i)
{
unsigned char a, b;
for (a=i; a>0; a--)
for (b=240; b>0; b--);
}
void main(void)
{
while (1)
{
// 循环内实现1个周期
// 一个周期其实就是各个节拍依次排列构成的,注意节拍之间要延时
// 反转 A/ B A B/
APositive = 0;
ANegative = 0;
BPositive = 0; // B负和B正这两根线电平只要一样即可,两个1和
BNegative = 1; // 两个0效果是一样的
delay(TIME);
APositive = 1;
ANegative = 0;
BPositive = 0; // B负和B正这两根线电平只要一样即可,两个1和
BNegative = 0; // 两个0效果是一样的
delay(TIME);
APositive = 0;
ANegative = 0;
BPositive = 1; // B负和B正这两根线电平只要一样即可,两个1和
BNegative = 0; // 两个0效果是一样的
delay(TIME);
APositive = 0;
ANegative = 1;
BPositive = 0; // B负和B正这两根线电平只要一样即可,两个1和
BNegative = 0; // 两个0效果是一样的
delay(TIME);
}
}
6.步进电机编程实践2
6.1、双相四拍方式驱动
#include <reg51.h>
#define TIME 30 // 延时时间
sbit APositive = P1^0;
sbit ANegative = P1^1;
sbit BPositive = P1^2;
sbit BNegative = P1^3;
void delay(unsigned char i)
{
unsigned char a, b;
for (a=i; a>0; a--)
for (b=240; b>0; b--);
}
void main(void)
{
while (1)
{
// 循环内实现1个周期
// 一个周期其实就是各个节拍依次排列构成的,注意节拍之间要延时
// 双相4拍 A/B AB AB/ A/B/
APositive = 0;
ANegative = 1;
BPositive = 1; // B负和B正这两根线电平只要一样即可,两个1和
BNegative = 0; // 两个0效果是一样的
delay(TIME);
APositive = 1;
ANegative = 0;
BPositive = 1; // B负和B正这两根线电平只要一样即可,两个1和
BNegative = 0; // 两个0效果是一样的
delay(TIME);
APositive = 1;
ANegative = 0;
BPositive = 0; // B负和B正这两根线电平只要一样即可,两个1和
BNegative = 1; // 两个0效果是一样的
delay(TIME);
APositive = 0;
ANegative = 1;
BPositive = 0; // B负和B正这两根线电平只要一样即可,两个1和
BNegative = 1; // 两个0效果是一样的
delay(TIME);
}
}
6.2、半步八拍方式驱动
#include <reg51.h>
#define TIME 30 // 延时时间
sbit APositive = P1^0;
sbit ANegative = P1^1;
sbit BPositive = P1^2;
sbit BNegative = P1^3;
void delay(unsigned char i)
{
unsigned char a, b;
for (a=i; a>0; a--)
for (b=240; b>0; b--);
}
void main(void)
{
while (1)
{
// 循环内实现1个周期
// 一个周期其实就是各个节拍依次排列构成的,注意节拍之间要延时
// 半步8拍 A/ A/B B AB A AB/ B/ A/B/
APositive = 0;
ANegative = 1;
BPositive = 0;
BNegative = 0;
delay(TIME);
APositive = 0;
ANegative = 1;
BPositive = 1;
BNegative = 0;
delay(TIME);
APositive = 0;
ANegative = 0;
BPositive = 1;
BNegative = 0;
delay(TIME);
APositive = 1;
ANegative = 0;
BPositive = 1;
BNegative = 0;
delay(TIME);
APositive = 1;
ANegative = 0;
BPositive = 0;
BNegative = 0;
delay(TIME);
APositive = 1;
ANegative = 0;
BPositive = 0;
BNegative = 1;
delay(TIME);
APositive = 0;
ANegative = 0;
BPositive = 0;
BNegative = 1;
delay(TIME);
APositive = 0;
ANegative = 1;
BPositive = 0;
BNegative = 1;
delay(TIME);
}
}