步进电机控制程序
大学毕业设计 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,和较高的电压/电流要求之间的接口,广泛应用与计算机、打印机、继电器、灯等类似负载中。
步进电机控制电路及应用程序
步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。
每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。
步进电机的角位移量与输入的脉冲个数严格成正比,而且在时间上与脉冲同步。
因而只要控制脉冲的数量、频率和电机绕组的相序,即可获得所需的转角、速度和方向。
步进电机主要是由定子、定子绕组和转子组成。
涉及的基本概念如下:1.相——步进电机有几个定子绕组(线圈)就是几相。
2.线——步进电机引出有几根连接的导线。
3.极性——分为单极性和双极性。
如果步进电机的线圈是可以双向导电的,那么这个步进电机就是双极性的,相反,如果步进电机的线圈是只允许单向导电的,那么这个步进电机就是单极性的。
4.极数——每个电机每相含有的磁极个数就是极数。
由于磁极是成对出现的,所以电机有2、4、6、8……极之分。
步进电机结构示意图步进电机分类——按结构分类反应式反应式步进电机定子上有绕组、转子由软磁材料组成。
结构简单、成本低、步距角小,可达1.2°、但动态性能差、效率低、发热大,可靠性难保证。
噪声振动大,多为三相。
永磁式永磁式步进电机永磁式步进电机的转子用永磁材料制成,转子的极数与定子的极数相同。
其特点是动态性能好、输出力矩大,但这种电机精度差,步矩角大(一般为7.5°或15°)。
混合式混合式步进电机其定子上有多相绕组、转子上采用永磁材料,转子和定子上均有多个小齿以提高步矩精度。
其特点是输出力矩大、动态性能好,步距角小,但结构复杂、成本相对较高。
二相和五相。
步进电机分类——按定子绕组步进电机按定子上绕组来分,共有二相、三相、四相和五相等系列。
最受欢迎的是两相混合式步进电机,约占97%以上的市场份额,其原因是性价比高,配上细分驱动器后效果良好。
该种电机的基本步距角为1.8°/步,配上半步驱动器后,步距角减少为0.9°,配上细分驱动器后其步距角可细分达256倍(0.007°/微步)。
plc控制步进电机程序.
plc控制步进电机程序·采用绝对位置控制指令(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。
单片机步进电机控制程序代码
单片机步进电机控制程序代码引言:步进电机是一种常见的电机类型,它具有准确的位置控制和高速运动的特点,在许多应用中被广泛使用。
为了实现步进电机的精确控制,我们需要编写相应的单片机控制程序代码。
本文将介绍一种常见的单片机步进电机控制程序代码,并详细解析其实现原理和使用方法。
一、控制原理:步进电机通过控制电流的方向和大小来控制转子的运动,常见的步进电机控制方式有两相和四相控制。
本文将以四相控制为例进行介绍。
四相控制是指通过控制四个线圈的电流状态来控制步进电机的运动。
具体控制方式有全步进和半步进两种。
全步进模式下,每一步都是四个线圈中的两个同时激活;半步进模式下,每一步都是四个线圈中的一个或两个同时激活。
在本文中,我们将介绍半步进模式的控制程序代码。
二、程序代码:下面是一段常见的单片机步进电机控制程序代码:```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. 异常情况检测:通过分析监测数据和运行状态,检测出异常情况。
步进电机控制程序
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. 硬件连接在编写单片机步进电机控制程序代码之前,我们首先需要完成硬件的连接。
一般来说,步进电机的控制需要使用到驱动模块,如ULN2003或者A4988等。
我们需要将单片机的输出引脚与驱动模块的输入引脚相连接,同时将驱动模块的输出引脚与步进电机的控制引脚相连接。
2. 编写控制程序代码接下来,我们可以开始编写单片机步进电机控制程序代码了。
以C 语言为例,下面是一个简单的步进电机正转程序代码示例:```c#include <reg52.h>sbit IN1 = P1^0;sbit IN2 = P1^1;sbit IN3 = P1^2;sbit IN4 = 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() {while(1) {IN1 = 1;IN2 = 0;IN3 = 1;IN4 = 0;delay(50);IN1 = 0;IN2 = 1;IN3 = 1;IN4 = 0;delay(50);IN1 = 0;IN2 = 1;IN3 = 0;IN4 = 1;delay(50);IN1 = 1;IN2 = 0;IN3 = 0;IN4 = 1;delay(50);}}```上述代码中,我们通过控制P1口的四个引脚来控制步进电机的旋转方向。
步进电机控制实验实验报告及程序
实验九步进电机控制实验姓名专业通信工程学号成绩一、实验目的1.掌握keil C51软件与proteus软件联合仿真调试的方法;2.掌握步进电机的工作原理及控制方法;3.掌握步进电机控制的不同编程方法;二、实验仪器与设备1.微机1台2.keil C51集成开发环境3.Proteus仿真软件三、实验内容1.用Proteus设计一四相六线步进电机控制电路。
要求利用P1口作步进电机的控制端口,通过达林顿阵列ULN2003A驱动步进电机。
基本参考电路见后面附图。
2.编写程序,实现步进电机的正反转控制。
正反转时间分别持续10S时间,如此循环。
3.设计一可调速步进电机控制电路。
P3.2~P3.5分别接按键k1~k4,其中k1为正反转控制按键,k2为加速按键,k3为减速按键,k4为启动/停止按键,要求速度7档(1~7)可调,加减速各设3档,复位时位于4档,要求每档速度变化明显。
该步进电机控制电路在以上电路的基础上自行修改。
四、实验原理1.步进电机控制原理:1)步进电机是利用电磁铁的作用原理,步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。
每来一个电脉冲,步进电机转动一定角度,带动机械移动一小段距离。
特点A.来一个脉冲,转一个步距角。
B.控制脉冲频率,可控制电机转速。
C.改变脉冲顺序,可改变转动方向。
2)以反应式步进电机为例说明步进电机的结构和工作原理。
三相反应式步进电动机的原理结构图如下,定子内圆周均匀分布着六个磁极,磁极上有励磁绕组,每两个相对的绕组组成一相。
转子有四个齿。
给A相绕组通电时,转子位置如图(a),转子齿偏离定子齿一个角度。
由于励磁磁通力图沿磁阻最小路径通过,因此对转子产生电磁吸力,迫使转子齿转动,当转子转到与定子齿对齐位置时(图b),因转子只受径向力而无切线力,故转矩为零,转子被锁定在这个位置上。
由此可见:错齿是助使步进电机旋转的根本原因。
3)三相反应式步进电动机的控制原理①三相单三拍:A 相→ B 相→ C 相→ A 相②三相六拍:A→AB →B →BC →C → CA→ A③三相双三拍:AB →BC →CA→AB4)步距角计算公式:θ—步距角 Z r—转子齿数 m —每个通电循环周期的拍数2、ULN2003A:七达林顿阵列ULN2003A是集成达林顿管反相驱动电路,内部还集成了一个消线圈反电动势的二极管,可用来驱动电机、继电器等功率器件。
步进电机控制程序(c语言51单片机)
// pri_dj = Pme );
if( i == set_pwm_width ) { P1 = 0xff; i = 0; one _round_flg = 0; while ( !one_round_flg & key_puse );}
if(!key_puse) { delay(4ms); if(!key_puse) break; }
while ( key_puse & key_clear ); delay ( 8ms );
if ( !key_clear ) { round_num = 0; display(); }
if ( !key_puse ) break; }
while( !key_puse ); delay(8ms);
while( !key_puse ); }
set_display_num(); for(i = 0; i < LEDLen ; i ++){
P0 = 0xf0; P0 = P0 | LEDBuf[i] ; if(i==0) led_1000 = 0; //P0^4 if(i==1) led_100 = 0; //P0^5 if(i==2) led_10 = 0; //P0^6 if(i==3) led_1 = 0; //P0^7
delay ( 1ms ); tmp = (~(P2 | 0xF0)); P2 = 0x7F; // 0111 1111
delay ( 1ms ); tmp = (~(P2 | 0xF0)) * 10 + tmp; set_round_num = set_round_num + tmp * 100; set_round_num = set_round_num * Chilun_Num;
8255端口控制步进电机控制框图和程序
9.4工程应用9.4.1项目1:用8255A端口控制步进电机1.项目要求与目的(1)项目要求:根据开关的状态,用8255端口控制步进电机,编写程序输出脉冲序列到8255的PA口,控制步进电机正转、反转,加速,减速。
(2)项目目的:●了解步进电机控制的基本原理。
●掌握控制步进电机转动的编程方法。
●了解单片机控制外部设备的常用电路。
2.项目电路连接与说明(1)项目电路连接:8255的片选CS孔用导线接至译码处200H~207H插孔,8255的PA0-PA3用导线接至步进电机的A、B、C和D,PB0-PB3用导线接至开关K0、K1和K2。
(2)项目说明:步进电机驱动原理是通过对每相线圈中的电流的顺序切换来使电机作步进式旋转。
切换是通过8255输出脉冲信号来实现的。
所以调节脉冲信号的频率便可以改变步进电机的转速,改变各相脉冲的先后顺序,可以改变电机的旋转方向。
步进电机的转速应由慢到快逐步加速。
步进电机驱动方式可以采用双四拍(AB→BC→CD→DA→AB)方式,也可以采用单四拍(A→B→C→D→A)方式,或单、双八拍(A→AB→B→BC→C→CD→D→DA→A)方式。
实际控制时公共端是接在+5V上的,所以实际控制脉冲是低有效。
8255的PA口输出的脉冲信号经(MC1413或ULN2003A)倒相驱动后,向步进电机输出脉冲信号序列。
当开关K0=0时,步进电机驱动方式采用单/双八拍工作方式,当开关K1=0时,步进电机驱动方式采用双四拍工作方式,当开关K2=0时,步进电机驱动方式采用单四拍反转工作方式。
3.项目电路原理框图项目电路原理框图如图7-1所示。
电路由8255A芯片、驱动和步进电机等组成。
图7-1 用8255A端口控制步进电机电路框图4.项目程序设计(1)程序流程图用8255A端口控制步进电机程序流程图如图7-2所示。
图7-2 程序流程图(2)程序清单用8255A端口控制步进电机程序清单如下所示。
ASTEP EQU 01HBSTEP EQU 02HCSTEP EQU 04HDSTEP EQU 08HCODE SEGMENTASSUME CS:CODESTART :MOV DX, 203H ;8255控制口地址MOV AL, 82H ;PA口输出,B口输入OUT DX, AL ;写控制字K0:MOV DX, 200H ;PA口地址MOV AL,0 ;输出低电平OUT DX,AL ;电机停止转动MOV DX,201H ;PB口地址IN AL,DX ;读开关状态TEST AL,01H ;PB0位(K0=0吗?)JNZ K1 ;不是零转K1JMP STEP8 是零转单/双八拍工作方式K1: IN AL,DX ;读开关状态TEST AL,02H ;PB1位(K1=0吗?)JNZ K2 ;不是零转K2JMP STEP4 ;是零转双四拍工作方式K2:IN AL,DX ;读开关状态TEST AL,04H ;PB2位(K2=0吗?)JZ STEP41 ;是零转单四拍反转工作方式JMP K0 ;循环; 单/双八拍工作方式:A→AB→B→BC→C→CD→D→DA→A STEP8:MOV BX,9000H;设置初始延时时间MOV DX, 200H;PA口地址MOV AL,ASTEPOUT DX,ALCALL DELAYMOV AL,ASTEP+BSTEPOUT DX,ALCALL DELAYMOV AL,BSTEPOUT DX,ALCALL DELAYMOV AL,BSTEP+CSTEPOUT DX,ALCALL DELAYMOV AL,CSTEPOUT DX,ALCALL DELAYMOV AL,CSTEP+DSTEPOUT DX,ALCALL DELAYMOV AL,DSTEPOUT DX,ALCALL DELAYMOV AL,DSTEP+ASTEPOUT DX,ALCALL DELAYJMP K0; 双四拍工作方式:AB→BC→CD→DA→ABSTEP4:MOV BX,5000H;设置延时时间MOV DX, 200H;PA口地址MOV AL,ASTEP+BSTEP;PA0PA1(AB相)输出高电平 OUT DX,ALCALL DELAY ;调延时MOV AL,BSTEP+CSTEP ;BC输出高电平OUT DX,ALCALL DELAY ;调延时MOV AL,CSTEP+DSTEP;CD输出高电平OUT DX,ALCALL DELAY ;调延时MOV AL,DSTEP+ASTEP;DA输出高电平OUT DX,ALCALL DELAY ;调延时JMP K0; 单四拍反转工作方式: D→C→B→A→DSTEP41:MOV BX,1000H;设置延时时间MOV DX,200H;PA口地址MOV AL,DSTEP; D输出高电平OUT DX,ALCALL DELAY;调延时MOV AL,CSTEP; C输出高电平OUT DX,ALCALL DELAY;调延时MOV AL,BSTEP; B输出高电平OUT DX,ALCALL DELAY;调延时MOV AL,ASTEP; A输出高电平OUT DX,ALCALL DELAY;调延时JMP K0DELAY PROC NEAR ;延时子程序PUSH CXMOV CX,BXDD1:NOPLOOP DD1POP CXRETDELAY ENDP ; 延时子程序结束CODE ENDS ;代码段结束END START。
STM32控制步进电机程序
STM32控制步进电机程序1.主函数#include\#include\#include\#include\#include\#include\intmain(void){u8t;u32v=1 00;stm32_clock_init(9);//系统时钟设置delay_init(72);//延时初始化uart_init(72,9600);//串口初始化led_init();//初始化与led连接的硬件接口key_init();//初始化与按键连接的硬件接口rcc->apb2enr|=1<<2;//使能porta时钟gpioa->crl&=0x0fffffff;gpioa->crl|=0x30000000;//pa7推挽输出gpioa->odr|=1<<7;//pa7输出高gpioa->crl&=0xff0fffff;gpioa->crl|=0x00300000;//pa5推挽输出gpioa->odr|=1<<5;//pa5输出高led1=1;led0=1;while(1){t=key_scan(0);//得到键值switch(t){casekey0_pres:v=v+10;tim3_int_init(v,7199);//10khz的计数频率tim3->cr1|=0x01;break;casekey1_pres:v=v-10;tim3_int_init(v,7199);//10khz的计数频率tim3->cr1|=0x01;//CX600X定时器3break;casewkup_pres:tim3->cr1&=0xfe;//关定时器3;break;}}}2.led初始化#include\#include\voidled_init(void){rcc->apb2enr|=1<<2;//CX600Xporta时钟rcc->apb2enr|=1<<5;//CX600Xportd时钟gpioa->crh&=0xfffffff0;gpioa->crh|=0x00000003;//pa8推挽输出gpioa->odr|=1<<8;//pa8输出高gpiod->crl&=0xfffff0ff;}gpiod->crl|=0x00000300;//pd.2推挽输入gpiod->odr|=0x0004;//pd.2输入低3.按键初始化#include\#include\voidkey_init(void){rcc->apb2enr|=1<<2;//CX600Xporta时钟rcc->apb2enr|=1<<4;//CX600Xportc时钟jtag_set(swd_enable);//停用jtag,打开swdgpioa->crl&=0xfffffff0;//pa0设置成输出gpioa->crl|=0x00000008;gpioa->crh&=0x0fffffff;//pa15设置成输入gpioa->crh|=0x80000000;gpioa->odr|=1<<15;//pa15上拉,pa0预设下拉gpioc->crl&=0xff0fffff;//pc5设置成输出gpioc->crl|=0x00800000;gpioc->odr|=1<<5;//pc5上拉}u8key_scan(u8mode){staticu8key_up=1;//按键按抬起标志if(mode)key_up=1;//积极支持连按if(key_up&&(key0==0||key1==0||wk_up==1)){delay_ms(10);//回去晃动key_up=0;if(key0==0)returnkey0_pres;elseif(key1==0)returnkey1_pres;elseif(wk_u p==1)returnwkup_pres;}elseif(key0==1&&key1==1&&wk_up==0)key_up=1;return0;//无按键按下}4.定时器初始化#include\#include%u32i=0;//定时器3中断服务程序voidtim3_irqhandler(void){if(tim3->sr&0x0001)//溢出中断{//gpioa->odr^=0x0100;gpioa->odr^=0x0080;led0=!led0;}tim3->sr&=~(1<<0);//去除中断标志位}voidtim3_int_init(u16arr,u16psc){rcc->apb1enr|=1<<1;//tim3时钟使能tim3->arr=arr;//设定计数器自动重装值tim3->psc=psc;//预分频器设置tim3->dier|=1<<0;//允许更新中断//tim3->cr1|=0x01;//使能定时器3my_nvic_init(3,3,tim3_irqn,2);//抢占市场3,子优先级3,组与2}。
PLC实现步进电机的正反转和调整控制
PLC实现步进电机的正反转和调整控制PLC(可编程逻辑控制器)是一种电子设备,用于控制工业自动化系统中的运动和操作。
步进电机是一种常用的驱动器,它的旋转运动是通过一步一步地前进来实现的。
本文将探讨如何使用PLC来实现步进电机的正反转和调整控制。
步进电机的正反转控制是通过改变电机绕组的相序来实现的。
在PLC 中,我们可以使用输出模块来控制电机的相序。
以下是步骤:1.配置PLC硬件:在PLC中插入输出模块,并与电机的各个相连接。
确保正确连接。
2.编程PLC:使用PLC编程软件,编写一个控制程序来实现电机的正反转。
首先,定义输出模块的输出信号来控制电机。
然后使用程序语言来编写逻辑控制指令,根据需要来改变输出信号的状态。
为了实现正反转,需要改变输出信号的相序。
3.实现正反转控制:在编程中,定义一个变量来控制步进电机的运动方向。
当变量为正值时,电机正转;当变量为负值时,电机反转。
根据变量的值来改变输出模块的输出信号,以改变电机的相序。
4.运行程序:将PLC连接到电源,并加载程序到PLC中。
启动PLC,程序将开始运行。
通过改变变量的值,我们可以控制电机的正反转。
除了控制步进电机的正反转,PLC还可以实现步进电机的调整控制。
调整控制是通过改变电机的步距和速度来实现的。
以下是步骤:1.配置PLC硬件:在PLC中插入输出模块,并与电机的各个相连接。
与正反转控制相同,确保正确连接。
2.编程PLC:使用PLC编程软件编写控制程序。
首先,定义输出模块的输出信号来控制电机的相序。
然后,使用程序语言来编写逻辑控制指令,根据需要改变输出信号的状态。
为了实现调整控制,需要改变输出信号的频率和占空比。
3.实现调整控制:在编程中,定义两个变量来控制电机的步距和速度。
步距变量控制电机每一步的距离,速度变量控制电机的旋转速度。
根据变量的值来改变输出模块的输出信号,以改变电机的相序,并控制步距和速度。
4.运行程序:将PLC连接到电源,并加载程序到PLC中。
程序(51控制步进电机,执行不同角度的转动)
void counter0(void) interrupt 0 using 1
{
EX0=0;
cont++;
EX0=1;
}
/*******************************************************************************
*实验名:步进电机角度控制
*实验说明:通过不同的按键控制步进电机角度分别是5度10度30度45度
*注意:
************************************************************************r*******/
#include <reg52.h>
/*******************************************************************************
*游承RGC
*
--------------------------------------------------------------------------------
//--定义一个全局变量--//
unsigned char cont=0;
unsigned int timer1=0;
void Delay10ms(unsigned int c); //延时10ms
void Time1Config();
/*******************************************************************************
实验5步进电机控制
实验五PWM配置及步进电机控制一、实验目的1. 了解步进电机驱动原理;2. 了解步进电机的控制原理;3. 熟悉使用PWM控制步进电机的运行。
二、实验主要内容1. DSP的初始化;2. ePWM模块初始化与配置;3. 步进电机的驱动程序。
三、实验基本原理1. 步进电机的驱动:图1 是单极性步进电机驱动的典型电路,图中的方块为驱动开关。
针对SEED-DEC 中直流电机系统的动作要求,步进电机驱动电路设计思路如下:1)电机采用15V直流电源供电;2)4路控制信号由DSP提供,信号为CMOS标准电平,通过排线接入并下拉;3)使用达林顿管TIP31C代替IRL549作为电机驱动开关,基级串接100欧电阻减小MOS管的寄生震荡;4)使用快速二极管IN4007完成保护功能,以免电机换向时烧毁电机;图 1 步进电机驱动电路2. 步进电机的控制一般分为四相四拍与四相八拍两种方式,其中前者称为全步,后者称为半步。
步进电机在这个实验中选择的时M35SP-7N,其步进角为7.5°,是一种单极性步进电机。
它的结构如图2:图 2 步进电机结构四、实验过程和关键程序解读1. 启动CCS,进入CCS的操作环境,并导入stepmotor工程。
2. 加载stepmotor工程,添加xml文件3. 阅读源代码1)初始化系统控制寄存器与要使用的GPIO:2)关中断、初始化PIE、初始化PIE向量表3)关ePWM时钟,配置后打开时钟,并更新中断向量表4)ePWM初始化函数(以EPwm1为例):EPWM2的其他配置与1相同,不用的在于一些事件产生的动作不同:其产生的pwm波为CMPAABCD线圈按照ACBD的次序导通步进电机接线示意图(2b-A、1b-B、1a-C、2a-D):则步进电机顺时针旋转4. 按照老师要求修改源代码1)改变步进电机的转速在使用直流电机时,通常是用占空比来调节转速的,但是在步进电机中,是通过改变PWM的频率来调整的,因为在一个PWM周期中,步进电机改变的相位是一样的,所以PWM频率越高,改变相同相位就越快,所以转速也越快,程序中我们只需改变TBPRD的值即可。
三相步进电机控制程序及电路
三相步进电机控制程序及电路概述三相步进电机是利用电子技术,通过不断地使电流按照一定规律改变来控制电机转动。
本文将介绍三相步进电机的控制程序,并详细讲解电路原理。
控制程序控制程序采用的是 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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
采用2相励磁方式,控制4相6线步进电机,每步转动1.8°。总共200步为一圈
*******************************************************/
run_motor(stepsL,stepsR);
}
direction_flagR=1;
stepsL=12500;
stepsR=5000;
}
void write_stepR() //P4~P7 control the Right motor
{
P33=step_flagR/0x8;
P32=step_flagR/0x4%0x2;
P31=step_flagR/0x2%0x2;
P30=step_flagR%0x2;
break;
case 0x3:
step_flagL=0x9;
break;
case 0x9:
step_flagL=0xc;
break;
default:
break;
};
if(direction_flagL==1) //if reversal
switch(step_flagL)
{
case 0xc:
step_flagL=0x9;
break;
case 0x9:
step_flagL=0x3;
break;
case 0x3:
step_flagL=0x6;
break;
}
void next_stepR()
{
if(direction_flagR==0) //if foreward
switch(step_flagR)
{
case 0xc:
step_flagR=0x6;
break;
case 0x6:
bit direction_flagR;
uint stepsL; //the total steps
uint stepsR;
void write_stepL() //P0~P3 control the Left motor
{ //there's no binary said method so....
sbit P36=P3^6;
sbit P37=P3^7;
uchar step_flagL; //show which step the motor with
uchar step_flagR;
bit direction_flagL; //flag of rotation direction
{
for(i=stepsR;i>0;i--)
{
next_stepL();
next_stepR();
}
j=stepsL-stepsR;
for(i=j;i>0;i--)
next_stepL();
}
else //if stepsL <= stepsR,run L and R, then only run R
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit P30=P3^0;
sbit P31=P3^1;
sbit P32=P3^2;
sbit P33=P3^3;
sbit P34=P3^4;
sbit P35=P3^5;
case 0x6:
step_flagR=0xc;
break;
default:
break;
};
write_stepR(); //put the value of step_flag into P04~P07
delay(1); //there're about 1000 steps in 1 second
{
for(i=stepsL;i>0;i--)
{
next_stepL();
next_stepR();
}
j=stepsR-stepsL;
for(i=j;i>0;i--)
next_stepR();
}
}
main()
{
direction_flagL=0;
}
void next_stepL()
{
if(direction_flagL==0) //if foreward
switch(step_flagL)
{
case 0xc:
step_flagL=0x6;
break;
case 0x6:
step_flagL=0x3;
}
void run_motor(uint stepsL,uint stepsR)
{
int i,j;
step_flagL=0xc; //inital motor
step_flagR=0xc;
if(stepsL>stepsR) //if the stepsL > stepsR,run the L and R ,then only run L
step_flagR=0x3;
break;
case 0x3:
step_flagR=0x9;
break;
case 0x9:
step_flagR=0xc;
break;
default:
break;
};
if(direction_flagR==1) //if reversal
case பைடு நூலகம்x6:
step_flagL=0xc;
break;
default:
break;
};
write_stepL(); //put the value of step_flag into P00~P03
delay(1); //there're about 1000 steps in 1 second
P37=step_flagL/0x8; //get first bit
P36=step_flagL/0x4%0x2; //get second bit
P35=step_flagL/0x2%0x2; //get third bit
P34=step_flagL%0x2; //get forth bit
}
delay(int z) //delay subprogram
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--); //y数值 在85 到142之间 电机能正常运转!!!(X=1 的时候)
//李凯的电机是这样的
switch(step_flagR)
{
case 0xc:
step_flagR=0x9;
break;
case 0x9:
step_flagR=0x3;
break;
case 0x3:
step_flagR=0x6;
break;