步进电机的控制程序
大学毕业设计 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)步进电机广泛应用于对精度要求比较高的运动控制系统中,如机器人、打印机、软盘驱动器、绘图仪、机械阀门控制器等。
目前,对步进电机的控制主要有由分散器件组成的环形脉冲分配器、软件环形脉冲分配器、专用集成芯片环形脉冲分配器等。
分散器件组成的环形脉冲分配器体积比较大,同时由于分散器件的延时,其可靠性大大降低;软件环形分配器要占用主机的运行时间,降低了速度;专用集成芯片环形脉冲分配器集成度高、可靠性好,但其适应性受到限制,同时开发周期长、需求费用较高。
步进电机控制电路及应用程序

步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。
每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。
步进电机的角位移量与输入的脉冲个数严格成正比,而且在时间上与脉冲同步。
因而只要控制脉冲的数量、频率和电机绕组的相序,即可获得所需的转角、速度和方向。
步进电机主要是由定子、定子绕组和转子组成。
涉及的基本概念如下:1.相——步进电机有几个定子绕组(线圈)就是几相。
2.线——步进电机引出有几根连接的导线。
3.极性——分为单极性和双极性。
如果步进电机的线圈是可以双向导电的,那么这个步进电机就是双极性的,相反,如果步进电机的线圈是只允许单向导电的,那么这个步进电机就是单极性的。
4.极数——每个电机每相含有的磁极个数就是极数。
由于磁极是成对出现的,所以电机有2、4、6、8……极之分。
步进电机结构示意图步进电机分类——按结构分类反应式反应式步进电机定子上有绕组、转子由软磁材料组成。
结构简单、成本低、步距角小,可达1.2°、但动态性能差、效率低、发热大,可靠性难保证。
噪声振动大,多为三相。
永磁式永磁式步进电机永磁式步进电机的转子用永磁材料制成,转子的极数与定子的极数相同。
其特点是动态性能好、输出力矩大,但这种电机精度差,步矩角大(一般为7.5°或15°)。
混合式混合式步进电机其定子上有多相绕组、转子上采用永磁材料,转子和定子上均有多个小齿以提高步矩精度。
其特点是输出力矩大、动态性能好,步距角小,但结构复杂、成本相对较高。
二相和五相。
步进电机分类——按定子绕组步进电机按定子上绕组来分,共有二相、三相、四相和五相等系列。
最受欢迎的是两相混合式步进电机,约占97%以上的市场份额,其原因是性价比高,配上细分驱动器后效果良好。
该种电机的基本步距角为1.8°/步,配上半步驱动器后,步距角减少为0.9°,配上细分驱动器后其步距角可细分达256倍(0.007°/微步)。
s7-200步进电机控制s-200步进电机控制s7-200步进电机控制s7-200步进电机控制

PTOx_RUN子程序(运行轮廓)
• PTOx_RUN子程序(运行轮廓)命 令PLC执行存储于配置/轮廓表的 特定轮廓中的运动操作。开启EN位 会启用此子程序。在懲瓿蓲位发出 子程序执行已经完成的信号前,请 确定EN位保持开启。
• 现在比较常用的步进电机包括反应式步进电机(VR)、 永磁式步进电机(PM)、混合式步进电机(HB)和单相 式步进电机等。
• 电机固有步距角:
• 它表示控制系统每发一个步进脉冲信号,电机所 转动的角度。电机出厂时给出了一个步距角的值 。
• 如86BYG250A型电机给出的值为0.9°/1.8°(表 示半步工作时为0.9°、整步工作时为1.8°), 这个步距角可以称之为‘电机固有步距角’,它 不一定是电机实际工作时的真正步距角,真正的 步距角和驱动器有关。
• Error(错误)参数包含本子程序的结果。 如果PTO向导的HSC计数器功能已启用, C_Pos参数包含用脉冲数目表示的模块; 否则此数值始终为零。
编程
运行。 • 脉宽时间 = 0 占空比为0%:输出关闭。 • 周期 < 2个时间单位 周期的默认值为两个时间单
位。
• PTO操作
• PTO为指定的脉冲数和指定的周期提供方 波(50%占空比)输出。PTO可提供单脉冲 串或多脉冲串(使用脉冲轮廓)。您指定 脉冲数和周期(以微秒或毫秒递增)。
• 周期范围从10微秒至65,535微秒或从2毫秒 至65,535毫秒。
产生一个高速脉冲串或一个脉冲调制波形。 • Q0.0 • Q0.1
• 当Q0.0/Q0.1作为高速输出点使用时,其普 通输出点禁用,反之。
PLC实现步进电机的正反转及调整控制

PLC实现步进电机的正反转及调整控制PLC是专门用于控制工程自动化系统的一种可编程逻辑控制器,其可以通过编程来实现对各种电气设备的控制。
在实际工程中,步进电机广泛应用于自动化设备中,如数控机床、包装机械、印刷设备等。
步进电机具有分辨率高、精度高、响应速度快等优点,因此被广泛应用于各种自动化控制系统中。
在PLC实现步进电机的正反转及调整控制中,需要考虑以下几个方面:1.步进电机驱动模块选型:步进电机需要配合驱动模块进行控制,通常采用的是脉冲信号驱动方式。
在PLC控制系统中,可以选择适合的驱动模块,如常见的2相、4相步进电机驱动模块。
2.步进电机控制程序设计:通过PLC软件编程,编写程序实现步进电机的正转、反转及调整控制功能。
在程序设计中,需要考虑步进电机的控制方式、驱动模块的接口信号、脉冲信号的频率等参数。
3.步进电机正反转控制:在程序设计中,通过PLC输出脉冲信号控制步进电机的正反转运动。
具体步骤包括设置脉冲信号的频率和方向,控制步进电机按设定的脉冲信号实现正反转运动。
4.步进电机调整控制:步进电机的位置调整控制通常通过调整脉冲信号的频率和数目来实现。
通过PLC编程,实现步进电机的位置调整功能,从而实现对步进电机位置的精准控制。
5.总体控制设计:在PLC控制系统中,可以将步进电机的正反转及调整控制与其它控制功能相结合,实现对整个自动化系统的精确控制。
通过PLC编程,可以灵活设计多种控制逻辑,满足不同工程项目的需求。
综上所述,通过PLC实现步进电机的正反转及调整控制主要涉及步进电机驱动模块选型、控制程序设计、正反转控制、调整控制和总体控制设计等方面。
通过精心设计和编程,可以实现对步进电机的精确控制,满足各种自动化控制系统的要求。
PLC技术的应用将有助于提高自动化生产设备的生产效率和稳定性,推动工业自动化技术的发展。
c语言实现单片机控制步进电机加减速源程序

C 语言实现单片机控制步进电机加减速源程序1. 引言在现代工业控制系统中,步进电机作为一种常见的执行元件,广泛应用于各种自动化设备中。
而作为一种常见的嵌入式软件开发语言,C 语言在单片机控制步进电机的加减速过程中具有重要的作用。
本文将从单片机控制步进电机的加减速原理入手,结合 C 语言的编程技巧,介绍如何实现单片机控制步进电机的加减速源程序。
2. 单片机控制步进电机的加减速原理步进电机是一种能够精确控制角度的电机,它通过控制每个步骤的脉冲数来实现旋转。
在单片机控制步进电机的加减速过程中,需要考虑步进电机的加速阶段、匀速阶段和减速阶段。
在加速阶段,需要逐渐增加脉冲的频率,使步进电机的转速逐渐增加;在匀速阶段,需要保持恒定的脉冲频率,使步进电机以匀速旋转;在减速阶段,需要逐渐减小脉冲的频率,使步进电机的转速逐渐减小。
这一过程需要通过单片机的定时器和输出控制来实现。
3. C 语言实现步进电机加减速的源程序在 C 语言中,可以通过操作单片机的 GPIO 来控制步进电机的旋转。
在编写源程序时,需要使用单片机的定时器模块来生成脉冲信号,以控制步进电机的旋转角度和速度。
以下是一个简单的 C 语言源程序,用于实现步进电机的加减速控制:```c#include <reg52.h>void main() {// 初始化定时器// 设置脉冲频率,控制步进电机的加减速过程// 控制步进电机的方向// 控制步进电机的启停}```4. 总结与回顾通过本文的介绍,我们了解了单片机控制步进电机的加减速原理和 C 语言实现步进电机加减速源程序的基本思路。
掌握这些知识之后,我们可以更灵活地应用在实际的嵌入式系统开发中。
在实际项目中,我们还可以根据具体的步进电机型号和控制要求,进一步优化 C 语言源程序,实现更加精准和稳定的步进电机控制。
希望本文能为读者在单片机控制步进电机方面的学习和应用提供一定的帮助。
5. 个人观点与理解在我看来,掌握 C 语言实现单片机控制步进电机加减速源程序的技术是非常重要的。
第3章步进电动机的控制

升速 恒速 减速 低速
起点
终点
(时间) t
图3-24
点、位控制中的加减速控制
15
变速控制的方法有:
改变控制方式的变速控制:最简单的变速控制可利用改变步进电 机的控制方式实现。例如:对于三相步进电机系统,启动或停止时 用三相六拍,大约0.1s以后,改用三相三拍,快到达终点时再采用 三相六拍,以达到减速控制的目的。 均匀地改变脉冲时间间隔的变速控制:步进电机的加速(或减速) 控制,可以用均匀地改变脉冲时间间隔来实现。 采用定时器的变速控制:单片机控制系统中,用单片机内部的定 时器来提供延时时间。方法是将定时器初始化后,每隔一定的时间, 由定时器向CPU申请一次中断,CPU响应中断后,便发出一次控制脉 冲。此时只要均匀地改变定时器时间常数,即可达到均匀加速(或 减速)的目的。这种方法可以提高控制系统的效率。
脉冲 方向控制
步进控制器
功率放大器
步进电机
负载
图3-19 步进电机控制系统的组成
2
随着电子技术的发展,除功率驱动电路之外,其它硬件电路均可由软 件实现。采用计算机控制系统,由软件代替步进控制器,不仅简化了 线路,降低了成本而且可靠性也大为提高,同时,根据系统的需要可 灵活改变步进电机的控制方案,使用起来很方便。典型的微型机控制 步进电机系统原理图如图3-20所示。 使用微型机对步进电机进行控制有串行和并行两种方式。 步 进 电 机
6
二、步进电动机的闭环控制
在开环步进电动机系统中,电动机的输出转矩在很大程度上取决于驱 动电源和控制方式。对于不同的步进电动机或同一种步进电动机而不 同负载,励磁电流和失调角发生改变,输出转矩都会随之发生改变, 很难找到通用的控速规律,因此,也很难提高步进电机的技术指标。 闭环系统是直接或间接地检测转子的位置和速度,然后通过反馈和适 当处理自动给出驱动脉冲串。因此采用闭环控制可以获得更精确的位 置控制和更高、更平稳的转速,从而提高步进电动机的性能指标。 步进电动机的输出转矩是励磁电流和失调角的函数。为了获得较高的 输出转矩,必须考虑到电流的变化和失调角的大小,这对于开环控制 来说是很难实现的。
单片机步进电机控制程序代码

单片机步进电机控制程序代码引言:步进电机是一种常见的电机类型,它具有准确的位置控制和高速运动的特点,在许多应用中被广泛使用。
为了实现步进电机的精确控制,我们需要编写相应的单片机控制程序代码。
本文将介绍一种常见的单片机步进电机控制程序代码,并详细解析其实现原理和使用方法。
一、控制原理:步进电机通过控制电流的方向和大小来控制转子的运动,常见的步进电机控制方式有两相和四相控制。
本文将以四相控制为例进行介绍。
四相控制是指通过控制四个线圈的电流状态来控制步进电机的运动。
具体控制方式有全步进和半步进两种。
全步进模式下,每一步都是四个线圈中的两个同时激活;半步进模式下,每一步都是四个线圈中的一个或两个同时激活。
在本文中,我们将介绍半步进模式的控制程序代码。
二、程序代码:下面是一段常见的单片机步进电机控制程序代码:```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,用于控制电机转动的速度。
步进电机控制程序

jian_su;if(h==0){delay(10);while(!h);jian();}
d=~d; //输出时钟脉冲
delay(Y); //延时(括号内数值越小,电机转动速度越快)
case 0x0b: keyno=14;
break;
case 0x07: keyno=13;
break;
}
break;
}
P6OUT=0xBf;
switch(P6IN&0x0f)
{
case 0x0e: keyno=12;
case 0x07: keyno=9;
break;
}
P6OUT=0x7f;
switch(P6IN&0x0f)
sbit fan_zhuan=P2^1; // 反转
sbit jia_su=P2^2; // 加速
sbit jian_su=P2^3; // 减速
*/
/********************************************************
延时函数
break;
case 0x0d: keyno=11;
break;
case 0x0b: keyno=10;
break;
/*
sbit shi_neng=P1^0; // 使能控制位
sbit fang_shi=P1^1; // 工作方式控制位
sbit fang_xiang=P1^2;// 旋转方向控制位
sbit mai_chong=P1^3; // 脉冲控制位
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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,和较高的电压/电流要求之间的接口,广泛应用与计算机、打印机、继电器、灯等类似负载中。