二相步进电机控制系统的课程设计.docx
《二相步进电机控制系统的课程设计.docx》由会员分享,可在线阅读,更多相关《二相步进电机控制系统的课程设计.docx(18页珍藏版)》请在冰豆网上搜索。
二相步进电机控制系统的课程设计
摘要
随着微型计算机控制技术的发展,步进电机广泛用于打印机、数控机床、机器人等产品中应用十分广泛.
本次课程设计,由硬件设计和软件设计两部分组成,完成二相步进电机的单极性控制.硬件设计主要包括ATmega128单片机、按键控制、步进电机驱动、数码显示等模块的设计.软件设计包括主程序以及各个模块的控制程序.相结合后在Proteus上进行仿真,实现对步进电机转动控制.
关键词:
二相步进电机单片机Proteus
1设计任务及要求
1.1设计任务
设计一个二相步进电机控制系统,电机有两组带中心抽头的线圈,要求系统具有如下功能:
采用单极性控制,用K0-K2做为通电方式选择键,K0为四相单四拍,K1为四相双四拍,K2为四相八拍;K3为启动/停止控制、K4方向控制;用4位LED数码管显示工作步数.用3个发光二极管显示状态:
正转时红灯亮,反转时黄灯亮,不转时绿灯亮;
硬件设计:
系统总原理图及各部分详细原理图;软件设计:
系统总体流程图、步进电机四相单四拍,四相双四拍,四相八拍各模块流程图、显示模块流程图等.编写程序:
能够完成上述任务
1.2任务分析
根据设计任务,要使二相步进电机实现正转和反转、四相单四拍、四相双四拍、四相八拍运行,可以通过输出不同的脉冲序列;要显示步进数可以用7段数码管实现;要显示运行状态可以通过输出控制给显示灯.
2方案选择与论证
2.1设计总思路
根据设计要求,本次课程设计,由硬件设计和软件设计两部分组成,完成二相步进电机的单极性控制.硬件设计主要包括ATmega128单片机、按键控制、步进电机驱动、数码显示等模块的设计.软件设计包括主程序以及各个模块的控制程序.相结合后在Proteus上进行仿真,实现对步进电机转动控制.并且将步进数显示在4位LED数码管上.
设计框图如图1所示:
图1系统框图
2.2设计方案
以单片机ATmega128为核心的控制系统,由PE口与PG口进行开关按键的设置,具体为:
PG0接K3启动/停止开关,低电平为停止状态,高电平为启动状态;PE4接K4正/反转开关,高电平为正转,低电平为反转;PE0接K0四拍通电方式,PE1接K1双四拍通电方式,;PE2接K1八拍通电方式,按任一键可以使电机进行转换到相应的工作方式.PF口与PD口外接4位LED数码管,显示步进步数进而实现4位数值的显示.PB口作为输出口外接负载,具体由PB7接绿色发光二极管,使其在电机停转时亮;PB5接红色放光二极管,使其在电机正转时亮;PB4接黄色发光二极管,使其在电机发转时亮.PB0-PB3外接驱动电路ULN2003A的B端4个输入端,路ULN2003A的B端4个输出端外接二相步进电机,这样即可通过控制单片机的PB口输出电平来实现二相步进电机的启动,停止,正反转以及四拍,八拍运转.具体工作过程需通过对单片机软件编程来实现.
硬件总电路图如图2所示:
图2.21总电路图
图2总电路图
3硬件电路设计
3.1系统硬件总电路设计
图3系统硬件总电路仿真图
图3为系统硬件总电路仿真图,在该设计中,用单片机Atmega128作为控制系统.PE和PG0接输入开关,获得控制的需求.PB0-PB3输出的控制脉冲经过驱动器ULN2003A后控制二相电机的运行.PB4、PB5、PB7分别接发光二极管,显示电机运行状态.PD和PF一起控制,是数码管显示出运行步数.
3.2二相步进电机电路的设计
图4为二相六线式步进电机的工作原示意图.它有2个绕组,且每个绕组都有一个中间抽头.当电机中的绕组通电后,其定子磁极产生磁场,将转子吸合到相应的磁极处.绕组在脉冲的作用下,通电方向使定子在正方向轮流产生磁场,则电机可正转,反之,则会反转.脉冲每作用一次,电机转动一步,即一个步距角.本次设计中需要单极性控制.可以使两组带中心抽头接高电平,A、B、C、D依次接入低电平即可实现.四相单四拍输入的脉冲信号是A-B-C-D-A;四相双四拍为AB-BC-CD-DA-AB-;四相八拍为AB-B-BC-C-CD-D-DA-A-AB.
图4二相步进电机原理图
3.3单片机原理与使用
图5为ATmega128单片机的引脚图,设计中采用ATmega128单片机.此次课设中需要使用该单片机的I/O口以及定时器/计数器功能.
使用I/O口时,端口可以读写、修改.每个端口都有3个I/O存储器地址:
数据寄存器-PORTx、数据方向寄存器-DDRx和端口输入引脚-PINx.前两者为读写寄存器,第三个为只读寄存器.
使用定时器/计数器功能时,选择其CTC模式(比较匹配时,清除定时器),T/C和输出比较寄存器(OCR0)为8位寄存器.计数器数值TCNT0一直增加至OCR0,匹配器给出匹配信号,将TCNT0清0.
图5ATmega128单片机的引脚图
3.4ULN2003A驱动电路设计
由于单片机输出电流很小,不能驱动电机的运行,所以需要添加驱动电路.驱动器ULN2003A是一个反向器电路,输入与输出相反.其管脚图如下:
图6ULN2003A管脚图
3.5四位数码管显示电路设计
图7为数码管显示模块图.设计中需要用4位LED数码管显示工作步数,可选择共阴极接法的数码管7SEG-MPX-CC.
为了显示数字,要对其进行编码.数字0-9依次对应为0X3f,0X06,0X5b,0X4f,0X66,0X6d,0X7d,0X07,0X7f,0X6f.
LED为动态显示,即将所有位数码管的段选线并联在一起,由位选控制某一个数码管显示.依次显示个、十、百、千位,由于发光管的余晖和眼睛视觉暂留的作用,看起来是同时在显示.只要控制PD和PF即可显示步数.
图7数码管显示电路图
3.6运行控制键电路设计
图8为电机运行控制按键电路图.依照设计要求K0-K2为运行方式选择键,K0为四相单四拍,K1为四相双四拍,K2为四相八拍;K3为启动/停止控制、K4方向控制.K0、K1、K2、K4接入单片机PF口,K3接到PG0.
图8电机运行控制键电路图(部分)
3.7电机运行状态显示电路设计
图9为电机运行状态显示部分电路图.用三个发光二极管显示电机运行状况,可以将PB7接绿色发光二极管,使电机停止时亮;PB5接红色发光二极管,使电机正转时亮;PB4接黄色二极管,使电机反转时亮.
图9电机运行状态显示电路图
4软件设计模块
4.1总流程分析与设计
程序总流程图如图10所示.主程序调用子程序display(),子程序display()反复运行,单片机持续工作.在display()中调用一个对按键输入进行扫描的子程序saomiao(),在程序saomiao()中,先读入PG0的值,判断是要启动还是停止.然后读入PE口值,判断是要正转还是反转以及需要的运行方式.再开启定时器/计数器time0和time2,从而PB口输出相应电机运行方式和电机运行状况灯的控制字.同时,由time2实现步数计数,saomiao()程序结束,进入display()程序,将scan[k]送给PF口选择数码管,将相应数字编码seven_seg[]送给PD口,从而显示数字.最后判断PG0的值,若PG0为0,则跳至程序开头判断PG0的地方.
图10程序总流程图
4.2步进电机运行方式控制流程图
步进电机流程图见图11.步进电机要能够完成三种运行状态.四相单四拍输入的脉冲信号是A-B-C-D-A,四相双四拍输入的脉冲信号是AB-BC-CD-DA-AB,四相八拍为AB-B-BC-C-CD-D-DA-A-AB.反转则脉冲信号顺序相反.需要选择不同的控制字.可以相应的定义其控制字数组:
d4[][8]={{0x21,0x22,0x24,0x28},{0x23,0x26,0x2c,0x29},{0x21,0x23,0x22,0x26,0x24,0x2c,0x28,0x29},{0x18,0x14,0x12,0x11},{0x19,0x1c,0x16,0x13},{0x19,0x18,0x1c,0x14,0x16,0x12,0x13,0x11}}.
程序通过控制寄存器值TCCR0来控制定时器/计数器0的启动与停止,当TCCR0=0x0E时,定时器/计数器0启动,TCNT0累加,当TCNTO=OCR0时,触发相应的中断子程序,设定当timer0=50时,将控制字输出到PB口,实现了延时.
图11步进电机单四拍、双四拍、八拍流程图
4.3显示模块流程图
显示模块流程图见图12.要显示四位数码,先对数字编码,定义编码数组seven_seg[10]={0X3f,0X06,0X5b,0X4f,0X66,0X6d,0X7d,0X07,0X7f,0X6f},和数码管选择数组scan[4]={0Xf7,0Xfb,0Xfd,0Xfe}.由PD口输出显示数字的编码,PE口输出数码管的选择码.使用time2来实现计数的功能,其工作在时序上与time0保持一致,使步进与计数同步.其程序流程图如下所示:
图12步数显示流程图
5系统调试与仿真
5.1调试与仿真过程
调试一般需要进行分块调试和整体调试.
对于软件部分,首先使用ICCAVR软件调试程序,如果出现错误,要分块检查,直至生成mytest.hex文件.
对于硬件部分,在PROTUS中,载入mytest.hex,进行仿真.检测是否达到设计要求,如果有问题,则要对其分块调试.
经过调试与仿真,找到没有达到要求的部分.此时,通过综合修改硬件电路和软件中的程序,最后的仿真满足了设计要求.
5.2调试中故障及解决方法
仿真时,遇到的问题及解决方法为:
1.开始设计时没有加入驱动电路,虽然仿真能够成功.但是后来了解到实际中单片机输出电流很小,无法驱动步进电机正常运行.所以应该加入驱动电路.
2.在硬件调试的过程中.发光二极管正极显示为灰色,请教同学之后才知道为高阻态.于是接入一个220欧姆的电阻后显示正常.
3用软件编译时,出现很多错误,参考了网上一些程序段,进行改正,最后顺利生成.hex文件.
4.仿真时,发现数码管显示有闪动,我仔细分析了数码管的原理和显示方法之后,然后修改了延时程序,加长延时时间,结果显示正常.
5.3仿真结果
根据设计要求,需要测试所有仿真结果,已确定是否完成设计要求.由于在仿真截图打印成黑白纸质文档时不能显示出运行状态灯的状况.故以下截取图其中任意一种运行方式的仿真结果图.
以四相双四拍反转运行仿真为例,其仿真图如下:
6心得体会
这次计算机控制课程设计需要使用到单片机、数电、电机以及C语言编程.其中电路、C语言、电机已学过,而单片机部分则不是十分了解.设计之初,想到要将这些全部结合起来,完全没有头绪,后来通过查阅一些资料,将问题分开,逐一了解.先了解单片机的I/O口等基本功能;然后确定电机不同运行状态下所需要的控制脉冲变化规律;再用延时定时器控制其输出脉冲控制波,实现步进功能;最后用计数器计算运行步数,从显示器输出等.最后通过很多次调试和改进终于成功仿真出来,完成了设计需求.
本次课程设计综合了很多学过的知识,同时也要自学新的知识.将理论运用于实践上,结合软件和硬件,提高了理论知识和实践能力.由于时间有限,遇到了很多困难,在同学的帮助和讨论下,自己查阅很多书籍和网络资料,最后完成了设计.学到了很多知识,特别是对单片机的运用.总的来说,经过此次设计我在各方面都有所收获.
参考文献
[1]于海生,《计算机控制技术》北京:
机械工业出版社,2007年
[2]张毅刚,《基于Proteus的单片机课程实验》北京:
人民邮电出版社,2007年
[3]马潮,《ATmega128原理与开发应用指南》北京:
北京航空航天大学出版社,2004年
[4]马德骏,《C语言程序设计》北京:
科学出版社,2009年
[5]杜刚,《ATmega128单片机C语言设计与实践》北京:
北京航空航天大学出版社,2004年
附录:
程序代码:
//ICC-AVRapplicationbuilder:
2012/6/3023:
30:
12
//Target:
M128
//Crystal:
4.0000Mhz
#include
#include
unsignedchard4[][8]={{0x21,0x22,0x24,0x28},{0x23,0x26,0x2c,0x29},{0x21,0x23,0x22,0x26,0x24,0x2c,0x28,0x29},
{0x18,0x14,0x12,0x11},{0x19,0x1c,0x16,0x13},{0x19,0x18,0x1c,0x14,0x16,0x12,0x13,0x11}};/*电机控制字*/
unsignedcharscan[4]={0Xf7,0Xfb,0Xfd,0Xfe};/*数码管片选信号,送PF口选数码管*/
unsignedcharseven_seg[10]={0X3f,0X06,0X5b,0X4f,0X66,0X6d,0X7d,0X07,0X7f,0X6f};/*0-9的编码,送PD口显示*/
unsignedcharflag,pai,tt,i,key,k=0;//定义正反转、模式、拍数、计数变量、按键值、数码管片选
typedefstruct{
charbaiqian;
chargeshi;
}time;//定义时钟变量
timenow;
voidport_init(void)//端口初始化程序
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xFF;
PORTE=0x00;
DDRE=0x00;
PORTF=0x00;
DDRF=0xFF;
PORTG=0x00;
DDRG=0x00;
}
//TIMER0initialize-prescale:
256
//WGM:
CTC
//desiredvalue:
100Hz
//actualvalue:
99.522Hz(-0.5%)
voidtimer0_init(void)//定时器0初始化
{
TCCR0=0x00;//stop
ASSR=0x00;//setasyncmode
TCNT0=0x64;//setcount
OCR0=0x9C;
//starttimer
}
unsignedchartimer0=0;
#pragmainterrupt_handlertimer0_comp_isr:
16
voidtimer0_comp_isr(void)
{
//compareoccuredTCNT0=OCR0
TCNT0=0x64;
OCR0=0x9C;
timer0++;
if(timer0==50)
{
timer0=0;
i++;
PORTB=d4[flag+pai][i%tt];
if(i==100)
i=0;
}
}
//TIMER2initialize-prescale:
256
//WGM:
Normal
//desiredvalue:
100Hz
//actualvalue:
100.160Hz(0.2%)
voidtimer2_init(void)//定时器2初始化
{
TCCR2=0x00;//stop
TCNT2=0x64;//setup
OCR2=0x9C;
//start
}
unsignedchartimer2=0;
#pragmainterrupt_handlertimer2_comp_isr:
10
voidtimer2_comp_isr(void)//实现数码管的计数功能
{
//compareoccuredTCNT2=OCR2
TCNT2=0x64;//setup
OCR2=0x9C;
timer2++;
if(timer2==100)
{timer2=0;
now.geshi++;
if(now.geshi==99)
{now.geshi=0;
now.baiqian++;
if(now.baiqian==99)
now.baiqian=0;}
}
}
//callthisroutinetoinitializeallperipherals
voidinit_devices(void)//单片机的初始化
{
//stoperrantinterruptsuntilsetup
CLI();//disableallinterrupts
XDIV=0x00;//xtaldivider
XMCRA=0x00;//externalmemory
port_init();
timer0_init();
timer2_init();
MCUCR=0x00;
EICRA=0x00;//extendedextints
EICRB=0x00;//extendedextints
EIMSK=0x00;
TIMSK=0x82;//timerinterruptsources
ETIMSK=0x00;//extendedtimerinterruptsources
SEI();//re-enableinterrupts
//allperipheralsarenowinitialized
}
voiddisplay(void)//显示并且运行
{
saomiao();/*读取按键输入的相应程序*/
PORTF=scan[k];/*选通一个数码管*/
switch(k)
{
case0:
PORTD=seven_seg[now.geshi%10];/*显示个位*/
break;
case1:
PORTD=seven_seg[now.geshi/10];
break;
case2:
PORTD=seven_seg[now.baiqian%10];
break;
case3:
PORTD=seven_seg[now.baiqian/10];
break;
}
k++;
if(k==4)k=0;
delay();
key=PING;
if(key==0x00)
TCCR2=0x00;
}
voiddelay()/*延时程序*/
{
inti,j;
for(i=0;i<20;i++)
for(j=0;j<30;j++);
}
unsignedcharj;
saomiao()/*按键输入扫描程序*/
{
key=PING;
if(key==0x01)
{j=PINE;/*读PE值*/
if(j==0x08)
{flag=0;}/*正转*/
elseif(j==0x00)
{flag=3;}/*反转*/
{if(j==0x02|j==0x0A)/*双四拍*/
{TCCR0=0x0E;pai=1;tt=4;TCCR2=0x04;now.geshi=00,now.baiqian=00;}
elseif(j==0x01|j==0x09)/*单四拍*/
{TCCR0=0x0E;pai=0;tt=4;TCCR2=0x04;now.geshi=00,now.baiqian=00;}
elseif(j==0x04|j==0x0c)/*八拍*/
{TCCR0=0x0E;pai=2;tt=8;TCCR2=0x04;now.geshi=00,now.baiqian=00;}
}
}
elsePORTB=0x80;
}
voidmain(void)/*主函数*/
{
now.geshi=00,now.baiqian=00;/*显示清零*/
init_devices();/*设备初始化*/
while
(1)/*循环执行以下程序*/
{
display();
}
}
本科生课程设计成绩评定表
姓名
高莼彬
性别
男
专业、班级
自动化0903班
课程设计题目:
二相步进电机控制系统的设计
课程设计答辩或质疑记录:
成绩评定依据:
序号
评定项目
评分成绩
1
选题合理、目的明确(10分)
2
设计方案正确,具有可行性、创新性(20分)
3
设计结果可信(例如:
系统建模、求解,仿真结果)(25分)
4
态度认真、学习刻苦、遵守纪律(15分)
5
设计报告的规范化、参考文献充分(不少于5篇)(10分)
6
答辩(20分)
总分
最终评定成绩(以优、良、中、及格、不及格评定)
指导教师签字:
年月日