步进电机程序编写及说明

合集下载

大学毕业设计 C51程序控制步进电机

大学毕业设计 C51程序控制步进电机

题目:简易步进电机控制步进电机控制摘要:本设计采用ATMEL公司DIP-40封装的AT89S52单片机实现对四相步进电机的手动和按键控制。

由单片机产生的脉冲信号经过分配后分解出对应的四相脉冲,分解出的四相脉冲经驱动电路功率放大后驱动步进电机的转动。

转速的调节和状态的改变由按键进行选择,此过程由程序直接进行控制。

通过键盘扫描把选择的信息反馈给单片机,单片机根据反馈信息做出相应的判断并改变输出脉冲的频率或转动状态信号。

电机转动的不同状态由液晶LCD1602显示出来。

而设计的扩展部分可以通过红外信号的发射由另一块单片机和红外线LED完成,用红外万能接收头接收红外信号,可以实现对电机的控制进行红外遥控。

关键字:四相步进电机单片机功率放大 LCD1602步进电机控制 (1)摘要 (1)关键字 (1)前言 (3)1系统总体方案设计及硬件设计 (4)1.1步进电机 (4)1.1.1 步进电机的种类 (4)1.1.2 步进电机的特点 (4)1.1.3 步进电机的原理 (5)1.2 控制系统电路设计 (7)1.3 液晶显示LCD1602 (7)1.4 AT89S52核心部件及系统SCH原理图 (9)1.5 LN2003A驱动 (10)2软件设计及调试 (13)2.1程序流程 (13)2.2软件设计及调试 (14)3 扩展功能说明 (15)4设计总结 (16)5 设计源程序 (16)6 附录 (21)参考文献 (22)附2:系统原理图及实物图 (23)步进电机广泛应用于对精度要求比较高的运动控制系统中,如机器人、打印机、软盘驱动器、绘图仪、机械阀门控制器等。

目前,对步进电机的控制主要有由分散器件组成的环形脉冲分配器、软件环形脉冲分配器、专用集成芯片环形脉冲分配器等。

分散器件组成的环形脉冲分配器体积比较大,同时由于分散器件的延时,其可靠性大大降低;软件环形分配器要占用主机的运行时间,降低了速度;专用集成芯片环形脉冲分配器集成度高、可靠性好,但其适应性受到限制,同时开发周期长、需求费用较高。

步进电机的控制程序

步进电机的控制程序

mega16的,16和32管脚兼容,只不过flash大小不一样,不过中断向量号也不一样,你看下自己改改。

时钟频率:内部RC 1M 芯片:ULN2003 键值:0 小角度快正转。

1 小角度快倒。

2 大角度快转。

3 大角度快倒。

4 小角度正慢转。

5 小角度倒慢转。

6 大角度正慢转。

7 大角度倒慢转。

********************************************************************/#include<iom16v.h>#include <macros.h>#define uchar unsigned char#define uint unsigned intuchar a=0,b=0;uchar KEY_num=0xe1;unsigned int m=9000;const uchar f1[]={0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03}; //正转时序3.75度const uchar f2[]={0x04,0x06,0x02,0x03,0x01,0x09,0x08,0x0c}; //倒转时序3.75度const uchar f3[]={0x01,0x02,0x04,0x08}; //正转时序7.5度const uchar f4[]={0x01,0x08,0x04,0x02}; //倒转时序7.5度void delay(int k) //延时{ int i; for(i=0;i<k;i++); }void delay_10ms(uint data){ uint m=2; while(data) { data--; m=2; while(m)m--; } }void zhengzhuan1(void) //正转3.75度{ unsigned char j; for (j=0;j<8;j++) { PORTC=f1[j]; delay(m); } }void daozhuan1(void) //倒转3.75度{ unsigned char j; for (j=0;j<8;j++) { PORTC=f2[j]; delay(m); } }void zhengzhuan2(void) //正转7.5度{ unsigned char j; for (j=0;j<4;j++) { PORTC=f3[j]; delay(m); } }void daozhuan2(void) //倒转7.5度{ unsigned char j; for (j=0;j<4;j++) { PORTC=f4[j]; delay(m); } }void port_int() //初始化端口{ PORTB = 0xf0; DDRB = 0x0F; DDRC=0xff; PORTC=0x01; }void init_devices(void){ CLI(); //禁止所有中断MCUCR = 0x00; MCUCSR = 0x80;//禁止JTAG GICR = 0x00; port_int();SEI();//开全局中断}//按键键值读取程序//返回按键键值,如果没有按键则返回0.void KYY_read(){ //定义按键值存放内存PORTB=0xf0; //行全部送高电平PORTB=0xf0;if((PINB&0xf0)!=0xf0) //有按键{ delay_10ms(1);//延时消抖if((PINB&0xf0)!=0xf0) //确定有按键按下{ PORTB=0xfe; //扫描第一行PORTB=0xfe;if((PINB&0xf0)!=0xf0){ KEY_num=(PINB&0xf0)+1; a=9; }PORTB=0xfd; //扫描第二行PORTB=0xfd;if((PINB&0xf0)!=0xf0){ KEY_num=(PINB&0xf0)+2; } PORTB=0xfb; //扫描第三行PORTB=0xfb;if((PINB&0xf0)!=0xf0){ KEY_num=(PINB&0xf0)+4; } PORTB=0xf7; //扫描第四行PORTB=0xf7;if((PINB&0xf0)!=0xf0){ KEY_num=(PINB&0xf0)+8; } } } //没有按键返回0 }//按键执行程序//送如参数:按键键值KEY_do(uchar data){ uchar KEY_number=data;switch(KEY_number){ case 0xe1:a=0;b=0;daozhuan1();m=5000;break;case 0xd1:a=0;b=1;daozhuan1();m=6000;break;case 0xb1:a=0;b=2;daozhuan1();m=7000;break;case 0x71:a=0;b=3;daozhuan1();m=8000;break;case 0xe2:a=0;b=4;daozhuan2();m=5000;break;case 0xd2:a=0;b=5;daozhuan2();m=6000;break;case 0xb2:a=0;b=6;daozhuan2();m=7000;break;case 0x72:a=0;b=7;daozhuan2();m=8000;break;case 0xe4:a=0;b=8;zhengzhuan1();m=5000;break;case 0xd4:a=0;b=9;zhengzhuan1();m=6000;break;case 0xb4:a=1;b=0;zhengzhuan1();m=7000;break;case 0x74:a=1;b=1;zhengzhuan1();m=8000;break;case 0xe8:a=1;b=2;zhengzhuan2();m=5000;break;case 0xd8:a=1;b=3;zhengzhuan2();m=6000;break;case 0xb8:a=1;b=4;zhengzhuan2();m=7000;break;case 0x78:a=1;b=5;zhengzhuan2();m=8000;break; default:b=0;break;}}void main (void)//主程序{ init_devices();while(1){ KYY_read(); KEY_do(KEY_num); }}#include <reg51.h> //51芯片管脚定义头文件#include <intrins.h> //内部包含延时函数_nop_();#define uchar unsigned char#define uint unsigned intuchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};sbit K1 = P3^4; //正转sbit K2 = P3^5; //反转sbit K3 = P3^6; //停止sbit K4 = P3^7;sbit BEEP = P0^6; //蜂鸣器/********************************************************//*/* 延时t毫秒/* 11.0592MHz时钟,延时约1ms/*/********************************************************/void delay(uint t){uint k;while(t--){for(k=0; k<125; k++){ }}}/**********************************************************/void delayB(uchar x) //x*0.14MS{uchar i;while(x--)for (i=0; i<13; i++){ }}}/**********************************************************/ void beep(){uchar i;for (i=0;i<180;i++){delayB(5);BEEP=!BEEP; //BEEP取反}BEEP=1; //关闭蜂鸣器}/********************************************************/ /*/*步进电机正转/*/********************************************************/ void motor_ffw(){uchar i;uint j;for (j=0; j<12; j++) //转1*n圈{if(K4==0){break;} //退出此循环程序for (i=0; i<8; i++) //一个周期转30度{P0 = FFW[i]; //取数据delay(15); //调节转速}}}/********************************************************/ /*/*步进电机反转/********************************************************/ void motor_rev(){uchar i;uint j;for (j=0; j<12; j++) //转1×n圈{if(K4==0){break;} //退出此循环程序for (i=0; i<8; i++) //一个周期转30度{P0 = REV[i]; //取数据delay(15); //调节转速}}}/********************************************************** 主程序**********************************************************/main(){uchar r,N=5; //N 步进电机运转圈数P2=0xDF;while(1){if(K1==0){beep();for(r=0;r<N;r++){motor_ffw(); //电机正转if(K4==0){beep();break;} //退出此循环程序}}else if(K2==0){beep();for(r=0;r<N;r++){motor_rev(); //电机反转if(K4==0){beep();break;} //退出此循环程序}}elseP0 = 0xf0;}}/********************************************************/ULN2803是8路NPN达林顿连接晶体管系列,特别适用于低逻辑电平数字电路,如:TTL,COMS或PMOS/NMOS,和较高的电压/电流要求之间的接口,广泛应用与计算机、打印机、继电器、灯等类似负载中。

步进电机【C语言驱动程序】

步进电机【C语言驱动程序】

/*C语言代码:*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar code CCW[4]={0xFC,0xF6,0xF3,0xF9}; //逆时钟旋转相序表 uchar code CW[4]={0xFC,0xF9,0xF3,0xF6}; //正时钟旋转相序表sbit K1=P1^5; //反转按键sbit K2=P1^6; //正转按键sbit K3=P1^7; //停止按键sbit FMQ=P1^4; // 蜂鸣器void delaynms(uint aa){uchar bb;while(aa--){for(bb=0;bb<110;bb++) //1ms基准延时程序{;}}}void delay500us(void){int j;for(j=0;j<57;j++){;}}void beep(void){uchar t;for(t=0;t<100;t++){delay500us();FMQ=!FMQ; //产生脉冲}FMQ=1; //关闭蜂鸣器}void motor_ccw(void){uchar i,j;for(j=0;j<4;j++) //电机旋转一周,不是外面所看到的一周,是里面的传动轮转了一周{if(K3==0){break; //如果K3按下,退出此循环}for(i=0;i<8;i++) //旋转45度{P0=CCW[i];delaynms(10); //调节转速}}}void motor_cw(void){uchar i,j;for(j=0;j<4;j++){if(K3==0){break; //如果K3按下,退出此循环}for(i=0;i<8;i++) //旋转45度{P0=CW[i];delaynms(2); //调节转速}}}void main(void){uchar r;uchar N=64; //因为步进电机是减速步进电机,减速比的1/64 , //所以N=64时,步进电机主轴转一圈while(1){if(K1==0){beep();for(r=0;r<N;r++){motor_ccw(); //电机逆转if(K3==0){beep();break;}}}else if(K2==0){beep();for(r=0;r<N;r++){motor_cw(); //电机反转if(K3==0){beep();break;}}}elseP0=0x00; //电机停止}}。

步进电机芯片初始化流程及程序段

步进电机芯片初始化流程及程序段

步进电机芯片初始化流程及程序段设计原理分析使步进电机按照一定的方式运转,则要控制步进电机的电流的输出顺序。

将步进电机相序表存放于内存区,设置指针地址,从表中取出通电码,再输出到步进电机,产生一定的运行方式。

四相步进电机双四拍正向加电码:03H,06H,0CH,09H,双八拍正向加电码:AB→ABC →BC→BCD→CD→CDA→DA→DAB(03H,07H,06H,0EH,0CH,0DH,09H,0BH)。

选择不同的工作方式可调用DOS系统功能,使用09H中断号显示提示信息。

然后,使用25H中断号设置中断向量,然后使用21H功能号读取键盘值,存入设置的堆栈中。

再从堆栈中取出键盘值,判断后执行对应功能。

模拟电机转动则需要显示程序。

可调用BIOS,使用10H中断,设置功能号选择不同的功能,绘制简易图形。

每取出一个加电码则需要调用不同的图形。

步进电机的转速与输入脉冲频率成正比,频率越高,转速越高。

调节步进电机电机绕组通电时间,即可调整速度。

模拟显示时可通过不同的延迟程序实现不同的转速。

延时程序可使用8086系统BIOS功能,调用1AH中断号,设置延迟时长。

步进电机控制原理步进电机是将电脉冲信号转换成角位移的一种机电式数模转换器。

其旋转的角位移与输入脉冲的个数成正比;转速与输入脉冲的频率成正比;转动方向和输入脉冲对绕组加电的顺序有关。

因此,步进电机旋转的角度位移、转速以及方向均受输入脉冲的控制。

微机步进电机控制系统原理图步进电机接口的硬件部分主要是提供输送相序代码的并行数据线(8根),以及保护电机绕组的器件,所以接口电路以8255A为主芯片,由8086传送加电代码.步进电机的停转以及快慢控制——键盘控制使用25H中断号设置中断向量,然后使用21H功能号读取键盘值,存入设置的堆栈中。

再从堆栈中取出键盘值,判断后执行对应功能。

按键enter启动电机。

按键1——8选择不同的电机运行方式,按键ESC退出程序。

调用键盘中断服务,按下enter键后,显示“WELCOM”,调用BUJIN子程序。

单片机步进电机控制程序代码

单片机步进电机控制程序代码

单片机步进电机控制程序代码引言:步进电机是一种常见的电机类型,它具有准确的位置控制和高速运动的特点,在许多应用中被广泛使用。

为了实现步进电机的精确控制,我们需要编写相应的单片机控制程序代码。

本文将介绍一种常见的单片机步进电机控制程序代码,并详细解析其实现原理和使用方法。

一、控制原理:步进电机通过控制电流的方向和大小来控制转子的运动,常见的步进电机控制方式有两相和四相控制。

本文将以四相控制为例进行介绍。

四相控制是指通过控制四个线圈的电流状态来控制步进电机的运动。

具体控制方式有全步进和半步进两种。

全步进模式下,每一步都是四个线圈中的两个同时激活;半步进模式下,每一步都是四个线圈中的一个或两个同时激活。

在本文中,我们将介绍半步进模式的控制程序代码。

二、程序代码:下面是一段常见的单片机步进电机控制程序代码:```c#include <reg51.h>sbit A1 = P1^0;sbit A2 = P1^1;sbit B1 = P1^2;sbit B2 = P1^3;void delay(unsigned int t){unsigned int i, j;for (i = 0; i < t; i++)for (j = 0; j < 120; j++);}void main(){unsigned int i;unsigned char step[8] = {0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09};while (1){for (i = 0; i < 8; i++){P1 = step[i];delay(1000);}}}```三、代码解析:1. 引用头文件reg51.h,该头文件定义了单片机51的寄存器等相关信息。

2. 定义了四个IO口A1、A2、B1、B2,分别对应步进电机的四个线圈。

3. 定义了一个延时函数delay,用于控制电机转动的速度。

两相步进电机 控制程序

两相步进电机 控制程序

两相步进电机控制程序一、初始化设置在控制步进电机之前,需要进行一些初始化设置。

这包括:1. 配置微控制器:选择适合的微控制器,并为其分配必要的资源和接口。

2. 电机参数设定:根据步进电机的规格和性能,设定合适的参数,如步进角度、驱动电流等。

3. 接口配置:配置微控制器与步进电机驱动器之间的接口,包括电源、信号线等。

二、电机驱动脉冲生成为了使步进电机按照设定的方向和步数转动,需要生成合适的驱动脉冲。

这通常通过微控制器实现,具体步骤如下:1. 确定目标位置:根据应用需求,确定步进电机需要转到的目标位置。

2. 计算步数:根据目标位置和步进电机的步进角度,计算出需要转动的步数。

3. 生成驱动脉冲:根据步数和电机的工作模式(单拍、双拍等),生成合适的驱动脉冲序列。

三、电机方向控制步进电机的方向可以通过改变驱动脉冲的顺序来控制。

一般来说,有两种方式来控制电机的方向:1. 通过改变脉冲的顺序:正向或反向发送脉冲序列,可以控制电机向正向或反向转动。

2. 通过使用不同的工作模式:一些步进电机驱动器支持不同的工作模式,如全步、半步、1/4步等。

通过选择不同的工作模式,可以改变电机的转动方向和速度。

四、电机速度调节调节步进电机的速度可以通过改变驱动脉冲的频率来实现。

一般来说,脉冲频率越高,电机转速越快。

同时,也可以通过改变工作模式来调节电机的速度。

五、电机状态监测与保护为了确保步进电机的安全运行,需要实时监测电机的状态,并进行必要的保护措施。

这包括:1. 温度监测:监测电机的温度,防止过热。

2. 电流监测:监测电机的驱动电流,防止过流。

3. 位置监测:通过编码器等传感器监测电机的实际位置,防止位置丢失或错误。

4. 故障诊断:通过分析监测数据,判断电机是否出现故障,并采取相应的处理措施。

六、异常处理与故障诊断为了提高控制程序的鲁棒性,需要设计异常处理与故障诊断机制。

这包括:1. 异常情况检测:通过分析监测数据和运行状态,检测出异常情况。

步进电机程序流程图

步进电机程序流程图

图1 主程序流程图说明:1、flag_stop为电机转动或停止标志位,为0表示转动,为1表示定时转动,默认为1,通过某一按键会改变该位的值;2、flag_mode为电机正转或反转标志位,为0表示正转,为1表示反转,默认为0,同过某一按键会改变改位的值;图2 按键处理函数流程图图3 电机转步函数流程图下面是诗情画意的句子欣赏,不需要的朋友可以编辑删除!!谢谢1. 染火枫林,琼壶歌月,长歌倚楼。

岁岁年年,花前月下,一尊芳酒。

水落红莲,唯闻玉磬,但此情依旧。

2. 玉竹曾记凤凰游,人不见,水空流。

3. 他微笑着,在岁月的流失中毁掉自己。

4. 还能不动声色饮茶,踏碎这一场,盛世烟花。

5. 红尘嚣浮华一世转瞬空。

6. 我不是我你转身一走苏州里的不是我。

7. 几段唏嘘几世悲欢可笑我命由我不由天。

8. 经流年梦回曲水边看烟花绽出月圆。

9. 人生在世,恍若白驹过膝,忽然而已。

然,我长活一世,却能记住你说的每一话。

10. 雾散,梦醒,我终于看见真实,那是千帆过尽的沉寂。

11. 纸张有些破旧,有些模糊。

可每一笔勾勒,每一抹痕迹,似乎都记载着跨越千年万载的思念。

12. 生生的两端,我们彼此站成了岸。

13. 缘聚缘散缘如水,背负万丈尘寰,只为一句,等待下一次相逢。

14. 握住苍老,禁锢了时空,一下子到了地老天荒15. 人永远看不破的镜花水月,不过我指间烟云世间千年,如我一瞬。

16. 相逢一醉是前缘,风雨散,飘然何处。

17. 虚幻大千两茫茫,一邂逅,终难忘。

相逢主人留一笑,不相识,又何妨。

18. 天下风云出我辈,一入江湖岁月催;皇图霸业谈笑间,不胜人生一场醉。

19. 得即高歌失即休,多愁多恨亦悠悠,今朝有酒今朝醉,明日愁来明日愁。

20. 直道相思了无益,未妨惆怅是清狂。

21. 看那天地日月,恒静无言;青山长河,世代绵延;就像在我心中,你从未离去,也从未改变。

22. 就这样吧,从此山水不相逢。

23. 人天自两空,何相忘,何笑何惊人。

步进电机程序

步进电机程序

/*本程序为步进电机控制程序步进电机步距角18°P1口低四位输出控制数码管共阳极P0为数据口P30~P32为位选个位~百位P33为标志正反转位三个独立按键P20~22 加减正反转切换键*/#include<reg51.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit sum=P2^0; //加sbit inc=P2^1; //减sbit change=P2^2; //正反转uint T=300; //脉冲延时T毫秒uchar ledwx=0xfe; //位选数据///////////////////////////////// uchar sj=0x00; //段选数据uchar jj; //正转步数bit zd=0; //中断奇偶标志起记忆上一次按键标志bit zfo; //正反转上一次标志位bit zf=1; //正转标志位bit sum1=0; //加速标志位bit sumo; //加速键上一次记忆bit inco; //减速键上一次记忆bit inc1=0; //减速标志位uchar speed[4]={0}; //转速显示数据个十百位标志位uchar code LEDData[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40}; //共阳极数码管表////////uchar code djz[4]={0x01,0x02,0x04,0x08}; //正时钟旋转相序表/*******************************/void count() //转速显示各数位的计算{uint n=0;n=3000/T; //转速speed[0]=n%10;speed[1]=(n/10)%10;speed[2]=n/100;if(zf)speed[3]=10;else speed[3]=11;}/*******************************/void init() //程序初始化开定时器中断{EA=1;ET0=1;TMOD=0x01;TH0=(65536-4608)/256; //定时5ms中断TL0=(65536-4608)%256;TR0=1;}/*******************************/void t0_time() interrupt 1 /////////////////////////{TH0=(65536-4608)/256; //定时5ms中断TL0=(65536-4608)%256;if(zd==0) // 记忆上一次按键标志{zfo=change;sumo=sum;inco=inc;} zd=~zd;if((zfo==change)&&(zfo==0)) //比较前5ms和现在是否一样为低电平,消除抖动zf=0;if((zfo==change)&&(zfo==1)) //比较前5ms和现在是否一样为低电平,消除抖动zf=1;if((sumo==sum)&&(sumo==0)){sum1=1;inc1=0;}if((inco==inc)&&(inc==0)){sum1=0;inc1=1;}P3=0xff; //数码管全灭P0=LEDData[speed[sj++]]; //送数据P3=ledwx; //点亮一个数码管ledwx=_crol_(ledwx,1);if(ledwx==0xef){ledwx=0xfe;sj=0;}}/*******************************/void delay1(uint i) //电机脉冲延时{uint j;for(;i>0;i--)for(j=114;j>0;j--);}/*******************************/void djzz() //电机正转{if(jj==4)jj=0;P1=djz[jj++];delay1(T);}/*******************************/void djfz() //电机反转{if(jj==0)jj=4;P1=djz[--jj];delay1(T);}/*******************************/void main(){init(); //初始化count();while(1){if(zf) //正转{if((sum1==1)&&(T>10)) //加速T--;if((inc1==1)&&(T<300)) //减速T++;djzz();}else //反转{if((sum1==1)&&(T>10)) //加速T--;if((inc1==1)&&(T<300)) //减速T++;djfz();}count();}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

步进电机
学习交流群——126500542(验证信息:千寻琥珀心)
在这里介绍一下如何用51单片机驱动步进电机。

本例所使用的步进电机为四项驱动,驱动电压为12V,锯齿角(为什么叫锯齿叫而不叫步进角,我也不知道这样解释是否正确,但是根据步进角计算公式所得的结果将7.5理解为锯齿叫会更好些,也在网上搜了不少资料,说是步进角的较多,但都是直接给出的,而未作出计算,不过也有是将其作为锯齿角的,并且结合书上的内容,在此就将此作为锯齿角理解,那何谓步进角,下面公式将给出)为7.5度。

(也就是说锯齿之间的单位角度),不进一圈总共需要360度,故有48个锯齿。

在此对电路图部分不再给出,具体引脚连接接下来给出。

本例所使用的电机驱动芯片为达林顿驱动器(ULN2003),通过P1.0~P1.3分别接通步进电机的驱动线圈来控制步进电机的运转。

注意如果直接使用单片机通过驱动芯片驱动电机,力矩可能不够大,效果不是很好,因为ULN2003的驱动电压为12V,而单片机系统电压为5V,故请读者注意此点,在设计电路时,另施电压。

步进电机要想正常工作,必须有驱动信号,转动的速度与驱动信号的频率是成正比的。

(实例中将会给出并予以说明)接下来我们看看对于电机驱动中的信号的产生。

本例中采用的步进电机为四项,三项驱动和四项驱动原理上
是一样的。

假设步进电机的四个项为:A、B、C、D。

它的拍数可由读者任意设定(即步进节奏)。

再继续下面的内容时,我们现在此给出一个计算步进电机的公式:Qs=360/NZr,其中N=McC 为运行的拍数,McC为控制绕组项数,C为状态系数,当采用单双本项拍数时,C=1,当采用单双本项一倍拍数时,C=2。

(此处说的本项拍数,如三项为单三拍,双三拍。

本项一倍拍数为单六拍,简言之,三拍为1.六拍为2对于四项则四拍为1,8拍为2(说的有些玄乎,手中板砖还望留情)),Zr为转子齿数,先来看看单四拍,即A→B→C→D→A.因为上述已经给出了锯齿数,此例C=1,所以Qs=360/(4*1*48)=1.875°。

故此电机的步进角为1.875°(既步与步之间的角度),因为行进是和脉冲有关的,一个脉冲行进一步,那么行进一圈,所需脉冲数为:360/1.875=192个脉冲。

同时我们如果控制这些脉冲的频率就可以直接控制步进电机的运转速度了。

继续我们的单四拍,运行方向A→B→C→D →A。

(假设为正转)则在程序中对应的操作执行码为:(硬件连接时P1口的高四位不用全置1,此处只需用到低四位) P1.3 P1.2 P1.1 P1.0
D C B A (对应4个线圈)
1 1 1 0 0xfe (根据外部链接电路定,也可以是0001,此处采用低电平导通,导通A项线圈)
1 1 0 1 0xfd (导通B项线圈)
1 0 1 1 0xfb (导通C项线圈)
0 1 1 1 0xf7 (导通D项线圈)
如上表所示对应A→B→C→D→A的运行方向的码表为0xfe,0xfd,0xfb,0xf7,0xfe(若反向,只需将此表倒置过来就行)对于四项四拍的其他情况在此就不做多解了,基本上是一样的,对于四项8拍的,在此讲解一个单双8拍的。

首先我们来计算下步进角:360/4*2*48=0.9375°。

正好是上面的4拍的1/2,这说明,运行拍数增加,步进角减小。

好,假设有以下运行方向A→AB→B→BC→C→CD→D→DA→A
则依照上面顺序
D C B A
1 1 1 0 导通A
1 1 0 0 导通AB
1 1 0 1 导通B
1 0 0 1 导通BC
1 0 1 1 导通C
0 0 1 1 导通CD
0 1 1 1 导通D
0 1 1 0 导通DA
以上码的16进制数像上面的4拍一样,读者自己整合下。

以下程序单双8拍:
#include<reg52.h>
unsigned char code
bujin[]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6};//正转void delay(unsigned int t);
//步进电机驱动
void bujinqudong()
{
unsigned char i;
for (i=0; i<8; i++)
{
P1 = bujin[i];
delay(5); //调节转速(延时的长短可直接调节电机运行速度)
}
}
void delay(unsigned int t)//此处延时可根据实际要求自行整定{
unsigned int m;
while(t--)
{
for(m=0; m<150; m++)
{ }
}
}
main()
{
while(1) {
bujinqudong();
}
}。

相关文档
最新文档