基于51单片机的步进电机的控制设计

  • 格式:docx
  • 大小:256.91 KB
  • 文档页数:12

单片机应用系统设计报告 设计题目: 步进电机控制器设计 专业班级: 学生姓名: 指导教师: 设计时间: 2016年12月 一、 设计要求及方案 1、设计要求 可以实现步进电机正转和反转控制及速度的控制,同时实现步进电机步数的控制。

2、设计方案 本次设计采用AT89C51单片机控制一个四相步进电机。单片机输出脉冲序列,驱动步进电机转动;并设置开关、按键电路,来控制步进电机的2挡转速,即加速、减速;以及步数的变化,即四拍驱动方式、八拍驱动方式,同时控制步进电机的转动方向,即正转、反转。

设计方案总体框图:

二、 步进电机简介 1、步进电机工作原理 步进电机是一种将电脉冲转化为角位移的执行机构。当步进驱动器接收到一个脉冲信 号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”),它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控

AT89C51 单片机

单片机最小系统

开关、按键电路 单片机最小系统 步进电机 制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。步进电机可以作为一种控制用的特种电机,利用其没有积累误差(精度为100%)的特点,广泛应用于各种开环控制。步进电机是一种感应电机,它的工作原理是利用电子电路,将直流电变成分时供电的,多相时序控制电流,用这种电流为步进电机供电,步进电机才能正常工作,驱动器就是为步进电机分时供电的多相时序控制器。虽然步进电机已被广泛地应用,但步进电机并不能象普通的直流电机,交流电机在常规下使用。它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。因此用好步进电机却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。步进电机作为执行元件,是机电一体化的关键产品之一, 广泛应用在各种自动化控制系统中。随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。

2、步进电机磁力方式选择 步进电机的励磁方式主要分为全步励磁和半步励磁两种,其中全步励磁又有一相励磁和二相励磁之分,半步励磁又称一-二相励磁。 一相励磁:在每一瞬间,步进电机只有一个线圈导通。每送出一个励磁信号,步进电机旋转1.8°,这是三种励磁方式中最简单的一种。其特点是:精确度好、消耗电力小,但输出转矩小,震动较大。 二相励磁:在每一瞬间,步进电机有两个线圈同时导通。每送一个励磁信号,步进电机旋转1.8°。其特点是:输出转矩大,振动小。 一-二相励磁:为一相励磁与二相励磁交替导通的方式。每送一个励磁信号,步进电机旋转0.9°。其特点是:分辨率高,运转平滑。

本次设计,八拍驱动时采用一相励磁方式,四拍驱动时采用二相励磁方式。 八拍磁力顺序表: 时序 1 2 3 4 5 6 7 8 置1 A - B - C - D - 置0 - D - A - B - C 四拍磁力顺序表: 时序 1 2 3 4 置0 D A B C 置1 A,B B,C C,D D,A

三、硬件电路设计 1、晶振电路设计 AT89C51单片机各功能部件的运行都以时钟控制信号为基准,有条不紊,一拍一拍地工作。本次设计时钟电路采用内部时钟方式。AT89C51内部有一个用于构成震荡器的高增益方向放大器,它的输入端为芯片引脚XTAL1,输出端引脚为XTAL2。这两个引脚跨接石英晶体和微调电容,构成一个稳定的自激振荡器。本次设计选择振荡频率为12MHZ的石英晶体。

图 晶振电路 2、复位电路设计 AT89C51的复位是由外部的复位电路实现的。复位引脚RST通过一个施密特触发器与复 位电路相连,施密特触发器用来抑制噪声,在每个机器周期的S5P2,施密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。复位电路通常采用上电复位和按钮复位两种方式,本次设计采用上电复位方式。

图 复位电路 3、开关、按键电路 本次设计采用开关、按键电路来控制步进电机的正转、反转、加速、减速、步数。并且由单片机的P2口对其进行控制。

图 开关、按键电路 4、驱动电路设计 本设计采用ULN2003作为驱动器驱动步进电机运转,把单片机P1口输出的脉冲信号转化为 脉冲电流,驱动步进电机运转。

图 驱动电路 5、总电路图

图 总电路图 四、软件程序设计 1、程序设计思路 通过分析可以看出,实现系统功能可以采用多种方法,由于随时有可能输入加速、加速信号和方向信号,因而采用中断方式效率最高,这样总共要完成2个部分的工作才能满足课题要求,即主程序部分、定时器中断部分,其中主程序的主要功能是系统初始参数的设置及启动开关的检测,若启动开关合上则系统开始工作,反之系统停止工作;定时器中断器部分,控制按键标志位值的改变,从而可以控制主程序中步进电机转速、转向、步数。

2、程序框图 开始

初始化

输出一拍脉冲 延时 速度变快?

改变步数?

访问标志位 增加延时

减少延时

是 否 是 否

Flag 置0 Flag

置1 3、程序 #include #define uchar unsigned char #define uint unsigned int uint temp=4,flag=0; int k=100,m=0; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } sbit P2_5=P2^5; sbit P2_6=P2^6; sbit P2_7=P2^7; uchar check_key1() { uchar n; P2=0xff; n=P2; if(n!=0xdf) return 1; else return 0; } uchar check_key2() { uchar n; P2=0xff; n=P2; if(n!=0xbf) return 1; else return 0; } uchar check_key() { uchar n; P2=0xff; n=P2; if(n!=0x7f) return 1; else return 0; }

void timer0() interrupt 1 { switch(P2) { case 0xde: if(check_key1()==1) { delay(5); if(check_key1()==1) {temp=0; P1=0xf0;} } break;

case 0xdd: if(check_key1()==1) { delay(5); if(check_key1()==1) {temp=1; P1=0xf0;} } break;

case 0xbb: if(check_key2()==1) { delay(5); if(check_key2()==1) temp=2; } while(check_key2()); break;

case 0xb7: if(check_key2()==1) { delay(5); if(check_key2()==1) temp=3; } while(check_key2()); break; case 0x6f: if(check_key()==1) { delay(5); if(check_key()==1) { flag++; if(flag>=2) flag=0; } } while(check_key()); break; } } void sudu0() { if(temp==2) { k+=200; if(k>=1000) k=1000; temp=0; } if(temp==3) { k-=200; if(k<=0) k=100; temp=0; } } void sudu1() { if(temp==2) { k+=200; if(k>=1000) k=1000; temp=1; } if(temp==3) { k-=200; if(k<=0) k=100; temp=1; } }

sbit P1_0=P1^0; sbit P1_1=P1^1; sbit P1_2=P1^2; sbit P1_3=P1^3;

void main(void) { TMOD=0x01; EA=1; ET0=1; TR0=1; P1_0=0; P1_1=0; P1_2=0; P1_3=0; while(1) { for(m=1;m<=8;m++) { if(flag==0) { if(temp==0) { switch(m) { case 1: P1_0=1; delay(k);