四相步进电机反转四拍程序

合集下载

步进电机的控制程序

步进电机的控制程序

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,和较高的电压/电流要求之间的接口,广泛应用与计算机、打印机、继电器、灯等类似负载中。

单片机课程方案设计书步进电机启动停止正反转

单片机课程方案设计书步进电机启动停止正反转

单片机课程设计报告步进电机控制设计姓名:黄盛海 201030480108詹志勋 201030480125郑榕生 201030480128班级: 10车辆工程1班指导老师:李震姜晟日期: 2012.6.18~6.20华南农业大学工程学院摘要:步进电机是机电控制中一种常用的执行机构,它的用途是将电脉冲转化为角位移,它的的驱动电路根据控制信号工作,控制信号由单片机产生。

本次课程设计主要采用A T89S52芯片,用汇编语言编写出电机的正转、反转、加速、减速、停止程序,通过单片机、电机的驱动芯片ULN2003以及相应的按键实现以上功能,并且步进电机的工作状态要用相应的发光二极管显示出来。

控制系统主要由硬件设计和软件设计两部分组成。

其中,硬件设计包括单片机的最小系统模块、电源模块、控制模块、步进电机ULN2003A驱动模块、彩灯显示模块5个功能模块的设计。

并且通过仿真控制系统对硬件、软件进行了调试和改善,实现了上述功能。

本系统具有智能性、实用性及可靠性的特点。

关键词:步进电机单片机电脉冲驱动系统汇编语言目录1、课程设计目的及要求 (4)2、整体系统分析 (4)3、硬件系统分析 (6)4、软件系统分析 (10)5、调试结果 (10)6、结论 (11)7、参考文献 (12)附一:源程序 (12)1. 课程设计目的及要求1.1 课程设计目的增进对单片机的感性认识,加深对单片机理论方面的理解;掌握单片机的内部功能模块的应用,如定时器/计数器、中断、存贮器、I/O口、A/D 转换等;了解和掌握单片机应用系统的软硬件设计过程及实现方法。

1.2 课程设计要求设计一个步进电机控制器,要求用多个按键控制电机的启动/停止、加速、减速、反转等控制功能;用彩灯显示电机的转动状态,如加速就控制彩灯快速闪烁,减速则控制彩灯慢速闪烁等。

2. 整体系统分析2.1步进电机控制工作原理步进电机实际上是一个数字\角度转换器,也是一个串行的数\模转换器。

分析步进电动机四相单四拍运行过程

分析步进电动机四相单四拍运行过程

分析步进电动机四相单四拍运行过程步进电动机是一种将电脉冲信号转换为机械转动的电动机。

四相单四拍运行是其中一种常见的工作方式。

下面是对四相单四拍运行过程的简要分析:
1.步进电动机通常由两个以上的线圈组成,每个线圈连接一个相位(A、B、C、D)。

2.在四相单四拍运行中,通过依次给不同相位的线圈施加脉冲信号来实现转动。

假设初始状态下电机处于静止位置。

3.第一步骤:开始时,给A相线圈施加电脉冲信号,使得A相线圈激磁,产生磁场。

此时,电机会略微转动,使得齿轮或者转轴与其他组件对齐。

4.第二步骤:当A相线圈激磁的同时,给B相线圈施加电脉冲信号。

A相和B相线圈同时激磁,其磁场相互作用,电机继续转动一小步。

5.第三步骤:接着,给B相线圈保持激磁的同时,停止A相线圈的激磁。

这样,电机又会停下来,并使得齿轮或转轴与其他组件再次对齐。

6.第四步骤:最后,给C相线圈施加电脉冲信号,使得C相线圈激磁。

C相线圈激磁时与其他线圈不激磁,电机继续转动一小步。

7.之后,循环以上四个步骤,通过依次控制不同相位的线圈激磁和停止激磁,从而实现持续的转动。

四相四拍——精选推荐

四相四拍——精选推荐

步进电机需要提供具有一定驱动能力的脉冲信号才能正常工作,脉冲信号由单片机输出的激励信号经过脉冲分配产生。

脉冲分配可以通过硬件模拟分配电路实现,也可以利用软件方便地实现。

一个完整的驱动电路不仅需要激励信号,还需有足够的功率。

在一般的电路驱动中,需将由CPU产生的脉冲信号经过功率放大后,再接到步进电机输入端。

随着大规模集成电路技术的发展,逐渐出现了很多专门用于步进电机控制的脉冲分配芯片,它们配合功率放大的驱动电路可以实现步进电机的驱动。

12.3.1 一般步进电机驱动电路在专门的步进电机驱动集成芯片出现以前,一般都是采用电路来驱动步进电机工作。

在电路设计中,必须要考虑的是驱动信号的分配和放大。

在信号分配方面,采用的均是单片机统一分配的形式;在信号放大方面,则是由各种放大电路来完成的。

下面介绍一种利用硬件电路连接而成的脉冲分配驱动电路。

1.电路驱动的工作原理图12-5所示是一个四相步进电机的驱动电路。

A、B、C、D分别接到P1口的P1.4~P1.7。

通过软件控制一组脉冲序列,控制步进电机的转速、方向和步距。

在步进电机的驱动线路中,主CPU发出的控制信号经U1放大,传到复合三极管前一级的基极。

若CPU送出的数据为0,则前级三极管BG5作为开关三极管不导通,BG1也处于截止状态,电机内的线圈不得电;若CPU送出的数据为1,则前级三极管BG5的基极有了驱动电流,12V电压经电机的线圈、限流电阻和三极管形成通路。

在电路图中的A、B、C、D分别代表电机内部的4个线圈,在驱动线中的R5~R8作为限流电阻来限制线圈中的电流值。

在电阻和线圈两侧有并联的单向二极管,当CPU信号由1跳变为0时,三极管截止,电机的线圈会产生很大的感应电动势,这时线圈、限流电阻和单向二极管形成回路,保护三极管不被线圈的瞬时感应电动势烧坏。

二极管D1~D4也称回流二极管,在选择时要考虑到电源电压及线圈电流。

R1~R4和D1~D4组成一条支路,在对应的线圈突然不通电时能够和线圈构成一组循环回路。

步进电机驱动程序(二相四线可使用4、8节拍)

步进电机驱动程序(二相四线可使用4、8节拍)

以下是STM32F1的代码部分(我是按照8拍的方式写的)
硬件的连线方式单片机IO口PB12 电机A+
PB13 电机A-
PB14 电机B+
PB14 电机B-
#define AA_H GPIO_SetBits(GPIOB, GPIO_Pin_12 ); #define AA_L GPIO_ResetBits(GPIOB, GPIO_Pin_12 ); #define AD_H GPIO_SetBits(GPIOB, GPIO_Pin_13 ); #define AD_L GPIO_ResetBits(GPIOB, GPIO_Pin_13 ); #define BA_H GPIO_SetBits(GPIOB, GPIO_Pin_14 ); #define BA_L GPIO_ResetBits(GPIOB, GPIO_Pin_14 ); #define BD_H GPIO_SetBits(GPIOB, GPIO_Pin_15 ); #define BD_L GPIO_ResetBits(GPIOB, GPIO_Pin_15 );
void motor_run(void) { AA_H; AD_L; BA_L; BD_L; delay_ms(5); AA_H; AD_L; BA_H; BD_L; delay_ms(5); AA_L; AD_L; BA_H; BD_L; delay_ms(5); AA_L; AD_H; BA_H; BD_L; delay_ms(5); AA_L; AD_H; BA_L; BD_L; delay_ms(5); AA_L; AD_H; BA_L; BD_H; delay_ms(5); AA_L; AD_L; BA_L; BD_H; delay_ms(5); AA_H; AD_L; BA_L; BD_H; delay_ms(5); }

控制步进马达双四拍正反转

控制步进马达双四拍正反转

/****************************************************************************** ******** 标题: 步进电机试验二(双四拍方式)**** 通过本例程了解步进马达使用及驱动程序编写**; 双四拍工作方式:**; 正转:A/B AB AB/ A/B/** 反转:A/B/ AB/ AB A/B** UDN2916电流控制真值表:* I0 I1 输出电流* L L 最大* H L 最大*2/3* L H 最大*1/3* H H 0** 请学员一定要消化掉本例程*J14短路冒需断开******************************************************************************** *******/#include "reg52.h"#define speed 30//Motorsbit PH1 = P1^0; //定义管脚sbit PH2 = P1^1;sbit I01 = P1^2;sbit I11 = P1^3;sbit I02 = P1^4;sbit I12 = P1^5;sbit k1 = P0^0;int a;void delay(int time);/***************************************函数功能:产生脉冲控制步进机正转:A/B AB AB/ A/B/I0 I1 为低电平时,均以最大电流输出**************************************/void Go0(){ //APH1 = 0; //PH1为0 则A线圈为反向电流I01 = 0;I11 = 0;PH2 = 0; //PH2为1 则B线圈为反向电流A/B/ AB/ AB A/B I02 = 0;I12 = 0;delay(speed);//0PH1 = 1; //PH1为1 则A线圈为正向电流I01 = 0;I11 = 0;PH2 = 0; //PH2为1 则B线圈为反向电流I02 = 0;I12 = 0;delay(speed);//BPH1 = 1; //PH1为1 则A线圈为正向电流I01 = 0;I11 = 0;PH2 = 1; //PH2为0 则B线圈为正向电流I02 = 0;I12 = 0;////delay(speed);//0PH1 = 0; //PH1为0 则A线圈为反向电流I01 = 0;I11 = 0;PH2 = 1;I02 = 0;I12 = 0;delay(speed);}void Go1(){ //APH1 = 0; //PH1为0 则A线圈为反向电流I01 = 0;I11 = 0;PH2 = 1; //PH2为1 则B线圈为正向电流I02 = 0;I12 = 0;delay(speed);//0PH1 = 1; //PH1为1 则A线圈为正向电流A/B AB AB/ A/B/ I01 = 0;I11 = 0;PH2 = 1; //PH2为0 则B线圈为反向电流I02 = 0;I12 = 0;delay(speed);//BPH1 = 1; //PH1为1 则A线圈为正向电流I01 = 0;I11 = 0;PH2 = 0; //PH2为0 则B线圈为正向电流I02 = 0;I12 = 0;////delay(speed);//0PH1 = 0; //PH1为0 则A线圈为反向电流I01 = 0;I11 = 0;PH2 = 0; //PH2为1 则A线圈为正向电流I02 = 0;I12 = 0;delay(speed);}/*******************延时函数****************************/ void delay(int time){int i,j;for(j=0; j <= time; j++)for(i =0 ; i <= 120; i++);}void main(){while(1){if(k1==0)a=0;else a=1;switch(a){case 0 :Go0();break;case 1 : Go1();break; //步进电机运行}}}。

四相步进电机如何确定程序

四相步进电机如何确定程序

步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。

在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。

这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。

使得在速度、位置等控制领域用步进电机来控制变的非常的简单。

虽然步进电机已被广泛地应用,但步进电机并不能象普通的直流电机,交流电机在常规下使用。

它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。

因此用好步进电机却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。

目前,生产步进电机的厂家的确不少,但具有专业技术人员,能够自行开发,研制的厂家却非常少,大部分的厂家只一、二十人,连最基本的设备都没有。

仅仅处于一种盲目的仿制阶段。

这就给用户在产品选型、使用中造成许多麻烦。

签于上述情况,我们决定以广泛的感应子式步进电机为例。

叙述其基本工作原理。

望能对广大用户在选型、使用、及整机改进时有所帮助。

二、感应子式步进电机工作原理(一)反应式步进电机原理由于反应式步进电机工作原理比较简单。

下面先叙述三相反应式步进电机原理。

1、结构:电机转子均匀分布着很多小齿,定子齿有三个励磁绕阻,其几何轴线依次分别与转子齿轴线错开。

0、1/3て、2/3て,(相邻两转子齿轴线间的距离为齿距以て表示),即A 与齿1相对齐,B 与齿2向右错开1/3て,C 与齿3向右错开2/3て,A'与齿5相对齐,(A'就是A ,齿5就是齿1) 2、旋转: 如A 相通电,B ,C 相不通电时,由于磁场作用,齿1与A 对齐,(转子不受任何力以下均同)。

如B 相通电,A ,C 相不通电时,齿2应与B 对齐,此时转子向右移过1/3て,此时齿3与C 偏移为1/3て,齿4与A 偏移(て-1/3て)=2/3て。

如C 相通电,A ,B 相不通电,齿3应与C 对齐,此时转子又向右移过1/3て,此时齿4与A 偏移为1/3て对齐。

步进电机调速程序

步进电机调速程序

/****************************************************************************** ******** 标题: 步进电机试验一**** 通过本例程了解步进马达使用及驱动程序编写**; 单双八拍工作方式:**; 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();} }。

步进电机四相八拍驱动程序

步进电机四相八拍驱动程序
if(CurKey==LastKey)
{
keytimes++;
if(keytimes%5==0)//短按
{
keycode=(ShortPush|CurKey);
}
else if(keytimes>100) //长按
{
keytimes=101;
keycode=(LongPush|CurKey);
}
}
else if(CurKey!=LastKey)
{
TCNT1H=0xC5;
TCNT1L=0x69;
}
else if(SlowSpeed==0) //15ms
{
TCNT1H=0xF1;
TCNT1L=0x5B;
}
if(Direction==0)
{
PORTC&=~(1<<PC2|1<<PC3);
PORTD=((1<<PD3)|stepper[stepcnt]);
break;
case 0x8E:
break;
case 0x8D:
break;
case 0x8B: //连续微调+
TuneFlag=3;
Pflag=0;
break;
case 0x87: //连续微调-
TuneFlag=4;
Pflag=0;
break;
default:
break;
}
}
}
PORTC|=1<<PC3;
}
if(TuneFlag!=0)
{
switch(TuneFlag)
{
case 0x01:
case 0x03:

四相步进电机原理图及程序

四相步进电机原理图及程序

四相步进电机原理图本文先介绍该步进电机的工作原理,然后介绍了其驱动器的软、硬件设计。

1. 步进电机的工作原理该步进电机为一四相步进电机,采用单极性直流电源供电。

只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。

图1是该四相反应式步进电机工作原理示意图。

图1 四相步进电机步进示意图开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。

当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。

而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。

依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。

四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。

单四拍与双四拍的步距角相等,但单四拍的转动力矩小。

八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。

单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图2.a、b、c所示:a. 单四拍b. 双四拍c八拍图2.步进电机工作时序波形图2.基于AT89C2051的步进电机驱动器系统电路原理步进电机驱动器系统电路原理如图3:图3 步进电机驱动器系统电路原理图AT89C2051将控制脉冲从P1口的P1.4~P1.7输出,经74LS14反相后进入9014,经9014放大后控制光电开关,光电隔离后,由功率管TIP122将脉冲信号进行电压和电流放大,驱动步进电机的各相绕组。

使步进电机随着不同的脉冲信号分别作正转、反转、加速、减速和停止等动作。

图中L1为步进电机的一相绕组。

AT89C2051选用频率22MHz的晶振,选用较高晶振的目的是为了在方式2下尽量减小AT89C2051对上位机脉冲信号周期的影响。

四相双四拍步进电机控制系统设计解读

四相双四拍步进电机控制系统设计解读

1引言本实验旨在通过控制AT89S52芯片,实现对四相步进电机的转动控制。

具体功能主要是控制电机正转、反转、加速与减速。

具体工作过程是:给试验箱上电后,拨动启动开关,步进电机按照预先设置的转速和转动方式转动。

调整正反转按钮,步进电机实现正反转切换;拨动加速开关,步进电机转速加快,速度达到最大值,不再加速;拨动减速开关时,电机减速转动,速度减到最小速度,停止减速。

89C58)芯片、拨码开关单元、四项步进电机等硬件设备。

实验具体电路单元有:单片机最小系统、步进电机连接电路、拨码开关连接电路。

2四项步进电机2.1 步进电机步进电机是一种将电脉冲转化为角位移的执行机构。

电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。

2.2 步进电机的共组原理2.2步进电机的控制1.换相顺序控制:通电换相这一过程称为脉冲分配。

例如:混合式步进电机的工作方式,其各相通电顺序为A-B-C-D,通电控制脉冲必须严格按照这一顺序分别控制A,B,C,D相的通断。

2.控制步进电机的转向控制:如果给定工作方式正序换相通电,步进电机正转,如果按反序通电换相,则电机就反转。

3.控制步进电机的速度控制:如果给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会再转一步。

两个脉冲的间隔越短,步进电机就转得越快。

2.3步进电机的工作过程开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。

当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。

而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。

依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。

四相五线步进电机控制程序

四相五线步进电机控制程序

#include <reg51.h>sbit LA=P2^0; //定义两相,选择P2口的低四位输出//LA为A,LB为B,LC为C,LD为Dsbit LB=P2^1;sbit LC=P2^2;sbit LD=P2^3;sbit key1 = P3^7; //定义按键1sbit key2 = P3^6; //定义按键2sbit key3 = P3^5; //定义按键3sbit key4 = P3^4; //定义按键4sbit key5 = P3^3; //定义按键5sbit key6 = P3^2; //定义按键6/********函数声明*************************************************************/ void right(unsigned int Speed,unsigned int road); //正转void left(unsigned int Speed,unsigned int road); //反转void mDelay(unsigned int DelayTime); //延时函数/********变量定义*************************************************************/ int MotorStep=0; //步进索引/***********主函数开始********************************************************/void main(){P2&=0XF0; //因ULN2003A直接驱动,初始时为低电平,这里一定不能少了while(1){ //循环if(key1==0) //1键按下正转right(20,32); //两个参数代表转速和步进量,以20的速度进32步if(key2==0) //2键按下反转left(20,32);if(key3==0) //3键接下正转right(10,32); //两个参数代表转速和步进量,以10的速度进32步if(key4==0) //4键接下反转left(10,32);}}/***********正转,两个参数代表转速和步进量*************************************/void right(unsigned int Speed,unsigned int road){//步进节拍:A-B-C-Dwhile(road){switch(MotorStep){case 0:LB=0;LC=0;LD=0;LA=1; //AMotorStep=1;break;case 1:LA=0;LC=0;LD=0;LB=1; //BMotorStep=2;break;case 2:LA=0;LB=0;LD=0;LC=1; //CMotorStep=3;break;case 3:LA=0;LB=0;LC=0;LD=1; //DMotorStep=0;break;}mDelay(Speed); //这里的延时即控制转速road--; //完成一步}P2&=0XF0; //将四个脚复位0,停止}/***********反转,两个参数代表转速和步进量*************************************/ void left(unsigned int Speed,unsigned int road){//步进节拍:D-C-B-Awhile(road){switch(MotorStep){case 3:LA=0;LC=0;LD=0;LB=1; //BMotorStep=2;break;case 2:LB=0;LC=0;LD=0;LA=1; //AMotorStep=1;break;case 1:LA=0;LB=0;LC=0;LD=1; //DMotorStep=0;break;case 0:LA=0;LB=0;LD=0;LC=1; //CMotorStep=3;break;}mDelay(Speed); //这里的延时即控制转速road--; //完成一步}P2&=0XF0; //将四个脚复位0}/***********延时函数*******************************************************/ void mDelay(unsigned int DelayTime){unsigned char j=0;while(DelayTime--){for(j=0;j<100;j++){}}}。

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