步进电机程序编写及说明
大学毕业设计 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语言代码:*/#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、步进电机介绍:步进电机是一种常用的旋转电机,具有精确的控制功能,可以实现高精度的位置控制和精确的速度控制。
步进电机的特点是采用梯形转子,在每种工作状态下均能实现精确的转动角度控制。
2、步进电机控制系统概述:步进电机控制系统包括电机驱动器、步进电机控制器和外围设备三大部分,是一个复杂的控制系统。
步进电机电机驱动器是将电子信号转换成电流输出,驱动步进电机转动的重要环节;步进电机控制器是系统的控制中心,它根据输入的指令和参数,对步进电机的转动角度、速度和方向进行控制;而外围设备则是用于将系统中的信号转换成具体的控制信号的重要环节。
3、步进电机控制器编程语言:步进电机控制器编程语言是用于编写步进电机控制程序的语言,它主要由指令代码和参数组成。
根据不同的应用需求,可以使用不同的步进电机控制器编程语言来编写步进电机控制程序,如C语言、Assembler语言等。
4、步进电机控制程序编写:在步进电机控制程序的编写过程中,需要考虑到各种参数的设置,如脉冲频率、脉冲模式、步进电机驱动器的类型等。
步进电机控制程序的编写必须遵循相应的编程规则,以确保步进电机的精确性和可靠性。
5、步进电机控制程序优化:步进电机控制程序的优化是必不可少的,可以采取多种技术手段来提高步进电机控制程序的性能,如分析步进电机控制程序的指令和参数,优化程序的结构,以及提高步进电机的转动速度等。
6、步进电机控制程序调试:步进电机控制程序的调试是检查步进电机控制程序的功能和性能的重要环节,可以采用多种方法进行调试,如基于字节代码的调试、基于硬件的调试、基于模块的调试等。
步进电机调速控制系统设计C语言程序及说明
步进电机调速控制系统设计C语言程序及说明使用元器件:单片机8051、步进电机17H185H-04A、128细分/3.0A步进电机驱动器、LED显示器。
实现控制功能:以8051单片机为控制器,系统设四个按键:“工作/停止按键"、“加速按键”、“减速按键”、“正反向控制按键”。
系统上电后,按下“正反向控制按键",控制电机正反转;每按一次“加速按键”后,步进电机由低向高加速一级,每按一次“减速按键”后,由高向低减速一级;按“工作/停止按键"后,电机停止转动,系统回到等待状态。
同时需要显示运行状态和转速(以实际转速或等级表示).程序清单及说明#include<reg52。
h>sbit EN=P2^0; //使能输出sbit DIR=P2^1; //方向控制sbit PWM=P2^2;//PWM输出sbit zled=P2^6;//正转信号灯sbit fled=P2^7;//反转信号灯sbit sw1=P0^0;//启停按钮sbit sw2=P0^1;//正反转按钮sbit sw3=P0^2;//加速按钮sbit sw4=P0^3;//减速按钮unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};unsigned char i,j,k,temp=0,zkb=5,zkb1=0,speed=0;void delay()//延时10ms{for(i=20;i>0;i--)for(j=248;j〉0;j--);}void InitTimer0(void) //T0定时器初始化{TMOD = 0x00; //设置定时器方式0TH0 = 0xef;//高8位送初值TL0 = 0xdd; //低8位送初值EA = 1; //开中断总允许ET0 = 1;//开T0中断允许TR0 = 1; //启动T0开始定时}void main() //主程序{InitTimer0();EN=1; //初始使能端输出0DIR=1;//方向端输出1zled=0;//正传信号灯端口输出0,灯亮fled=1;//反转信号灯输出1,灯不亮while(1){P1=table[speed];//启停if(sw1==0)//判断启停键按下{delay(); //调用延时程序if(sw1==0)//再判断,启停键按下{while(sw1==0);//启停键按下,使能端取反EN=~EN;}}//正反转子程序if(sw2==0) //判断换向键是否按下{delay();if(sw2==0){while(sw2==0);DIR=~DIR; //换向键按下,方向端口取反fled=~fled; //正传指示灯控制端取反zled=~zled;//反转传指示灯控制端取反}}//加速子程序if(sw3==0) //判断加速键是否按下{delay();if(sw3==0){while(sw3==0); //加速键按下if(speed>=5)//判断转速是否大于5 speed=5; //大于5,保持5级转速elsespeed++;//小于5,加速一级}}//减速子程序if(sw4==0) //判断减速键是否按下{delay();if(sw4==0){while(sw4==0);//减速键按下if(speed==1) //转速为1,保持1级转速speed=1;elsespeed—-; //转速不为1,减速1级}}}}void Timer0Interrupt(void) interrupt 1switch(speed)//加减速按键按下,对应选择T0初值,进入终端产生不同频率脉冲{case 1:TH0=0XDD;break;case 2:TH0=0XE1;break;case 3:TH0=0XE5;break;case 4:TH0=0XEa;break;case 5:TH0=0xf0;break;}TL0 = 0xdd;if(zkb1〉=10)zkb1=0;zkb1++;if(zkb1〈=5)PWM=1;elsePWM=0;}。
步进电机调速程序
/****************************************************************************** ******** 标题: 步进电机试验一**** 通过本例程了解步进马达使用及驱动程序编写**; 单双八拍工作方式:**; A-AB-B-BC-C-CD-D-DA (即一个脉冲,转3.75 度)** J14短路冒需断开** 请学员一定要消化掉本例程********************************************************************************* *******/#include "reg52.h"//Motorsbit F1 = P1^0;sbit F2 = P1^1;sbit F3 = P1^2;sbit F4 = P1^3;/////////////////////////////////////////步进电机驱动unsigned char MotorStep=0;unsigned int MotorTimer = 0;unsigned int MotorDelay,Speed=1,TIM,CT;/****************************************************** 初始化马达*******************************************************/void InitMotor(){F1 = 1;F2 = 1;F3 = 1;F4 = 1;}void SetMotor(){// if(Speed == 0) return;MotorDelay=Speed;switch(MotorStep){case 0:if(TIM) // A{F1 = 0; //0xf1F2 = 1;F3 = 1;F4 = 1;MotorStep = 1;TIM=0;}break;case 1: // ABif(TIM){F1 = 0; //0xf3F2 = 0;F3 = 1;F4 = 1;MotorStep = 2;TIM=0;}break;case 2: //Bif(TIM){F1 = 1;F2 = 0; //0xf2F3 = 1;F4 = 1;MotorStep = 3;TIM=0;}break;case 3: //BCif(TIM){F1 = 1;F2 = 0; //0xf6F3 = 0;F4 = 1;MotorStep = 4;TIM=0;}break;case 4: //Cif(TIM){F1 = 1;F2 = 1; //0xf4F3 = 0;F4 = 1;MotorStep = 5;TIM=0;}break;case 5: //CDif(TIM){F1 = 1;F2 = 1; //0xfcF3 = 0;F4 = 0;MotorStep = 6;TIM=0;}break;case 6: //Dif(TIM){F1 = 1;F2 = 1; //0xf8F3 = 1;F4 = 0;MotorStep = 7;TIM=0;}break;case 7: //DAif(TIM){F1 = 0;F2 = 1; //0xf9F3 = 1;F4 = 0;MotorStep = 0;TIM=0;}break;}}void system_Ini(){TMOD|= 0x11;TH0=0xDC; //11.0592MTL0=0x00;IE = 0x8A;TR0 = 1;}main(){ system_Ini();InitMotor();while(1){SetMotor();}}/************************************************* ** 定时中断延时*************************************************/void Tzd(void) interrupt 1{TH0 = 0xfe; //11.0592TL0 = 0x33;if( CT++==10){TIM=1;CT=0;}}/****************************************************************************** ******** 标题: 步进电机试验二**** 通过本例程了解步进马达使用及驱动程序编写**; 单双八拍工作方式:**; A-AB-B-BC-C-CD-D-DA (即一个脉冲,转3.75 度)** J14短路冒需断开** 请学员一定要消化掉本例程*****************************************************************************************/#include "reg52.h"unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; void delay(unsigned int t);//Motorsbit F1 = P1^0;sbit F2 = P1^1;sbit F3 = P1^2;sbit F4 = P1^3;/////////////////////////////////////////步进电机驱动void motor_ffw(){unsigned char i;for (i=0; i<8; i++) //一个周期转30度{P1 = FFW[i]&0x1f; //取数据delay(5); //调节转速}}void delay(unsigned int t){unsigned int k;while(t--){for(k=0; k<60; k++){ }}}main(){while(1){motor_ffw();}}/****************************************************************************** ******** 标题: 步进电机试验三(加减速运行)**** 通过本例程了解步进马达使用及驱动程序编写**; 单双八拍工作方式:**; A-AB-B-BC-C-CD-D-DA (即一个脉冲,转3.75 度)**** 请学员一定要消化掉本例程******************************************************************************** *******/#include "reg52.h"void delay();//Motorsbit F1 = P1^0;sbit F2 = P1^1;sbit F3 = P1^2;sbit F4 = P1^3;unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //反转unsigned char code FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe}; //正转unsigned int K, rate;/********************************************************** * * * 步进电机驱动* ***********************************************************/ void motor_ffw(){unsigned char i;for (i=0; i<8; i++) //一个周期转30度{P1 = FFW[i]&0x1f; //取数据delay(); //调节转速}}/********************************************延时程序*********************************************/void delay(){unsigned int k,t;t=rate;while(t--){for(k=0; k<150; k++){ }}}/**********************************************************步进电机运行**********************************************************/ void motor_turn(){unsigned char x;rate=0x0a;x=0x40;do{motor_ffw(); //加速rate--;}while(rate!=0x01);do{motor_ffw(); //匀速x--;}while(x!=0x01);do{motor_ffw(); //减速rate++;}while(rate!=0x0a);}main(){while(1){motor_turn();}}/****************************************************************************** ********* 标题: 步进电机试验四**** 通过本例程了解步进马达使用及驱动程序编写** 双四拍工作方式:** AB-BC-CD-DA (即一个脉冲,转7.5 度)**** 请学员一定要消化掉本例程,********************************************************************************* *******/#include "reg52.h"//Motorsbit F1 = P1^0;sbit F2 = P1^1;sbit F3 = P1^2;sbit F4 = P1^3;/////////////////////////////////////////步进电机驱动unsigned char MotorStep=0;unsigned int MotorTimer = 0;unsigned int TIM,CT;void InitMotor(){F1 = 1;F2 = 1;F3 = 1;F4 = 1;}void SetMotor(){// if(Speed == 0) return;switch(MotorStep){case 0:if(TIM){F1 = 0;F2 = 0;F3 = 1;F4 = 1;MotorStep = 1;TIM=0;}break;case 1:if(TIM){F1 = 1;F2 = 0;F3 = 0;F4 = 1;MotorStep = 2;TIM=0;}break;case 2:if(TIM){F1 = 1;F2 = 1;F3 = 0;F4 = 0;MotorStep = 3;TIM=0;}break;case 3:if(TIM){F1 = 0;F2 = 1;F3 = 1;F4 = 0;MotorStep = 0;TIM=0;}break;}}void system_Ini(){TMOD|= 0x11;TH0=0xDC; //11.0592MTL0=0x00;IE = 0x8A;TR0 = 1;}main(){ system_Ini();InitMotor();while(1){SetMotor();}}/************************************* [ t1 (0.5ms)中断] 中断中做PWM 输出------------1000/(0.02ms*250)=200Hz*************************************/ void Tzd(void) interrupt 1{TH0 = 0xfe; //11.0592TL0 = 0x33;if( CT++==20){TIM=1;CT=0;}}/****************************************************************************** ****** 标题: 步进电机试验五(正转一圈反转一圈)**** 通过本例程了解步进马达使用及驱动程序编写**; 单双八拍工作方式:**; A-AB-B-BC-C-CD-D-DA (即一个脉冲,转3.75 度)**** 请学员一定要消化掉本例程********************************************************************************* *******/#include "reg52.h"void delay(unsigned int t);//Motorsbit F1 = P1^0;sbit F2 = P1^1;sbit F3 = P1^2;sbit F4 = P1^3;unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //反转unsigned char code FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe}; //正转unsigned int K;/*********************************************************************** ** 步进电机驱动** * ***********************************************************************/ void motor_ffw(){unsigned char i;unsigned int j;for (j=0; j<12; j++) //转1*n圈{for (i=0; i<8; i++) //一个周期转30度{if(K==1) P1 = FFW[i]&0x1f; //取数据if(K==2) P1 = FFZ[i]&0x1f;delay(5); //调节转速}}}/******************************************************** 延时程序*********************************************************/void delay(unsigned int t){unsigned int k;while(t--){for(k=0; k<80; k++){ }}}main(){while(1){K=1;motor_ffw();K=2;motor_ffw();} }。
四线双型步进电机驱动程序汇编语言
四线双型步进电机驱动程序汇编语言一、概述四线双型步进电机是一种常用的电机类型,其驱动程序可以使用汇编语言实现。
本文将介绍四线双型步进电机驱动程序的汇编语言实现方法。
二、步进电机工作原理步进电机是一种将输入脉冲信号转换为旋转运动的电机。
其工作原理是通过改变电磁场的方向和大小来控制转子的位置。
常见的步进电机有两种类型:单相和双相。
其中,双相步进电机分为四线单型和四线双型两种。
三、四线双型步进电机驱动程序实现1. 硬件连接四线双型步进电机需要连接到控制器上,其中,A相、B相、C相和D 相分别连接到控制器上的对应引脚。
此外,还需要一个使能信号引脚和一个方向信号引脚。
2. 程序实现(1)初始化在程序开始时,需要对控制器进行初始化设置。
具体包括设置引脚方向和模式等参数。
(2)驱动函数驱动函数是实现步进电机旋转运动的核心代码。
其主要思路是根据输入的脉冲信号来改变输出端口引脚的状态,从而控制电机转动。
具体实现方法如下:a. 根据输入的脉冲信号确定下一步的方向和步数;b. 根据当前位置和下一步位置之间的差值,确定需要改变的引脚状态;c. 将需要改变的引脚状态写入输出端口。
(3)延时函数为了保证电机转动的稳定性,需要在每次驱动后加入适当的延时。
延时函数可以使用计时器或者循环等方式实现。
四、总结本文介绍了四线双型步进电机驱动程序汇编语言实现方法。
通过对硬件连接和程序实现进行详细说明,读者可以更好地理解步进电机工作原理和驱动程序实现方法,从而更好地应用于实际项目中。
(完整word版)步进电机驱动程序(用定时的方式来控制步进电机)
(完整word版)步进电机驱动程序(用定时的方式来控制步进电机) #include <REG52.H>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit PUL = P1^0; //脉冲输入端sbit DIR = P1^1; //方向控制端sbit ENBL = P1^2; //使能端uint num;/*xms*1ms毫秒延时函数*/void delay(uint xms){ uint a,b;for(a=xms;a>0;a--)for(b=110;b>0;b--);}void init(){TMOD|= 0x01; //设置定时器0为工作方式1,16为定时器/计数器TL0 = (65535-10)%256; //设置定时初值TH0 = (65535-10)/256; //设置定时初值ET0 = 1; //开启定时器0中断TR0 = 1; //关闭定时器0EA = 1;}void main()(完整word版)步进电机驱动程序(用定时的方式来控制步进电机) {init();DIR = 1;ENBL = 1;while(1){if(num==12800){DIR=~DIR;num=0;TR0=0;delay(1000);TR0=1;}}}/*定时器0中断服务函数*/void T0_timer() interrupt 1{TL0 = (65535-10)%256; //设置定时初值TH0 = (65535-10)/256; //设置定时初值// TL0 = 0xEE; //设置定时初值// TH0 = 0xFF;PUL = ~PUL;(完整word版)步进电机驱动程序(用定时的方式来控制步进电机) num++;}使能端打开,电机处于工作状态输出的脉冲数计数//使能端关闭,电机处于停止工作状态初始化定时器1禁止所有中断预加时间timer256分频启用定时器溢出中断允许所有中断常规中断服务预加载timer异或运算计算方式65536-16000000/256/20HZ=62411。
步进电机实验(含程序)
步进电机实验一、实验目的1.了解步进电机控制的基本原理及其结构。
2.掌握控制步进电机转动编程方法。
二、实验内容:1、通过单片机系统控制步进电机的转动:2、通过实验来实现步进电机的正反转、转动步数和角度控制。
三、实验预备知识1、步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。
在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。
这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。
使得在速度、位置等控制领域用步进电机来控制变的非常的简单。
步进电机驱动原理是通过对它每相线圈中的电流和顺序切换来使电机作步进式旋转。
驱动电路由脉冲信号来控制,所以调节脉冲信号的频率便可改变步进电机的转速,微电脑控制步进电机最适合。
2、步进电机的静态指标术语:相数:产生不同对极N、S磁场的激磁线圈对数。
常用m表示。
拍数:完成一个磁场周期性变化所需脉冲数或导电状态用n表示,或指电机转过一个齿距角所需脉冲数,以四相电机为例,有四相四拍运行方式即AB-BC-CD-DA-AB,四相八拍运行方式即A-AB-B-BC-C-CD-D-DA-A.步距角:对应一个脉冲信号,电机转子转过的角位移用θ表示。
θ=360度(转子齿数J*运行拍数),以常规二、四相,转子齿为5齿电机为例。
四拍运行时步距角为θ=360度/(5*4)=18度(俗称整步),八拍运行时步距角为θ=360度/(5*8)=9度(俗称半步)。
3、电机正反转控制:当电机绕组通电时序为AB-BC-CD-DA-AB或(P1.1P1.0-P1.2P1.1-P1.3P1.2-P1.3P1.0)时为正转,通电时序为DA-CA-BC-AB-DA或(P1.3P1.1-P1.3P1.2-P1.2P1.1-P1.1P1.0)时为反转。
4、驱动控制系统组成使用、控制步进电机必须由环形脉冲,功率放大等组成的控制系统,其方框图如下:1、脉冲信号的产生。
三相步进电机控制程序及电路
三相步进电机控制程序及电路概述三相步进电机是利用电子技术,通过不断地使电流按照一定规律改变来控制电机转动。
本文将介绍三相步进电机的控制程序,并详细讲解电路原理。
控制程序控制程序采用的是 Arduino 开发板,因为它易于编程和控制。
代码采用 C 语言实现,主要分为两部分:1.步进电机控制程序:该部分主要用于引脚配置和执行步进电机运动;2.事件驱动程序:该部分主要用于监测按键操作,以对步进电机执行不同的运动。
步进电机控制程序代码#define SPEED 50 //步进电机转速#define STEPS 6 //步进电机齿轮数目//定义步进电机引脚int stepPins[] = {8, 9, 10, 11};//定义步进电机步进方式数组(顺序为AB-BC-CD-DA)int stepSequence[][4] = {{HIGH, LOW, LOW, HIGH},{HIGH, HIGH, LOW, LOW},{LOW, HIGH, HIGH, LOW},{LOW, LOW, HIGH, HIGH}};void setup() {//设置步进电机引脚模式为输出for (int i = 0; i < 4; i++) {pinMode(stepPins[i], OUTPUT);}}void loop() {for (int j = 0; j < 2; j++) {//顺时针旋转for (int i = 0; i < STEPS * 4; i++) {int step = i % 4;for (int pin = 0; pin < 4; pin++) {digitalWrite(stepPins[pin], stepSequence[step][pin]);}delay(SPEED);}//逆时针旋转for (int i = STEPS * 4; i > 0; i--) {int step = i % 4;for (int pin = 0; pin < 4; pin++) {digitalWrite(stepPins[pin], stepSequence[step][pin]);}delay(SPEED);}}}事件驱动程序代码``` C #define BUTTON_PIN 2 //按键引脚 #define DEBOUNCE_DELAY 50 //防抖动延时//定义全局变量 bool clockwise = true; unsigned long debounceTimer = 0;void setup() { pinMode(BUTTON_PIN, INPUT); digitalWrite(BUTTON_PIN, HIGH); Serial.begin(9600); }void loop() { if (digitalRead(BUTTON_PIN) == LOW) { if (millis() - debounceTimer > DEBOUNCE_DELAY) { debounceTimer = millis(); clockwise= !clockwise; Serial.println(clockwise ?。
步进电机任意分度程序的编写方法
步进电机任意分度程序的编写方法
步进电机是一种将电脉冲转换成机械位移的装置,其运动角度是固定的,每接收一个电脉冲就会转动一个固定角度。
然而,在实际应用中,有
时需要将步进电机的运动角度任意分度,即可以根据需要转动不同的角度。
下面将介绍步进电机任意分度程序的编写方法。
1.脉冲计数模块
脉冲计数模块主要实现对步进电机已经转动的角度进行记录和更新。
一般情况下,可以使用一个变量来存储当前电机的角度,并在接收到脉冲
信号时进行更新。
编写脉冲计数模块主要包括以下步骤:
-设置一个变量用于存储电机的角度,初始值为0。
-在接收到脉冲信号时,将变量的值增加一个固定的角度,例如1度。
-判断变量的值是否超过所需的目标角度,若超过则停止接收脉冲信号,否则继续接收。
2.脉冲产生模块
脉冲产生模块主要实现根据需要产生所需的脉冲信号。
一般情况下,
可以使用定时器来产生一定周期的脉冲信号,并根据当前计数器的值控制
脉冲的高低电平。
-设置一个定时器,并设定适当的计数周期。
-在定时器中断函数中,根据当前计数器的值决定脉冲信号的高低电平。
-根据所需的目标角度和脉冲信号的周期计算所需的脉冲个数,并在达到目标脉冲个数后停止产生脉冲信号。
综上所述,步进电机任意分度程序的编写方法主要包括了脉冲计数和脉冲产生两个模块。
通过合理地设置和调整这两个模块,可以实现步进电机任意分度的功能。
需要注意的是,在编写程序时要充分考虑步进电机的特性和所需的运动要求,并进行适当的调试和优化。
步进电机任意分度程序的编写方法
步进电机任意分度程序的编写方法许多人都认为步进电机是不能精密分度的,把伺服电机的驱动方法过于的神化。
就本人用步进电机做分度盘的阅历来看,其实你只要懂得怎么去用步进电机,懂得怎么去写程序,正常状况下的分度精度还是可以保证的。
步进电机不管在什么场所应用,有一点是必需要保证就是有足够的扭矩。
步进电机就是一个大马拉小车的东西。
正常状况下的启动时间,一般来说应尽可能的拉长一些。
启动的速度也不行以太快。
启停过快都可能会引起过冲的现象。
在使用过程中,假如分度不完整,也就是正常要走一圈的,但是发觉怎么弄都差那么一点点,也就是有一个接缝,这种状况就是有传奇中的失步。
解决失步的方法不外乎如下几点:增加电机扭矩,加大驱动器的电流;降低运行的最大转速;拉长启动时间;减小启动转速。
假如以上都没有问题,那么就有可能是程序里面带有无法分完的余数脉冲所产生的累计误差了。
众所周知,脉冲是以整数来计算,没有哪里会消失半个脉冲的说法。
但是往往就是这半个脉冲出了问题,假如一个圆分10等份,每个等份差半个脉冲不算个什么。
20个等份,每个等份差半个脉冲可能也不是特殊明显。
但是要分到50个,100个,500个,nnn个等份时,这样每个等份差半个脉冲可就不是一个小数目了。
在等份数越多时,就算是每个等份差0.1个脉冲,都是一个天文数字。
这就是许多人都认为步进电机无法做出精密的分度盘的缘由了。
这不仅仅是进步电机,就算是伺服电机,同样也存在这个问题----余数。
如下:步进驱动器的细分数为64.那么电机每一圈的脉冲数为64x200=12800.现在设定电机分成128等份,那么很好计算12800/128=100.每个等份的脉冲数为100个脉冲。
但是假如我现在要求分成129等份,公式为:12800/129=99.2248062,也就是每个等份必要99.2248062个脉冲才能均分,如此计数去掉小数点余数,那么这129个等份里总共将要误差129X0.2248062=28.9999999个脉冲。
FX1S控制步进电机的实例图与程序
FX1S控制步进电机的实例(图与程序)FX1S控制步进电机的实例(图与程序) :·采用绝对位置控制指令(DRVA),大致阐述FX1S控制步进电机的方法。
·FX系列PLC 单元能同时输出两组100KHZ脉冲,是低成本控制伺服与步进电机的较好选择!·PLS+,PLS-为步进驱动器的脉冲信号端子,DIR+,DIR-为步进驱动器的方向信号端子。
·所谓绝对位置控制(DRVA),就是指定要走到距离原点的位置,原点位置数据存放于32位寄存器D8140里。
当机械位于我们设定的原点位置时用程序把D8140的值清零,也就确定了原点的位置。
·实例动作方式:X0闭合动作到A点停止,X1闭合动作到B点停止,接线图与动作位置示例如左图(距离用脉冲数表示)。
·程序如下图:(此程序只为说明用,实用需改善。
)说明:·在原点时将D8140的值清零(本程序中没有做此功能)·32位寄存器D8140是存放Y0的输出脉冲数,正转时增加,反转时减少。
当正转动作到A点时,D8140的值是3000。
此时闭合X1,机械反转动作到B点,也就是-3000的位置。
D8140的值就是-3000。
·当机械从A点向B点动作过程中,X1断开(如在C点断开)则D8140的值就是200,此时再闭合X0,机械正转动作到A点停止。
·当机械停在A点时,再闭合X0,因为机械已经在距离原点3000的位置上,故而机械没有动作!·把程序中的绝对位置指令(DRVA)换成相对位置指令(DRVI):·当机械在B点时(假设此时D8140的值是-3000)闭合X0,则机械正转3000个脉冲停止,也就是停在了原点。
D8140的值为0·当机械在B点时(假设此时D8140的值是-3000)闭合X1,则机械反转3000个脉冲停止,也就是停在了左边距离B点3000的位置(图中未画出),D8140的值为-6000。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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();
}
}。