步进电机细分驱动电路及原理(后面是已经编好的程序改改就可直接使用)_第1页
步进电机细分驱动电路及原理(后面是已经编好的程序改改就可直接使用)_第2页
步进电机细分驱动电路及原理(后面是已经编好的程序改改就可直接使用)_第3页
步进电机细分驱动电路及原理(后面是已经编好的程序改改就可直接使用)_第4页
步进电机细分驱动电路及原理(后面是已经编好的程序改改就可直接使用)_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

步进电机细分驱动电路及原理(后面是已经编好的程序改改就可直接使用)步进电机细分驱动电路及原理(后面是已经编好的程序改改就可直接使用)细分原理分析步进电机驱动线路,如果按照环形分配器决定的分配方式,控制电动机各相绕组的导通或截止,从而使电动机产生步进所需的旋转磁势拖动转子步进旋转,则步距角只有二种,即整步工作或半步工作,步距角已由电机结构所确定。如果要求步进电机有更小的步距角,更高的分辨率,或者为了电机振动、噪声等原因,可以在每次输入脉冲切换时,只改变相应绕组中额定的一部分,则电机的合成磁势也只旋转步距角的一部分,转子的每步运行也只有步距角的一部分。这里,绕组电流不是一个方波,而是阶梯波,额定电流是台阶式的投入或切除,电流分成多少个台阶,则转子就以同样的次数转过一个步距角,这种将一个步距角细分成若干步的驱动方法,称为细分驱动。在国外,对于步进系统,主要采用二相混合式步进电机及相应的细分驱动器。但在国内,广大用户对“细分”还不是特别了解,有的只是认为,细分是为了提高精度,其实不然,细分主要是改善电机的运行性能。由于细分驱动器要精确控制电机的相电流,所以对驱动器要有相当高的技术要求和工艺要求,成本亦会较高。图3给出了三相步进电机八细分时的各相电流状态。由于各相电流是以1P4的步距上升或下降的,原来一步所转过的角度θ将由八步完成,实现了步距角的八细分。由此可见,步进电机细分驱动的关键在于细分步进电机各相励磁绕组中的电流。步进电机细分驱动电路为了对步进电机的相电流进行控制,从而达到细分步进电机步距角的目的,人们曾设计了很多种步进电机的细分驱动电路。随着微型计算机的发展,特别是单片计算机的出现,为步进电机的细分驱动带来了便利。目前,步进电机细分驱动电路大多数都采用单片微机控制,它们的构成框图如图4所示。单片机根据要求的步距角计算出各相绕组中通过的电流值,并输出到数模转换器(DPA)中,由DPA把数字量转换为相应的模拟电压,经过环形分配器加到各相的功放电路上,控制功放电路给各相绕组通以相应的电流,来实现步进电机的细分。单片机控制的步进电机细分驱动电路根据末级功放管的工作状态可分为放大型和开关型两种(见下图5)。图5步进电机细分驱动电路放大型步进电机细分驱动电路中末级功放管的输出电流直接受单片机输出的控制电压控制,电路较简单,电流的控制精度也较高,但是由于末级功放管工作在放大状态,使功放管上的功耗较大,发热严重,容易引起晶体管的温漂,影响驱动电路的性能。甚至还可能由于晶体管的热击穿,使电路不能正常工作。因此该驱动电路一般应用于驱动电流较小、控制精度较高、散热情况较好的场合。开关型步进电机细分驱动电路中的末级功放管工作在宽调制电路的调制频率较高,一般大于20kHz,因此,虽然是断续通电,但电机绕组中的电流还是较平稳的。和斩波式细分动电路相比,脉宽调制式细分驱动电路的控制精度高,工作频率稳定,但线路较复杂。因此,脉宽调制式细分驱动电路多用于综合驱动性能要求较高的场合。C51程序代码为:代码一#include<AT89X51.h>staticunsignedintcount;staticunsignedintendcount;voiddelay();voidmain(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();gotostartrun;}//定时器0中断处理voidtimeint(void)interrupt1{TH0=0xFC;TL0=0x18;//设定时每隔1ms中断一次count++;}voiddelay(){endcount=2;count=0;do{}while(count<endcount);}将上面的程序编译,用ISP下载线下载至单片机运行,步进电机便转动起来了,初步告捷!不过,上面的程序还只是实现了步进电机的初步控制,速度和方向的控制还不够灵活,另外,由于没有利用步进电机内线圈之间的“中间状态”,步进电机的步进角度为18度。所以,我将程序代码改进了一下,如下:代码二#include<AT89X51.h>staticunsignedintcount;staticintstep_index;voiddelay(unsignedintendcount);voidgorun(bitturn,unsignedintspeedlevel);voidmain(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中断处理voidtimeint(void)interrupt1{TH0=0xFE;TL0=0x0C;//设定时每隔0.5ms中断一次count++;}voiddelay(unsignedintendcount){count=0;do{}while(count<endcount);}voidgorun(bitturn,unsignedintspeedlevel){switch(step_index){case0:P1_0=1;P1_1=0;P1_2=0;P1_3=0;break;case1:P1_0=1;P1_1=1;P1_2=0;P1_3=0;break;case2:P1_0=0;P1_1=1;P1_2=0;P1_3=0;break;case3:P1_0=0;P1_1=1;P1_2=1;P1_3=0;break;case4:P1_0=0;P1_1=0;P1_2=1;P1_3=0;break;case5:P1_0=0;P1_1=0;P1_2=1;P1_3=1;break;case6:P1_0=0;P1_1=0;P1_2=0;P1_3=1;break;case7: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度,低速运转也相对稳定一些了。但是,在代码二中,步进电机的运转控制是在主函数中,如果程序还需执行其它任务,则有可能使步进电机的运转收到影响,另外还有其它方面的不便,总之不是很完美的控制。所以我又将代码再次改进:代码三#include<AT89X51.h>staticunsignedintcount;//计数staticintstep_index;//步进索引数,值为0-7staticbitturn;//步进电机转动方向staticbitstop_flag;//步进电机停止标志staticintspeedlevel;//步进电机转速参数,数值越大速度越慢,最小值为1,速度最快staticintspcount;//步进电机转速参数计数voiddelay(unsignedintendcount);//延时函数,延时为endcount*0.5毫秒voidgorun();//步进电机控制步进函数voidmain(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位模式1ET0=1;//定时器0中断允许TH0=0xFE;TL0=0x0C;//设定时每隔0.5ms中断一次TR0=1;//开始计数turn=0;speedlevel=2;delay(10000);speedlevel=1;do{speedlevel=2;delay(10000);speedlevel=1;delay(10000);stop_flag=1;delay(10000);stop_flag=0;}while(1);}//定时器0中断处理voidtimeint(void)interrupt1{TH0=0xFE;TL0=0x0C;//设定时每隔0.5ms中断一次count++;spcount--;if(spcount<=0){spcount=speedlevel;gorun();}}voiddelay(unsignedintendcount){count=0;do{}while(count<endcount);}voidgorun(){if(stop_flag==1){P1_0=0;P1_1=0;P1_2=0;P1_3=0;return;}switch(step_index){case0://0P1_0=1;P1_1=0;P1_2=0;P1_3=0;break;case1://0、1P1_0=1;P1_1=1;P1_2=0;P1_3=0;break;case2://1P1_0=0;P1_1=1;P1_2=0;P1_3=0;break;case3://1、2P1_0=0;P1_1=1;P1_2=1;P1_3=0;break;case4://2P1_0=0;P1_1=0;P1_2=1;P1_3=0;break;case5://2、3P1_0=0;P1_1=0;P1_2=1;P1_3=1;break;case6://3P1_0=0;P1_1=0;P1_2=0;P1_3=1;break;case7://3、0P1_0=1;P1_1=0;P1_2=0;P1_3=1;}if(turn==0){step_index++;if(step_index>7)step_index=0;}else{step_index--;if(step_index<0)step_index=7;}}在代码三中,我将步进电机的运转控制放在时间中断函数之中,这样主函数就能很方便的加入其它任务的执行,而对步进电机的运转不产生影响。在此代码中,不但实现了步进电机的转速和转向的控制,另外还加了一个停止的功能,呵呵,这肯定是需要的。步进电机从静止到高速转动需要一个加速的过程,否则电机很容易被“卡住”,代码一、二实现加速不是很方便,而在代码三中,加速则很容易了。在此代码中,当转速参数speedlevel为2时,可以算出,此时步进电机的转速为1500RPM,而当转速参数speedlevel1时,转速为3000RPM。当步进电机停止,如果直接将speedlevel设为1,此时步进电机将被“卡住”,而如果先把speedlevel

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论