两根线的步进电机是什么意思,是什么样的步进电机是什么意思?

四相步进电机全教程&&盖尔@袁(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.,什么是四相四拍,什么是四相八拍,这些字母代表什么意思,请往下看!
ABA&CAB-BC-CD-DA-AB表示的是什么。
AB-BC-CD-DA-AB中的出现的字母表示这根线对应加上高电平,其余的都是低电平。具体就是,在AB处于高电平,CD处于低电平,延时一小段时间;然后BC处于高电平,AD处于低电平,再延时一小段时间,如此下去CD高,AB低,延时,DA高,BC低,延时&&
那究竟为什么要这样子呢?下面我用图给大家解释一下。
第一:AB高,CD低,电流则如下图黄色线所示方向流动,产生的磁场使得电机转子顺时针转动90度,转过90度之后就停在那里了;
时序为DA-CD-BC-AB!
软件部分:
知道了硬件原理,软件方面就简单好办了,只要按照上面说的对应地给上高电平低电平的,再来个延时就可以实现了。对于四相四拍的驱动方法,程序形式如下:
同样,反向转动的也能够搞定,四相八拍的也一样道理。那程序是不是就非常之简单呢?当然不是,程序里面最难的要确定的就是&&延时,这个延时的时间把握得好才能够驱动起来,太长了不行,太短了也不行,那究竟是多少才合适呢?这里我教大家一个方法,原理很简单,就是用一个for循环来变换不同的延时时间,通过这样来确定在哪个延时时间范围之内比较合适,这样来慢慢试:
For(num=0;num&100;num++)
&&&&&& For(time=0;time&100;time++)
Delay(num*1000);
Delay(num*1000);
Delay(num*1000);
Delay(num*1000);
程序里面,num是用来调整每次延时时长的,time是做为每次一个固定时长让电机转一定的时间,因为我们不可以让电机一直变变变,而需要变一下转几圈看看合不合适,就是这样的道理了,通过这种方法大家可以大概知道电机适时多长时长比较合适,在一个适合的延时里电机才能够转动,不同的延时电机转动速度不同。
下面提供一些C51的程序代码(注:这些是在另一份资料找到的,非本人所写,在这里感谢原作者的无私):
C51程序代码为:
#include &AT89X51.h&
static unsigned int
static unsigned int
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位模式1
& ET0 = 1;&&&&&&&&&&&& //定时器0中断允许
& TH0 = 0xFC;
& TL0 = 0x18;&&&&& //设定时每隔1ms中断一次&
& TR0 = 1;&&&&&&&&&& //开始计数
& 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();
//定时器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
static int step_
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位模式1
& ET0 = 1;&&&&&&&&&&& //定时器0中断允许
& TH0 = 0xFE;
& TL0 = 0x0C;& //设定时每隔0.5ms中断一次&
& TR0 = 1;&&&&&&&& //开始计数
&&& 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)
&&& P1_0 = 1;
&&& P1_1 = 0;
&&& P1_2 = 0;
&&& P1_3 = 0;
&&& break;
&&& P1_0 = 1;
&&& P1_1 = 1;
&&& P1_2 = 0;
&&& P1_3 = 0;
&&& break;
&&& P1_0 = 0;
&&& P1_1 = 1;
&&& P1_2 = 0;
&&& P1_3 = 0;
&&& break;
&&& P1_0 = 0;
&&& P1_1 = 1;
&&& P1_2 = 1;
&&& P1_3 = 0;
&&& break;
&&& P1_0 = 0;
&&& P1_1 = 0;
&&& P1_2 = 1;
&&& P1_3 = 0;
&&& break;
&&& P1_0 = 0;
&&& P1_1 = 0;
&&& P1_2 = 1;
&&& P1_3 = 1;
&&& break;
&&& P1_0 = 0;
&&& P1_1 = 0;
&&& P1_2 = 0;
&&& P1_3 = 1;
&&& break;
&&& 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;
&&& step_index--;
&&& if (step_index&0)
&&&&& step_index=7;
  改进的代码能实现速度和方向的控制,而且,通过step_index静态全局变量能&记住&步进电机的步进位置,下次调用 gorun()函数时则可直接从上次步进位置继续转动,从而实现精确步进;另外,由于利用了步进电机内线圈之间的&中间状态&,步进角度减小了一半,只为9度,低速运转也相对稳定一些了。
  但是,在代码二中,步进电机的运转控制是在主函数中,如果程序还需执行其它任务,则有可能使步进电机的运转收到影响,另外还有其它方面的不便,总之不是很完美的控制。所以我又将代码再次改进:
#include &AT89X51.h&
static unsigned int& //计数
static int step_& //步进索引数,值为0-7
static bit& //步进电机转动方向
static bit stop_& //步进电机停止标志
static int //步进电机转速参数,数值越大速度越慢,最小值为1,速度最快
static int&&& //步进电机转速参数计数
void delay(unsigned int endcount);& //延时函数,延时为endcount*0.5毫秒
void gorun();&&&&&&&&& //步进电机控制步进函数
void main(void)
& count = 0;
& step_index = 0;
& spcount = 0;
& stop_flag = 0;
& P1_0 = 0;
& P1_1 = 0;
& P1_2 = 0;
& P1_3 = 0;
& EA = 1;&&&&&&&&&&& &//允许CPU中断
& TMOD = 0x11; //设定时器0和1为16位模式1
& ET0 = 1;&&&&&&&&&& //定时器0中断允许
& TH0 = 0xFE;
& TL0 = 0x0C;&& //设定时每隔0.5ms中断一次
& TR0 = 1;&&&&&&&& //开始计数
& turn = 0;
& speedlevel = 2;
& delay(10000);
& speedlevel = 1;
&&& speedlevel = 2;
&&& delay(10000);
&&& speedlevel = 1;
&&& delay(10000);
&&& stop_flag=1;
&&& delay(10000);
&&& stop_flag=0;
& }while(1);
//定时器0中断处理
void timeint(void) interrupt 1
& TH0=0xFE;
& TL0=0x0C; //设定时每隔0.5ms中断一次
& count++;
& spcount--;
& if(spcount&=0)
&&& spcount =
&&& gorun();
void delay(unsigned int endcount)
& count=0;
& do{}while(count&endcount);
void gorun()
& if (stop_flag==1)
&&& P1_0 = 0;
&&& P1_1 = 0;
&&& P1_2 = 0;
&&& P1_3 = 0;
&&& return;
& switch(step_index)
& case 0: //0
&&& P1_0 = 1;
&&& P1_1 = 0;
&&& P1_2 = 0;
&&& P1_3 = 0;
&&& break;
& case 1: //0、1
&&& P1_0 = 1;
&&& P1_1 = 1;
&&& P1_2 = 0;
&&& P1_3 = 0;
&&& break;
& case 2: //1
&&& P1_0 = 0;
&&& P1_1 = 1;
&&& P1_2 = 0;
&&& P1_3 = 0;
&&& break;
& case 3: //1、2
&&& P1_0 = 0;
&&& P1_1 = 1;
&&& P1_2 = 1;
&&& P1_3 = 0;
&&& break;
& case 4:& //2
&&& P1_0 = 0;
&&& P1_1 = 0;
&&& P1_2 = 1;
&&& P1_3 = 0;
&&& break;
& case 5: //2、3
&&& P1_0 = 0;
&&& P1_1 = 0;
&&& P1_2 = 1;
&&& P1_3 = 1;
&&& break;
& case 6: //3
&&& P1_0 = 0;
&&& P1_1 = 0;
&&& P1_2 = 0;
&&& P1_3 = 1;
&&& break;
& case 7: //3、0
&&& P1_0 = 1;
&&& P1_1 = 0;
&&& P1_2 = 0;
&&& P1_3 = 1;
& if (turn==0)
&&& step_index++;
&&& if (step_index&7)
&&&&& step_index=0;
&&& step_index--;
&&& if (step_index&0)
&&&&& step_index=7;
  在代码三中,我将步进电机的运转控制放在时间中断函数之中,这样主函数就能很方便的加入其它任务的执行,而对步进电机的运转不产生影响。在此代码中,不但实现了步进电机的转速和转向的控制,另外还加了一个停止的功能,呵呵,这肯定是需要的。
  步进电机从静止到高速转动需要一个加速的过程,否则电机很容易被&卡住&,代码一、二实现加速不是很方便,而在代码三中,加速则很容易了。在此代码中,当转速参数speedlevel 为2时,可以算出,此时步进电机的转速为1500RPM,而当转速参数speedlevel 1时,转速为3000RPM。当步进电机停止,如果直接将speedlevel 设为1,此时步进电机将被&卡住&,而如果先把speedlevel 设为2,让电机以1500RPM的转速转起来,几秒种后,再把speedlevel 设为1,此时电机就能以3000RPM的转速高速转动,这就是&加速&的效果。
对于四线的步进电机,就没所谓的公共端啦!但对于五线与六线的,也就是有公共端的步进电机,我个人觉得公共端可以不接,在没接的情况下,相比之下速度方面是快了,感觉也比较好使(可能是我这款电机才这样),这个公共端好像用上之后会使得控制方面变得比较稳定一点吧!(就是步进角可以变得小点),但这样牺牲的就是速度,所以,对于我来讲,公共端是不接的,直接悬空!
好了!不废话了!今天就吹到这里,有什么错误还得请各位多多指教!谢谢!
旗下网站:
与非门科技(北京)有限公司 All Rights Reserved.
京ICP证:070212号
北京市公安局备案编号: 京ICP备:号步进电机的几项几线是什么意思
步进电机的几项几线是什么意思
09-05-23 &匿名提问
DIR是英文缩写,意思为方向;CP是前进脉冲的英文缩写;FREE是马达自由释放信号;这几个都是控制信号输入端,每一对正负端子内都有光藕,导通有效;AB四个端子接步进电机的两相四根线,AC为交流电源输入端
请登录后再发表评论!您现在所在的是:
→ 浏览主题:
* 帖子主题:
文章数:36
年度积分:228
历史总积分:328
注册时间:
有红蓝黄绿四根线,怎么接,怎么对应A+ A- B+ B-
文章数:2039
年度积分:2486
历史总积分:2536
注册时间:
万用表量一下:相通的一组接A+ A-;剩余的2根线接 B+ B-
如果转向不合符要求,任意把A+ A-相互调换或者 B+ B- 相互调换
lixuefeng7272
文章数:871
年度积分:1156
历史总积分:3445
注册时间:
红绿黄蓝对应A+ A- B+ B-。应该还有两根黑线,白线接BC,AC端子吧。
不要怕被别人利用,人家利用你说明你还有用
robbielpzl
文章数:129
年度积分:397
历史总积分:397
注册时间:
四线制步进就是2组线圈每组线圈各2根线,A+,A-一组,B+,B-一组,阻值比较小,需要换电机转向可把任意一组线圈的2根线互换。
工控学堂推荐视频:

我要回帖

更多关于 雷赛步进电机怎么样 的文章

 

随机推荐