您的当前位置:首页正文

单片机控制步进电机

2023-01-27 来源:易榕旅网
目录

成绩一、设计任务和要求........................................1二、设计思路..............................................1三、系统硬件设计..........................................23.1单片机电路原理介绍....................................33.2电机和驱动器电路原理介绍...............................43.3显示锁存电路原理介绍...................................53.4数码管原理.............................................6四、系统软件设计...........................................7五、调试过程与结果.........................................8六、总结与体会.............................................9七、参考资料..............................................10八、附录..................................................10附录一、总电路图..........................................11附录二、电路源程序........................................12附录三、元件清单..........................................17附录四、实物图............................................18

一、设计任务和要求

电机控制课程设计是考察学生利用所学过的电机控制专业知识,进行综合的电机控制系统设计并最终完成实际系统连接,能够使学生对电气与自动化的专业知识进行综合应用,培养学生的创新能力和团队协作能力,提高学生的动手实践能力。最终形成一篇符合规范的设计说明书,并参加综合实践答辩,为后期的毕业设计做好准备。

本次设计考核的能力主要有:

1)专业知识应用能力,包括电路分析、电子技术、单片机、检测技术、电

气控制、电机与拖动、微特电机及其驱动、计算机高级语言、计算机辅助设计、计算机办公软件等课程,还包括本专业的拓展性课程如变频器、组态技术、现场总线技术、伺服电机等课程。

2)项目设计与运作能力,团队协作能力,技术文档撰写能力,PPT汇报与

口头表达能力。

3)电气与自动化系统的设计与实际应用能力。要求完成的工作量包括:

1)制作实际成品,并现场演示效果。2)学生结合课题进行PPT演讲与答辩。3)学生上交课题要求的各类设计技术文档。

二、设计思路

电源模块

数码管显示模块MC

串口控制模块ULN2003驱动模块四相步进电机U

本次设计是以单片机为核心,通过控制模块发出信号,经单片机处理后,向步进电机的驱动器和状态显示模块发出触发信号,使得步进电机接收到驱动器的触

1发信号,就开始动作;状态显示模块显示当前步进电机的转速。电源为各个模块提供电能,让每个模块都能正常工作的基础;步进电机不能识别单片机发出的信号,应有驱动模块将单片机发出的信号进行转换、放大;才可以让步进电机做出相应的动作;驱动器在这里起到桥梁作用,为单片机与步进电机的连接而采用的;步进电机有单、双拍及单双混合式工作方式,课程设计采用四相五线式步进电机(双四拍工作方式),驱动模块应具备四根相线,才能满足步进电机的要求,驱动模块选取ULN2003芯片,ULN2003特点是低电压,低功率控制元件,符合课程设计要求;现在是智能化的时代,通过PC机发出要求,硬件做出相应的反馈动作,课程设计的控制模块就涉及到PC机,通过单片机串口通信,就可以与PC机连接、通信,这样就可以远距离,可监视、控制步进电机的运转速度;显示模块通过一对四联式的数码管构成,能够时时刻刻反映电机的状态,PC机与数码管都可以显示电机的运转速度,二者的区别在于数码管是固定在某个地方,给人指示的作用,而PC机是作为控制而显示的;各个模块都是独立的个体,软件程序是将整个模块合理的统一调度起来,完成课程设计任务。

三、系统硬件设计

可分单元电路进行原理介绍。1、单片机电路原理介绍:

单片机图

23.1.189C51单片机简介

其管脚图如图3-2所示。其各引脚功能如下:VCC:供电电压。GND:接地。

P0~P3口:4个8位I/O端口,每个端口既可以用作输入,也可用作输出。P3口也可作为AT89C51的一些特殊功能口。P3.0RXD(串行输入口);

;P3.1TXD(串行输出口);P3.2/INT0(外部中断0)P3.3/INT1(外部中断1);;P3.4T0(计时器0外部输入);P3.5T1(计时器1外部输入)P3.6/WR(外部数据存储器写选通);

P3.7/RD(外部数据存储器读选通)。

RST:复位输入。当振荡器复位器

件时,要保持RST脚两个机器周期的高电平时间。图3-2字节。

/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:当/EA保持低电平时,CPU只访问片外ROM程并执行外部存储器中的指令;当/EA端保持高电平时,CPU只访问片内FlashROM并执行内部存储器中的指令。

XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。

89C51芯片引脚图

ALE:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位

32、电机和驱动器电路原理介绍

图2电机和驱动器图

2.1ULN2003工作原理:ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。ULN2003工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V的电压,输出还负载电流并行运行。DIP—16或SOP—16塑料封装。ULN2003内部还集成了一个消线圈反电动势的二极管,可用来驱动继电器。它是双列16脚封装,NPN晶体管矩阵,最大驱动电压=50V,电流=500mA,输入电压=5V,适用于TTLCOMS,由达林顿管组成驱动电路。ULN是集成达林顿管IC,内部还集成了一个消线圈反电图2.1芯片ULN2003可以在高ULN2003采用动势的二极管,它的输出端允许通过电流为200mA,饱和压降VCE约1V左右,耐压BVCEO约为36V。用户输出口的外接负载可根据以上参数估算。采用集电极开路输出,输出电流大,故可直接驱动继电器或固体继电器,也可直接驱动低压灯泡。通常单片机驱动ULN2003时,上拉2K的电阻较为合适,同时,COM引脚应该悬空或接电源。ULN2003是一个非门电路,包含7个单元,单独每个单元驱动电流最大可达350mA,9脚可以悬空。在本系统中采用了四相五线型步进电机,采用单极性直流电源供电。只要对步进电机的各相绕组按合适的时序通电,就能使步进电机转动。当某一相绕组通电时,对应的磁极产生磁场,并与转子形成磁路,这时,如果定子和转子的小齿没有对齐,在磁场的作用下,由于磁通具有力图走磁阻最小路径的特点,则转子将转动一定的角度,使转子与定子的齿相互对齐,由此可见,错齿是促使电机旋转的原因。

2.2驱动模块的工作原理

图2.1中IN1~IN4引脚经四个与非门接单片机引脚RD0~RD3,引脚

4OUT1~OUT4连接到步进电动机的4个引脚。这样单片机发出的信号经过ULN2003放大后从OUT1-OUT4口分别输出到电机的A、B、C、D相线,即可驱动步进电机转动了。

3、显示锁存电路原理介绍

图3锁存电路图

该电路工作原理:74hc573是8位三态D触发器(如图3-10所示)。1脚是输出控制端,1脚=L,使能输出;1脚=H,高阻。11脚是时钟,下降沿触发.。

在数码管显示方面,要维持一个数据的显示,往往要持续的快速的刷新。尤其是在四段八位数码管等这些要选通的显示设备上。在人类能够接受的刷新频率之内,大概每三十毫秒就要刷新一次。这就大大占用了处理器的处理时间,消耗了处理器的处理能力,还浪费了处理器的功耗。锁存器的使用可以大大的缓解处理器在这方面的压力。当处理器把数据传输到锁存器并将其锁存后,锁存器的输出引脚便会一直保持数据状态直到下一次锁存新的数据为止。

图3-10

74HC573引脚结构图

54、数码管原理

图4数码管电路图

此模块由一个四位一体的共阴极数码管和排阻组成。四位一体数显数码管用于步进电机转速的显示,转速数据通过单片机的P2.0~P2.7口输出先经由74HC574锁存器锁存再传送给数码管进行显示。

4位一体共阴极数码管,其内部段已连接好,引脚如图3-12所示。a、b、c、d、e、f、g、dP为段引脚,A1、A2、A3、A4分别表示四个数码管的位。

5、串口电路原理51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一

图5串口模块

个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:第5脚的GND、第

62脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,串口电路图第15脚和单片机的20脚连接。

四、系统软件设计

开始定时器0,1,2初始化

电机初始化

While(1)

Y

串口数据处理子程序判断条件满足吗Y

电机动作

数码管显示子程序结束

图4.1主程序流程图

7开始

开始段选初始化位选初始化

对串口初始化接收中断发送的数据

I<4

数据转换成数码管显示的值i++

处理后的值返回上位机图4.2数码管显示流程

结束

图4.3数据处理流程图

软件程序中分主程序部分(设置外部中断0、数码管显示、数据锁存、按键延时消抖)、步进电机正反转参数设置部分、数码管显示延时部分。

其中主程序的主要功能是系统初始参数的设置及按钮的检测,若按钮SW1按下则系统开始工作,反之系统停止工作;外部中断0部分控制脉冲频率,它决定了步进电机转速的快慢;数据锁存部分将单片机P2口输出信号进行锁存,并调用数码管显示延时程序对数码管按位输送数据;数码管显示部分则设定了所要显示的电机转速;步进电动机正反转参数设置由表4-1所示进行设定。

表4-1正转励磁顺序AB→BC→CD→DA→AB

STEP1234

A1001

B1100

C0110

D0011

8五、调试过程与结果

(1)将各元器件在线路板上进行排版;(2)按原理图接线;

(3)先测试4位一体数码管的极性

调试过程还是比较成功的,电机能够正常的运转,数码管能够成功的显示电机当前的转速。

六、总结与体会

“实践出真知”!这次课程设计的确使我受益匪浅。

通过本次电机控制课程设计,我们对微特电机及其驱动课程的知识有了进一步的理解和掌握。尤其是在单片机、步进电动机的还有C语言编程的学习上都有了很大的收获。在设计电路时,我们充分应用我们所学的知识,在不断的思考和改进中,将它们设计结合在一起去实现我们想要的结果。这培养了我们对专业知识的综合运用能力和在处理问题时的逻辑思维能力。同时通过这次课程设计也复习了Proteus仿真和Protel绘制原理图的一些基本操作。

在本次课程设计中最能锻炼人的编程环节,因为在这一个环节中,出现的问题是最多,也是最麻烦的。在此过程中,我们发现了修改完善程序的重要性,则我们在编程中要仔细检查自己的程序,考虑到各种可能发生的情况。虽然改写的过程是很需要耐心考验的,但却一步步增强自己的能力,相信通过这次课程设计它对我们以后的学习及工作都会产生重要的影响。

本次课程设计中,我们小组分工合作,从确立课题到绘制原理图、编程再到最后的实物制作与答辩都能有条不紊的进行着,想要有好的学习效率,团队协作非常重要,也是通过这次课程设计,培养了我们的团队精神,这在以后的无论是在生活、学习还是工作中,都是大有帮助的。

总而言之,这次的课程设计让我们体验到了先苦后甜的感觉,让我们收获满满,带着这份甜,带着这份收获,以后的我们会更加的努力,不断前进。

9七、参考资料

参考资料不低于5篇,参考书目要求与本设计课题相关。格式参考:

[1]侯文霞.变频调速技术在中央空调控制中的应用[J].机床电器.2002第二期.[2]韩常.PLC编程及应用[M].北京:机械工业出版社,2005.

[3]彭虎,周佩玲,傅忠谦.微机原理与接口技术[Z].北京:电子工业出版社,2008[4]张齐,朱宁西.单片机应用系统设计技术——基于C51的Proteus仿真[Z].北京:电子工业出版社,2009

[5]周荷琴,吴秀清.微型计算机原理与节后技术[Z].合肥:中国科技大学出版社。2009

八、附录

附录一:总电路图

附录二:电路源程序#include#include#include\"timer0.h\"#include\"display.h\"#include\"uart.h\"//Motor

sbitCoilA=P1^0;sbitCoilB=P1^1;

10sbitCoilC=P1^2;sbitCoilD=P1^3;

#defineuintunsignedint#defineucharunsignedchar

#defineSTEPNUM48//步进电机一圈的步数

/////////////////////////////////////////步进电机驱动

unsignedcharStepNumber=0;bitStepGapFlag,StrRecvOkFlag;

ucharstr1Print[]=\"Timer0'svalueis:\";

//测试用

//测试

uchari,UartSendArray[8]={0,0,0,0,0,'\\r','\\n','\\0'};用:'\\r','\\n'为换行符,'\\0'为结束符

ucharstr2Print[]=\"UartRecvArrayvalueis:\";//测试用

//测试用

ucharUartPrintArray[6]={0,0,0,'\\r','\\n','\\0'};

ucharUartRecv,UartRecvArray[5]=0;uinttime0value,speedvalueRPM;

uchardisData[]={11,11,11,11,11,0,0,0};voidInitMotor(){

CoilA=0;CoilB=0;CoilC=0;CoilD=0;

//定义串行口接收数据变量

11}

voidSetMotor(){

switch(StepNumber){

case0:

if(StepGapFlag){

if(disData[0]==10)

P0=0x03;else

P0=0x0c;_nop_();

StepNumber=1;StepGapFlag=0;}break;

//00000011

case1:

if(StepGapFlag){

P0=0x09;_nop_();StepNumber=2;StepGapFlag=0;}break;case2:

if(StepGapFlag)

//0b00001001;

12{

if(disData[0]==10)

P0=0x0c;else

P0=0x03;_nop_();StepNumber=3;StepGapFlag=0;}break;case3:

if(StepGapFlag){

P0=0x06;_nop_();StepNumber=0;StepGapFlag=0;}break;}

//0b00000110;

//0b00001100;

}

voidmain()

{InitTimer0();//初始化定时器InitMotor();//电机停止Init_SerialCom();

while(1)

13{

if(speedvalueRPM!=0)

SetMotor();if(StrRecvOkFlag){

StrRecvOkFlag=0;

if((UartRecvArray[0]-0x30)<5)

disData[0]=10;else

disData[0]=15;

disData[1]=UartRecvArray[1]-0x30;disData[2]=UartRecvArray[2]-0x30;disData[3]=UartRecvArray[3]-0x30;

speedvalueRPM=disData[1]*100+disData[2]*10+disData[3];//speedvalueRPM/60得到1s转的圈数//speedvalueRPM/60*STEPNUM

得到步进电机转1圈需加的脉冲数

//1000000/(speedvalueRPM/60*STEPNUM)得到每个脉冲的时间间

time0value=1000000/(speedvalueRPM*STEPNUM/60);//单位us

//=================以下为测试用,串口输出定时器0的定时时间us======

UartSendArray[0]=time0value/10000+0x30;UartSendArray[1]=time0value/1000%10+0x30;UartSendArray[2]=time0value/100%10+0x30;UartSendArray[3]=time0value%100/10+0x30;UartSendArray[4]=time0value%10+0x30;

UartPrintArray[0]=UartRecvArray[0];UartPrintArray[1]=UartRecvArray[1];

14UartPrintArray[2]=UartRecvArray[2];

UartSendStr(&str1Print);UartSendStr(&UartSendArray);UartSendStr(&str2Print);UartSendStr(&UartPrintArray);

//================================================================

}

display(disData);}

}

/*************************************

*************************************/voidISR_Timer0(void)interrupt1{

uinttemp;

temp=65536-time0value;TH0=temp/256;TL0=temp%256;StepGapFlag=1;}

voidUART_ISR(void)interrupt4using3{

//中断函数不用声明

//12M

15if(RI==1){

RI=0;

UartRecv=SBUF;if(UartRecv!='\\0'){

UartRecvArray[i]=UartRecv;i++;}

if(i==4)//假定输入的速度值为3个字符{

i=0;

StrRecvOkFlag=1;}}}

附录三:元件清单元件名称单片机模块单片机ULN2003芯片ULN2003底座电容22pf晶振12MHz电容10uf电阻10k

数量2个2个3个3个6个2个4个4个

16数码管连在一起(4个共阴为一个)74HC573芯片74hc573底座

小功率异步电机(四相五线)杜邦线排针单片机卡槽

4个4个4个2个3套3排1个

附录四:实物图片

1718

因篇幅问题不能全部显示,请点此查看更多更全内容