基于单片机与步进电机的运动控制系统.docx
《基于单片机与步进电机的运动控制系统.docx》由会员分享,可在线阅读,更多相关《基于单片机与步进电机的运动控制系统.docx(22页珍藏版)》请在冰豆网上搜索。
基于单片机与步进电机的运动控制系统
摘要
悬挂轨迹控制系统是一电机控制系统,控制物体在80cm×100cm的范围内作直线、圆、寻迹等运动,并且在运动时能显示运动物体的坐标。
设计采用STC89C52单片机作为核心器件实现对物体运动轨迹的自动控制,采用脉冲宽度调制技术控制直流电机驱动芯片L298,以实现对电机的转速、转向、启停等多种工作状态进行快速而准确的控制。
本文首先在第一部分介绍了本设计的目标,第二部分介绍了设计方案的选择和所要用到的相关技术,第三部分介绍了基于系统结构的相关电路设计,第四部分介绍了系统的软件设计。
最后,在第五部分是该论文的结束语。
关键词:
STC89C52单片机;运动轨迹;脉冲宽度调制;L298
ABSTRACT
Hangtrajectorycontrolsystemisamotorcontrolsystem,objectmakelinear,circle, searchinglocusandetclocomotionwithintherangeofthe80cm×100cm,whilemovementsystemcandisplaythecoordinateoftheobject.AdoptSTC89C52MCUasthemainparttorealizetheautomaticcontroloftheobjectmotionlocusinthisdesign.InthisdesignsystemalsoadoptPWMtechniquecontrolDCmotordrivechipL298torealizetheaccuratecontrolofmotorrotationspeed,rotationdirection,Start,Stopandetcoperatingposition.
Thispaperintroducesthedesigngoalsinthefirstpart,theselectionanddesigntotheuseofrelatedtechnologyinthesecondpart,thedesignofrelatedcircuitsbasedonthesystemstructureinthethirdpart,thesoftwaredesignofthesysteminthefouthpart.Intheend,thereisaconclutioninthefifthpart.
KEYWORDS:
STC89C52MCU;sporttrajectory;PWM;L298
第1章系统设计要求与意义
1.1系统设计要求
1、控制系统能够通过键盘或其他方式任意设定坐标点参数;
2、控制物体在80cm×100cm的范围内作自行设定的运动,运动轨迹长度不小于100cm,物体在运动时能够在板上画出运动轨迹,在一定时间内完成;
3、控制物体作圆心可任意设定、半径为R的圆周运动,在一定时间内完成;
4、物体从左下角坐标原点出发,在一定时间内到达设定的一个坐标点。
1.1悬挂运动控制示意
1.2系统设计意义
运动控制是自动化技术的重要组成部分,是机器人等高技术领域的技术基础,已取得了广泛的工程应用。
运动控制集成了电子技术、电机拖动、计算机控制技术等内容,例如在工厂、码头往往需要将货物从一点搬往另一点,如使用悬挂控制系统更方便、安全。
在此基础上还可设计成基于三线悬挂结构的运动控制装置。
所谓三线悬挂是指,将三根缆线系于一点并悬挂重物,且三根缆线分别挂在三个固定滑轮上,其长度由电机驱动的三个绕线轮分别控制,从而控制悬挂重物在三维空间中的位置。
其中原理和悬挂轨迹控制系统一样的。
悬挂轨迹控制系统是一电机控制系统,集成了电子技术、电机拖动、计算机控制技术等。
本系统设计中以STC89C52RC单片机为控制核心,由直流步进电机、驱动电路、电源模块、4*4键盘及中文液晶显示屏等构成的悬挂运动控制系统。
通过所需运动轨迹曲线的参数方程,建立运动控制模型,按照算法对两组驱动步进电机进行控制,实现了悬挂画笔在给定的范围内的定点运动、圆心可任意设定的圆周运动等功能,以及完成了实现通过人机界面对物体所作运动进行设定,通过液晶显示屏实时显示画笔所在的坐标值等发挥要求。
1.3系统设计中的任务
在整个课题设计中,涉及到硬件设计部分和软件设计部分,每个部分的设计对于整个系统设计都很重要,因此需要每个组员的默契合作,在总体目标的指导之下来完成各自的任务:
1.根据课题要求,根据硬件部分的设计,为软件部分的设计进行编程语言的选择和比较,并为单片机选择一个良好的程序开发环境;
2.根据系统的设计要求和目标,进行理论分析和计算,确定软件设计中的算法;
3.根据主程序流程图来画出点到点子程序和画圆子程序流程图,进而根据程序流程图进行程序的编写。
第2章系统设计方案的论证和比较
根据题目要求可知,系统由图2.1中模块组成。
图2.1 系统模块框图
本系统所涉及的核心问题主要有:
1、系统软件设计中需要选择一个合适的语言编程环境,从而达到设计的要求。
2、对电机的转速、转向、启停等多种工作状态进行快速而准确的控制,以保证悬挂物体按照预先设定或即时设定的运动轨迹运行。
3、为保证该控制系统的精度要求,必须对运动物体在画板上的具体位置(坐标点)进行实时的检测。
4、为保证该运动物体能在尽可能短的时间内按设定运动轨迹从起始点到达目标点,还需要相应的设定及显示电路。
我们分以下几个部分进行方案设计和比较论证。
2.1软件设计语言与单片机开发环境选择
2.1.1软件设计语言选择
软件部分可用C语言和汇编语言进行编程,二者的特点分别如下:
1.汇编语言的特点:
(1)助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序;
(2)使用汇编语言编程比使用高级语言困难。
因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解;(3)汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能直接管理和控制硬件设备;(4)汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用。
2.C语言的特点:
(1)语言简洁、紧凑,使用方便、灵活。
C语言一共只有32个关键字,9种控制语句,程序书写形式自由,主要用小写字母表示,压缩了一切不必要的成分。
因此C程序比较简练,源程序短,输入程序时工作量少;
(2)运算符丰富。
C的运算符包含的范围很广泛,共有34种运算符。
C把括号、赋值、强制类型转换等都作为运算符处理,从而使c的运算类型极其丰富,表达式类型多样化。
灵活使用各种运算符可以实现在其他高级语言中难以实现的运算;(3)数据结构丰富,具有现代化语言的各种数据结构。
C的数据类型有整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。
能用来实现各种复杂的数据结构(如链表、树、栈等)的运算,尤其是指针类型数据,使用起来比PASCAL更为灵活、多样;(4)具有结构化的控制语句(如if…else语句、while语句、do…while语句、switch语句、for语句)。
用函数作为程序的模块单位,便于实现程序的模块化。
C是理想的结构化语言,符合现代编程风格的要求;(5)语法限制不太严格,程序设计自由度大。
例如对数组下标越界不做检查,由程序编写者自己保证程序的正确。
对变量的类型使用比较灵活,例如整型量与字符型数据以及逻辑型数据可以通用;(6)C语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。
因此,C既具有高级语言的功能,又具有低级语言的许多功能,可用来写系统软件。
C语言的这种双重性,使它既是成功的系统描述语言,又是通用的程序设计语言。
有人把c称为“高级语言中的低级语言”或“中级语言”,意为兼有高级和低级语言的特点;(7)生成的目标代码质量高,程序执行效率高。
一般只比汇编程序生成的目标代码效率低10%一20%;(8)用C语言写的程序可移植性好(与汇编语言相比)。
基本上不做修改就能用于各种型号的计算机和各种操作系统。
基于以上分析,在本系统软件设计中选用C语言来进行有关程序的编写。
2.1.2单片机集成开发环境选择
集成开发环境(简称IDEIntegratedDevelopEnvironment)是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具。
就是集成了代码编写功能、分析功能、编译功能、debug功能等一体化的开发软件服务套。
所有具备这一特性的软件或者软件套(组)都可以叫做IDE。
本系统采用C语言进行程序指令的编写,因此单片机的开发环境可由以下选择:
1.TURBOC集成开发环境。
TURBOC是DOS上的一个C语言系统,它也能以全屏幕方式或窗口方式运行在各种Windows环境中。
TURBOC符合ANSIC标准。
TURBOC的组成部分包括C语言编译系统,连接系统,ANSIC的标准函数库和一批扩充库函数等。
2.KeilC51集成开发环境。
与TurboC相比KeilC可以更有效地利用片上有限的RAM空间,利用其特有的特殊功能寄存器sfr可以更加有效地对硬件的I/O接口,提供了更有效率的内部RAM可寻址位或特殊功能寄存器中的可寻址位操作,KeilC编译器支持C中大部分的函数但是一些不适用于嵌入式系统应用的库函数则没有包含,而是由C51扩充了一些非C标准函数使其更加适合单片机的操作,它同时针对8051单片机的自身特点作了一些特殊扩展。
总之,KeilC语言功能齐全,具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。
而且它也具有强大的图形功能,支持多种显示器和驱动器,而且计算功能、逻辑判断功能也比较强大,可以实现决策目的。
而且它的适用范围广,适合多种操作系统,如DOS、Windows、UNIX,也适用于多种机型。
另外,用KeilC编写的程序具有坚固性,数据不容易被破坏。
根据以上分析,本系统单片机的开发环境选用KeilC51。
2.2 控制器模块
方案一:
采用ATMEL公司的AT89C51作为控制器的方案。
单片机运算能力强,软件编程灵活,自由度大。
但是如果系统需要增加语音播放功能,还需外接语音芯片,实现较为复杂。
另外51单片机需要仿真器来实现软硬件调试,较为烦琐。
方案二:
本系统使用的是STC公司生产的STC89C52RC单片机,它是一款性价比非常高的单片机,它完全兼容ATMEL公司的51单片机,除此之外它自身还有很多特点,如:
无法解密、低功耗、高速、高可靠、强抗静电、强抗干扰等。
其次STC公司的单片机内部资源比起ATMEL公司的单片机来要丰富的多,它内部有1280字节的SRAM、8-64K字节的内部程序存储器、2-8K字节的ISP引导码、除P0-P3口外还多P4口(PLCC封装)、片内自带8路8位AD(AD系列),片内自带EEPROM、片机自带看门狗、双数据指针等.目前STC公司的单片机在国内市场上的占有率与日俱增。
基于以上分析,选择方案二。
2.3步进电机驱动模块
步进电机是一种将电脉冲转化为角位移的机电执行元件,每外加一个控制脉冲,电机就运行一步故称为步进电机或脉冲马达。
通俗一点讲:
当步进电机接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(步进角)。
在本设计中,主控制器通过对电机的步进数控制来实现物体的运动,从而作出各种运动轨迹,设计思想是将物体的运动转换为拉线的伸缩,最终将伸缩量转化为电机的步数,从便于软件设计的角度出发,采用了两相混合式步进电机作为被控电机,具有较高的控制精度,速度的可控性好,制动性强。
其驱动方案如下:
方案一:
使用多个功率放大器驱动电机。
通过使用不同的放大电路和不同参数的器件,可以达到不同的放大要求,放大后能够得到较大的功率。
但是由于使用的是二相步进电机,就需要对二路信号分别进行放大,由于放大电路很难做到完全一致,当电机的功率较大时运行起来会不稳定,而且电路的制作会比较复杂。
方案二:
采用集成芯片L298N的驱动电路。
L298N驱动芯片是性能优越的小型直流电机驱动芯片之一。
它可被用来驱动两个直流电机或者是一个两相步进电机。
在4--46V的电压下,可以提供2A的驱动电流。
L298N还有过热自动关断功能,并有反馈电流检测功能,符合电机驱动的需要;且L298N芯片可以直接用单片机的IO口提供信号,电路简单,使用比较方便。
本设计中要用到两个L298N,每个驱动电路的六个输入引脚分别接单片机的六个I/O端口,当输入脚为高电平时,相应的输出就是高电平,四个输出端口则会驱动二相电机的换相动作。
引脚高低电平转化的频率会直接影响电机的转速。
其实在本设计中可以只用六个I/O口就可以驱动两个步近电机。
通过比较,使用L298N芯片,能稳定地驱动步进电机,且价格不高,故选择方案二。
2.4显示模块
方案一:
采用数码管显示,数码管具有低能耗,耐老化和精度比较高等优点,但数码管与单片机连接时,需要外接锁存器进行数据锁存,使用三极管进行驱动等,电路连接相对比较复杂。
此外,数码管只能显示少数的几个字符,显示的内容较少,基本上无法显示汉字。
方案二:
采用LCD进行显示。
液晶显示屏(LCD)具有功耗低,无辐射危险、平面直角显示以及影象稳定,可视面积大,画面效果好,既可显示图形,也可显示汉字,分辨率高,抗干扰能力强,显示内容多等特点.此外,LCD与单片机可直接相连,电路设计及连接简单。
基于以上分析和比较,采用方案二。
2.5输入模块
控制系统能够输入任意设定坐标点参数,有以下两种方案
方案一:
通过使用触摸屏,确定坐标点参数。
触摸屏可以形象显示坐标点位置,工作稳定。
但由于只需输入两个字节的坐标点参数,信息量比较少,且是以点阵的模式处理数据,需要利用控制芯片创建坐标点库,编程工作量大,其成本也偏高。
方案二:
使用通用可编程键盘。
键盘编程容易,可实现对键盘的自动扫描,识别闭合键的键号,可以节省单片机处理键盘的时间,提高单片机的工作效率。
根据以上论述,采用方案二,在系统中使用4*4键盘。
第3章系统硬件设计
根据以上的系统方案选择与论证,系统的硬件连接如下图3.1所示:
图3.1系统硬件连接图
3.1键盘模块电路设计
根据设计需求,本系统中使用了标准的4×4键盘,其电路原理图如图3.2。
图中C1~C4为4×4键盘的列信号,L1~L4为4×4键盘的行信号。
在本系统中,用IOB4~IOB7连接键盘的列信号C4~C1;用IOB0~IOB3连接键盘的行信号L4~L1。
图3.2 4×4键盘电路原理图
3.3电机驱动模块电路设计
使用L297和L298N芯片来驱动电机。
由于本控制系统采用5V电源,电机驱动L298N的电源也使用5V,基于稳定性考虑,我们运用了TLP521光耦集成块,将主控制部分电源与电机驱动部分的电源隔离开,这样减少电机对主控制电路的干扰。
3.1显示模块设计
在系统中,利用液晶显示屏LCD1602作为显示模块实时显示定点的坐标,LCD与单片机可直接相连,电路设计及连接简单。
第4章软件部分设计
4.1理论分析与计算
1、位移/脉冲转换方法:
给步进电机一定频率的脉冲,使电机拖动一载体移位100cm,记录下此期间所给脉冲总数z,由此则步进电机拉动载体位移1mm所需的脉冲数
(注意给定的频率不要太高,否则会出现丢步。
多测几次,取脉冲数相近的那个脉冲数z),因此,直接可将拉线的位移转化为送给电机的脉冲个数。
脉冲的频率决定转速,脉冲个数决定位移。
2、点到点运动核心算法:
结合图4.1说明,假设E(x0,y0),F(x1,y1)为给定平面范围上的任意两点,作辅助线(图中虚线部分),在直角三角形⊿ABE中
a0=
;
在直角三角形⊿CDE中:
b0=
同理对于F点,两拉线长分别为:
a1=
b1=
因此当悬挂物从E点运动到F点时:
电机1的收放线长度为c(当c<0,电机正转(或拉线伸长);c>0时,电机反转(或拉线收缩))
c=a0-a1
电机2的收放线长度为d(当d<0,电机反转(或拉线收缩),当d>0时,电机正转(或拉线伸长))
d=d0-d1
根据c,d的正负分别确定电机1,电机2的正反转向。
而根据c,d的绝对值来确定电机1,电机2各自所需的脉冲数:
电机1所分配的脉冲数:
m=
×p
电机2所分配的脉冲数:
n=
×p
图4.1 点到点运动示意图
3、误差补偿:
为了使运动轨迹更加平滑,采用按比例分配脉冲的原则进行交替送脉冲,电机2所运行的脉冲数是电机1所运行的脉冲数的
倍,因此电机1每运行t个脉冲,电机2就需要运行
×t个脉冲,该算法可能会造成电机2所送的脉冲数与理论计算脉冲数稍有偏差,因此加入适当的补偿程序,使得所运行轨迹精度更高,曲线更平滑。
4、数学模型:
本设计要求悬挂物能够画一个圆,设所画圆的圆心坐标为(x0,y0)半径为Rcm,(x,y)为圆周上的任意一点,由此确定圆的方程为:
(x-x0)^2+(y-y0)^2=R^2
若直接使用该方程来求圆上点的坐标,算法比较复杂,采用了圆的参数方程:
X=x0+Rsint;
Y=y0+Rcost; (x0,y0)为圆心坐标
这样,则圆的坐标仅与参数t有关,因此,使角度t以某一设定的角度步长v累加,使t+q×v在周期[t,t+2π]内变化,其中q为累加步数。
这样就可以采样到圆上均匀的点,显然,角度步长v越小,在圆周上取得点越多,控制也会更精确。
4.2程序流程图
4.2.1主程序
单片机开发中除必要的硬件外,同样离不开软件。
通过选择和比较,本系统软件设计采用C语言,以实现系统所要求的各项功能。
系统软件主程序流程图如图4.2所示:
图4.2 主程序流程图
4.2.2定点运动子程序
通过对步进电机的控制,使悬挂物从初始位置运动到指定点流程图如图4.3所示:
图4.3 定点运动子程序流程图
//**点到点程序**//
voiddraw_line(floatx0,floaty0,floatx1,floaty1)//(x0,y0):
起点坐标,(x1,y1):
停止点坐标
{floata0,b0,a1,b1,c,d,m,n,dir1,dir2;
a0=sqrt((x0+15)*(x0+15)+(115-y0)*(115-y0));
b0=sqrt((95-x0)*(95-x0)+(115-y0)*(115-y0));
a1=sqrt((x1+15)*(x1+15)+(115-y1)*(115-y1));
b1=sqrt((95-x1)*(95-x1)+(115-y1)*(115-y1));
c=a1-a0;
d=b1-b0;
if(c>0)
dir1=1;
else
dir1=0;
m=sqrt(c*c);
SMotor_Init(0);
SMotor_Move(bitdir1,ucharsdelay,uintm);
if(d>0)
dir2=1;
else
dir2=0;
n=sqrt(d*d);
SMotor_Init(0);
SMotor_Move(bitdir2,ucharsdelay,uintn);
}
4.2.3画圆子程序
根据圆的参数方程的计算圆上点的坐标,通过调用画圆程序来实现,画圆程序流程图如图4.4所示。
图4.4 画圆子程序流程图
/**画圆*********************/
voiddraw_circularity(floatrr,floatx0,floaty0)//rr:
半径,(x0,y0):
圆心坐标
{floatL_l,L_r,L_l0,L_r0,inc_Ll,inc_Lr,xx,yy,xxx;
intcount_l,count_r,i;
L_l0=sqrt((x0+rr+15)*(x0+rr+15)+(115-y0)*(115-y0));//(x0+rr,y0):
画圆起点坐标
L_r0=sqrt((95-x0-rr)*(95-x0-rr)+(115-y0)*(115-y0));
for(i=1;i<=360;i++)
{xx=rr*cos(pai*i/180)+x0;
xxx=xx;
yy=rr*sin(pai*i/180)+y0;
L_l=sqrt((xx+15)*(xx+15)+(115-yy)*(115-yy));
L_r=sqrt((95-xx)*(95-xx)+(115-yy)*(115-yy));
inc_Ll=L_l-L_l0;
inc_Lr=L_r-L_r0;
count_l=inc_Ll/step_l+(inc_Ll>=0?
0.5:
-0.5);//左步进电机每步弧长(厘米)
count_r=inc_Lr/step_r+(inc_Lr>=0?
0.5:
-0.5);//右步进电机每步弧长(厘米)
drive_motor(count_l,count_r);
delay(50);//延时50ms
L_l0=L_l;
L_r0=L_r;
}
}
4.2.4键盘子程序
键盘流程图如图4.5所示。
4.5键盘模块程序流程图
键盘程序
include
#defineucharunsignedchar
sbitP2_0=P2^0;
sbitP2_1=P2^1;
sbitP2_2=P2^2;
sbitP2_3=P2^3;
sbitP1_0=P1^0;
voiddelay(uchary);
voidflased(ucharx);
ucharkeyscan(void);
voidmain(void)
{ucharkey;
flased
(2);
while
(1){
key=keyscan();
switch(key)
{
case1:
case2:
case3:
case4:
case5:
case6:
case7:
case8:
case9:
case10:
case11:
case12:
case13:
case14:
case15:
case16:
flased(key);break;
}
}
}
ucharkeyScan(){/*按键扫描子瞅**/
uchari,temp,key1;
P2=0x0f;
temp=0x70;
while((P2&0x0f)!
=0x0f)
{delay(