电机通常是将电能转化为动能的机械装置。一般可分为:交流电机、直流电机、步进电机、伺服电机等等。
直流电机
交流电机和直流电机通常有两个引脚,直接通交流电或者直流电的电源正负极即可转动,断电就停止。不能被精确控制。
使用时,将其通过电流放大芯片,接到单片机的两个引脚上,然后将这两个引脚分别置0和置1即可。
注意:直流电机不分正负,正反接对应的是正反转。
直流电机实验
直流电机直接接在开发板的主板的VCC和GND引出接口上看电机是否转动,还可以调换VCC和GND看电机是否反转了。
单片机的IO口是数字口,本身的驱动能力非常小(最多20mA级别),这个驱动能力是带不动电动机的。所以一般单片机需要使用专门的驱动芯片来驱动电机。驱动芯片的作用就是把单片机的小电流的控制信号转成逻辑上相同的大电流的驱动源。这就是所谓的弱电控制强电。用电机驱动芯片来驱动直流电机,具体的电路分析后面讲步进电机时会详细说。此处暂且略过。代码如下所示:
/************************************************************ 日期:2022年7月23日 作者:星辰 文件内容:电机演示 **************************************************************/ #include<reg51.h> sbit P30 = P3^0; sbit P31 = P3^1; /************************************************************* 函数入口 **************************************************************/ void main(void) { P30 = 1; P31 = 0; }
步进电机
步进电机较直流电机相对复杂。
![]()
步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。因此,步进电机又称脉冲电动机。
现在使用的步进电机大部分用永磁转子。普遍使用永久磁铁的原因是效率高,分辨率高等优点。
步距角:步长
步进电机有一个固有步距角,这个参数和步进电机本身有关。步进电机一般情况下只能以固有步距角的整数倍来运动,这一个固有步距角的移动就叫一个节拍。
电机还有个可以比固有步距角更小的运动方法,这种方法叫细分,由电机驱动器来支持的。
相数:指的是电机有几个绕线组。常用的有二相、三相、四相、五相步进电机。
本文以2相步进电机为例。
极性:单极性、双极性。
拍数(重点):单向四拍、双相四拍、半步八拍。
到了哪个,哪个就给电。
单相四拍 A/ B A B/ 正转(反转倒序即可)
双相四拍 A/B AB AB/ A/B/ 正转(反转倒序即可)
半步八拍 A/ A/B B AB A AB/ B/ A/B/ 正转(反转倒序即可)这里的节拍不太好理解。以单相四拍A/ B A B/为例,依次给A/ B A B/正电压意味着什么呢?
即:
第一拍给A/正电压1,其他负电压0;
第二拍给B正电压1,其他负电压0;
第三拍给A正电压1,其他负电压0;
第四拍给B/正电压1,其他负电压0;
四个节拍组成一个完整的周期。
原理是什么?
看电气原理图如下:
二相电机里有两个线圈:
第一拍,先给A/正电压,A负电压,表示接通左侧的线圈,下面的线圈先不管,都为负电压即可。
第二拍,先给B正电压,B/负电压,表示接通下面的线圈,左侧的线圈先不管,都为负电压即可。
第三拍,先给A正电压,A/负电压,表示反向接通左侧的线圈,下面的线圈先不管,都为负电压即可。
第四拍,先给B/正电压,B负电压,表示反向接通下面的线圈,左侧的线圈先不管,都为负电压即可。
根据上面的原理,可以知道四个节拍下,电平值分配如下:
单相四拍A/ B A B/,让一个绕组通电,另一个绕组不通电,A和A/电平相反即可,不过通常当前时序属于谁,谁就是高电平。四根线上电平时序如下所示:
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个步距角。
双相四拍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拍4个节拍加起来就是一个完整的周期,按照这个周期给步进电机供电,则步进电机就会转动1个步距角。
双相四拍较单相四拍有更高负载,但是更耗电,需根据实际情况选择。
半步八拍是上面两种的折中方案。时序逻辑是一样的。
A/ A/B B AB A AB/ B/ A/B/
控制器和驱动器
一套步进电机的系统需要三部分:控制器+驱动器+步进电机
一般情况下:控制器就是单片机,驱动器一般是接在单片机的IO口上面的专用电机驱动芯片(譬如我们开发板上的TC1117)
控制器负责产生时序信号,驱动器负责将时序信号转成功率驱动信号给步进电机用。
查看原理图
可以将驱动芯片就看做一个电流放大器,只用将信号输入端接到单片机的引脚上,将信号输出接到步进电机上,然后根据时序提供步进信号即可驱动步进电机转动。
代码实现
我将输入端接到芯片的P3.0、P3.1、P3.2、P3.3四个引脚,然后通过放大芯片的输出端分别控制步进电机的A/ A B/ B。
使用单相四拍(A/ B A B/)来驱动,则这几个引脚一个周期的节拍为:
1000
0001
0100
0010
代码如下(注,程序中放的是反转顺序):
/************************************************************ 日期:2022年7月23日 作者:星辰 文件内容:电机演示 **************************************************************/ #include<reg51.h> /************************************************************* 函数入口 **************************************************************/ void main(void) { while(1) { P3 = 0x1; P3 = 0x8; P3 = 0x2; P3 = 0x4; } }
时序这样写没什么问题,可是下载到开发板中,没有反应,反而里面有异响,并且是发热比较严重。咋回事呢?线接错了?检查了没问题。
网上查阅资料,看到如下说法:
排除第一条和第二条,那就是频率太快导致的。
于是我在每一周期前加了延时,如下:
while(1) { Delay(); P3 = 0x1; P3 = 0x8; P3 = 0x2; P3 = 0x4; }
但还是没用。确认不是周期间延时后,我就在每次节拍之间都加了延时,如下:
/************************************************************ 日期:2022年7月23日 作者:星辰 文件内容:电机演示 **************************************************************/ #include<reg51.h> void Delay(int count); /************************************************************* 函数入口 **************************************************************/ void main(void) { while(1) { P3 = 0x1; Delay(5); P3 = 0x8; Delay(5); P3 = 0x2; Delay(5); P3 = 0x4; Delay(5); } } void Delay(int count) { int i = 0, j = 0; for(i; i < count; i++) { for(j; j < 100; j++); } }
电机终于转动了~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我想,加点延时是不是为了给电机响应时间,要不前一个节拍还没来得及产生对应的效果,下一个节拍就来了,太快起不了作用??????????????????
具体就不深入分析了,先记住吧。
更多的启动节拍,以及反向转动,由于比较简单,就不赘述了。
速率由节拍之间的延时来控制;反向转动倒过来即可;其它节拍同理。