四相步进电机全教程
- 格式:docx
- 大小:607.26 KB
- 文档页数:17
四相步进电机全教程——盖尔@袁(4、21)前段时间就有玩过步进电机了,但是后来因为硬盘坏了,资料全没了,之后想再玩的时间都不知道该怎么弄了,这时候觉得假如当时有留点资料发到网上的话,那现在也就不会那么纠结了,所以,昨晚又再一次拿起那步进电机,再一次玩一下,大概把之前那些东西回想起来了,现在写一份小教程(之所以叫全教程,是因为看了这份资料之后,对应地也就大概能用起来,对步进电机也有一个大概的了解了),以共大家学习,希望高手拍砖!(里面有些是直接引用网上的资料,如有原作者看到的话,我在这里跟他说声谢谢,因为您写得太好了!)驱动电路我用的是L298N这款很经典的电机驱动芯片,这芯片可以驱动直流电机,步进电机等,功能相当强大,很好用,虽然贵了点(下面再介绍一种比较好的,价格比较低的驱动电路,也相当好用),但是还是用了,毕竟是经典之作嘛!呵呵!电路如下:大家可以看到,上面这电机驱动芯片L298N有四个输入(IN1,IN2,IN3,IN4)和四个输出(M1,M2),对了,就是对应单片机(或者其它主控芯片,比如说M3,我用的就是这个)的输入控制端,然后这四个控制端通过L298N间接地控制了步进电机(也就是图里的M1,M2),因为步进电机转动的时候需要比较大的电流,单片机IO引脚没法提供,只有通过这驱动芯片才能够带动起来!电路里面还有PWMA和PWMB,这是使能端,用于使能M1和M2是否被输入控制的,高电平有效!一般我们假如需要控制的话,这个就接单片机的IO引脚上,假如不需要独立控制的话那直接接高电平就行了!另外,大家可以看到电路里面还有一个5V的输入,具体这个是做什么的我也不是很清楚,不过照给就是了,没问题的!好,首先先把这电路焊出来,记得,因为L298N工作的时候电流比较大,所以要求必需加上一个散热片,这样有利于保护电路不会因为过热而烧了!这里有一个小知识跟大家说一下,焊电路最好是加上一个电源指示灯,这样的好处多多,可以防止电源接反而完全不知!OK,这个方案介绍完了,下面介绍另一种成本比较低的驱动方案!假如手头上有ULN2003的话,也可以用来当成驱动电路用,我们只要知道驱动电路的作用就是放大那个电流,那任何一种能够放大电流的方法都可以拿过来用,包括你用三极管都行!下面提供一个三极管的驱动电路!至于ULN2003,具体电路我就不说了!很简单的,看下芯片的PDF就知道了。
对了,这里顺便介绍一个找PDF比较全的网站——ICPDF,当然IC37也很全!步进电机原理按照常理来说,步进电机接线要根据线的颜色来区分接线。
但是不同公司生产的步进电机,线的颜色不一样。
特别是国外的步进电机。
那么,步进电机接线应该用万用表打表。
步进电机内部构造如下图:通过上图可知,A,~A是联通的,B和~B是联通。
那么,A和~A是一组a,B 和~B是一组b。
不管是两相四相,四相五线,四相六线步进电机。
内部构造都是如此。
至于究竟是四线,五线,还是六线。
就要看A和~A之间,B和B~之间有没有公共端com抽线。
如果a组和b组各自有一个com端,则该步进电机六线,如果a和b组的公共端连在一起,则是5线的。
所以,要弄清步进电机如何接线,只需把a组和b组分开。
用万用表打。
四线:由于四线没有com公共抽线,所以,a和b组是绝对绝缘的,不连通的。
所以,用万用表测,不连通的是一组。
五线:由于五线中,a和b组的公共端是连接在一起的。
用万用表测,当发现有一根线和其他几根线的电阻是相当的,那么,这根线就是公共com端。
对于驱动五线步进电机,公共com端不连接也是可以驱动步进电机的。
六线:a和b组的公共抽线com端是不连通的。
同样,用万用表测电阻,发现其中一根线和其他两根线阻止是一样的,那么这根线是com端,另2根线就属于一组。
对于驱动四相六线步进电机,两根公共com端不接先也可以驱动该步进电机的。
通过上面的方法都可以测得不同线对应的接线,当然,也还有一些朋友不知道,那测出AA’和BB’之后,怎么分开哪根是A哪根是A’,哪根是B哪根是B’呢?之前我也有一样的问题,相信初学步进电机的朋友也一样,我这里有一看到一个帖,里面介绍了一种方法,不知道好不好用(我这边的步进电机就不行):拿到步进电机,根据以前看书对四相步进电机的了解,我对它进行了初步的测试,就是将5伏电源的正端接上最边上两根褐色(指的是公共端,不同电机颜色不同)的线,然后用5伏电源的地线分别和另外四根线(红、兰、白、橙)(指的是剩下的控制线,不同电机颜色不同)依次接触,发现每接触一下,步进电机便转动一个角度,来回五次,电机刚好转一圈,说明此步进电机的步进角度为360/(4×5)=18度。
地线与四线接触的顺序相反,电机的转向也相反。
除了上面这种方法,现在还没有看到有帖介绍如何区分这四条线的,当然,假如有朋友研究出来还请共享一下!谢谢!如果实在不行,最好是找下别人现有的程序,然后一个一个试!没办法!驱动方法我们驱动步进电机的话有好几种方法,个人觉得比较简单也比较常用的还是下面这两种,有四相四拍运行方式即AB-BC-CD-DA-AB,四相八拍运行方式即A-AB-B-BC-C-CD-D-DA-A.,什么是四相四拍,什么是四相八拍,这些字母代表什么意思,请往下看!上图是表示刚刚步进电机的内部结构(手工画的不好看),没有画中线抽头。
中间那个表示电机转子,左边蓝色的表示A线圈,上面红色的表示B线圈,大家看到上面标志中还有一些是打括号的,表示什么呢?就是说这个接线是一开始讲到的A’接线,跟刚刚讲到的那个C字母表示的接线其实是同一根线!那现在我就用图来表示解释下什么是四相四拍,AB-BC-CD-DA-AB表示的是什么。
AB-BC-CD-DA-AB中的出现的字母表示这根线对应加上高电平,其余的都是低电平。
具体就是,在AB处于高电平,CD处于低电平,延时一小段时间;然后BC处于高电平,AD 处于低电平,再延时一小段时间,如此下去CD高,AB低,延时,DA高,BC低,延时……那究竟为什么要这样子呢?下面我用图给大家解释一下。
第一:AB高,CD低,电流则如下图黄色线所示方向流动,产生的磁场使得电机转子顺时针转动90度,转过90度之后就停在那里了;第二:BC高,AD低,电流如下图所示,同样道理,电机转子转过90度;第三,CD高,AB低,如下图:第四,DA高,BC低,如下图:如此一循环之后,电机转子就转过了一周,如果这样循环这样一个动作的话,那电机就会转起来了!现在大家应该明白了什么是四相四拍了吧!同理,四相八拍也是一样的道理,这里就不多说了,大家应该明白!上面讲述的是顺时针转动,那逆时针转动的话该怎么弄了,相信明白上面原理的朋友自己都能够画出来,我这里就只是简单地提供一下给大家做参考,时序为DA-CD-BC-AB!软件部分:知道了硬件原理,软件方面就简单好办了,只要按照上面说的对应地给上高电平低电平的,再来个延时就可以实现了。
对于四相四拍的驱动方法,程序形式如下:While(1){IN1=1;IN2=1;IN3=0;IN4=0;Delay();IN1=0;IN2=1;IN3=1;IN4=0;Delay();IN1=0;IN2=0;IN3=1;IN4=1;Delay();IN1=1;IN2=0;IN3=0;IN4=1;Delay();}同样,反向转动的也能够搞定,四相八拍的也一样道理。
那程序是不是就非常之简单呢?当然不是,程序里面最难的要确定的就是——延时,这个延时的时间把握得好才能够驱动起来,太长了不行,太短了也不行,那究竟是多少才合适呢?这里我教大家一个方法,原理很简单,就是用一个for循环来变换不同的延时时间,通过这样来确定在哪个延时时间范围之内比较合适,这样来慢慢试:For(num=0;num<100;num++){For(time=0;time<100;time++){IN1=1;IN2=1;IN3=0;IN4=0;Delay(num*1000);IN1=0;IN2=1;IN3=1;IN4=0;Delay(num*1000);IN1=0;IN2=0;IN3=1;IN4=1;Delay(num*1000);IN1=1;IN2=0;IN3=0;IN4=1;Delay(num*1000);}}程序里面,num是用来调整每次延时时长的,time是做为每次一个固定时长让电机转一定的时间,因为我们不可以让电机一直变变变,而需要变一下转几圈看看合不合适,就是这样的道理了,通过这种方法大家可以大概知道电机适时多长时长比较合适,在一个适合的延时里电机才能够转动,不同的延时电机转动速度不同。
下面提供一些C51的程序代码(注:这些是在另一份资料找到的,非本人所写,在这里感谢原作者的无私):C51程序代码为:代码一#include <AT89X51.h>static unsigned int count;static unsigned int endcount;void delay();void main(void){count = 0;P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1ET0 = 1; //定时器0中断允许TH0 = 0xFC;TL0 = 0x18; //设定时每隔1ms中断一次TR0 = 1; //开始计数startrun:P1_3 = 0;P1_0 = 1;delay();P1_0 = 0;P1_1 = 1;delay();P1_1 = 0;P1_2 = 1;delay();P1_2 = 0;P1_3 = 1;delay();goto startrun;}//定时器0中断处理void timeint(void) interrupt 1{TH0=0xFC;TL0=0x18; //设定时每隔1ms中断一次count++;}void delay(){endcount=2;count=0;do{}while(count<endcount);}将上面的程序编译,用ISP下载线下载至单片机运行,步进电机便转动起来了,初步告捷!不过,上面的程序还只是实现了步进电机的初步控制,速度和方向的控制还不够灵活,另外,由于没有利用步进电机内线圈之间的“中间状态”,步进电机的步进角度为18度。
所以,我将程序代码改进了一下,如下:代码二#include <AT89X51.h>static unsigned int count;static int step_index;void delay(unsigned int endcount);void gorun(bit turn, unsigned int speedlevel);void main(void){count = 0;step_index = 0;P1_0 = 0;P1_1 = 0;P1_2 = 0;P1_3 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1ET0 = 1; //定时器0中断允许TH0 = 0xFE;TL0 = 0x0C; //设定时每隔0.5ms中断一次TR0 = 1; //开始计数do{gorun(1,60);}while(1);}//定时器0中断处理void timeint(void) interrupt 1{TH0=0xFE;TL0=0x0C; //设定时每隔0.5ms中断一次count++;}void delay(unsigned int endcount){count=0;do{}while(count<endcount);}void gorun(bit turn,unsigned int speedlevel) {switch(step_index){case 0:P1_0 = 1; P1_1 = 0; P1_2 = 0; P1_3 = 0;break; case 1:P1_0 = 1; P1_1 = 1; P1_2 = 0; P1_3 = 0;break; case 2:P1_0 = 0; P1_1 = 1; P1_2 = 0; P1_3 = 0;break; case 3:P1_0 = 0; P1_1 = 1; P1_2 = 1; P1_3 = 0;break; case 4:P1_0 = 0; P1_1 = 0; P1_2 = 1; P1_3 = 0;break; case 5:P1_0 = 0; P1_1 = 0; P1_2 = 1; P1_3 = 1;break; case 6:P1_0 = 0; P1_1 = 0; P1_2 = 0; P1_3 = 1;break; case 7:P1_0 = 1;P1_1 = 0;P1_2 = 0;P1_3 = 1;}delay(speedlevel);if (turn==0){step_index++;if (step_index>7)step_index=0;}else{step_index--;if (step_index<0)step_index=7;}}改进的代码能实现速度和方向的控制,而且,通过step_index静态全局变量能“记住”步进电机的步进位置,下次调用 gorun()函数时则可直接从上次步进位置继续转动,从而实现精确步进;另外,由于利用了步进电机内线圈之间的“中间状态”,步进角度减小了一半,只为9度,低速运转也相对稳定一些了。