地面运动控制系统设计12

上传人:马*** 文档编号:107934067 上传时间:2022-06-15 格式:DOCX 页数:21 大小:176.18KB
返回 下载 相关 举报
地面运动控制系统设计12_第1页
第1页 / 共21页
地面运动控制系统设计12_第2页
第2页 / 共21页
地面运动控制系统设计12_第3页
第3页 / 共21页
点击查看更多>>
资源描述
地面运动控制系统设计摘要:本地面运动控制系统,采用直流电机作为系统的运动源,采用AT89S52作为系统的核心,通过输入脉冲来控制直流电机的运转,从而控制小车的运动轨迹。该系统能够用键盘输入坐标的参数,设置运动模式;用LCD器件1602作为系统的显示器件,界面友好,能够显示系统的工作模式和及当前坐标值,通过拨码开关还可设置电机。软件采用修正查表法(自行设计)计算电动机需要的脉冲个数,节省大量CPU资源和程序存储空间,代码简洁,便于设计和调试。本系统具有多种画图功能,能够画直径为50cm的(面板内)任意圆心的圆或弧,能够画出任意斜率的直线,且能够动态显示当前的坐标,运行速度快,误差小,基本上完成了所要的功能。 一、方案设计本选题是用单片机技术开发地面运动控制系统、小车的控制单元主要包括传感器及调理电路,直流电机及驱动电路,控制器三个部分。控制系统采用AT89S52,控制器按一定的时钟周期对光电检测器的输入信号采样检测,根据光电检测器的状态,判断小车的动作,给直流电机输出正确的控制信号,实现电机的转动。通过定时器中断用C语言编程实现对小车的控制,改变定时器的初值来控制小车的速度。电机采用的是直流电机,直流电机的运行还要一个驱动电路,这里采用L298N驱动芯片。最后,由于系统各部分的驱动电压、电流的不同,因此满足各个模块的需要。小车的循迹功能,需要通过两个红外光电传感器,二个红外光电传感器探测地面情况,由于轨迹为黑色的,不产生反射,其感应信号表现为低电平,通过比较运放后以高电平的形式输出到控制芯片,相反则为低电平,光电检测放大电路将其状态送入控制器AT89S52,对输入的信号进行相应的判别,并用C语言编写程序控制光电传感器的检测间隔,以及小车运动的速度,控制器根据直流电机类别输出相应的控制字,让小车实现位移。在软件设计方面,则分为三个模块,即数据采集模块、信号处理模块、控制器控制电机模块。此设计结构简单,采用传统的单片机C语言进行编程,通过编译成机器语言,再由通信软件将机器码文件送入单片机联机经KEIL C51仿真调试验证结果的正确性。二、方案论证根据题目的设计要求,本设计主要实现勾画设定轨迹和对设定轨迹的搜寻功能,并能实时的显示物体中画笔所在位置坐标。其系统方案框图如图1.1所示。为实现各模块功能,提出了几种设计方案并进行论证。 稳压电路 循迹模块键 盘模块 控制模块 驱动模块 显示模块图1.1 系统方案框图1、控制器模块方案一:采用传统的51系列单片机作为系统控制器。在本设计中,单片机的运算速度越快,运动轨迹精度越高,所以对单片机的执行速度有较高的要求;又由于本系统程序量较大,使用的I/O口资源较多,并且AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8KB在系统可编程Flash存储器,片上Flash允许程序存储器在系统可编程。方案二:采用SPCE061A单片机来实现,此单片机内置8路10位ADC和2路DAC,避免了外接A/D转换芯片和D/A转换芯片,I/O接口比较多,易于扩展外围电路,开发板集成了语音播报的硬件,通过软件编程即可以用于语音采集和播报。但由于本组成员对于51系列单片机比较了解,因此决定选用 AT89S52单片机。 综上所述,采用方案一。2、电机驱动模块在本设计中,主控制器通过对电机的转数控制来实现物体的运动,从而作出各种运动轨迹,设计思想是将物体的运动转换为电机的转速的问题,从便于软件设计的角度出发,采用了直流电机作为被控电机,这种具有较高的控制精度,速度的可控性好,制动性强。其驱动方案如下:采用L298N模块,通过单片机的I/O输入改变芯片控制端的电平,即可以对电机进行正反转,停止的操作。L298N电机驱动模块包含两个H桥电路,可以同时驱动两个直流电机或一个四线步进电机。利用单片机控制可以很方便地利用PWM脉宽调制法进行调速。3、寻迹模块方案一:采用热探测器。由于温度变化是因为吸收热能辐射能量引起的,与吸收红外辐射的波长没有关系,即对红外辐射吸收没有波长的选择,因此受外界环境影响比较大。方案二、采用红外光电传感器作为敏感元件,利用红外线对不同颜色的反射系数不同而产生强弱电流信号,所以受外界环境的影响比较小,抗干扰性比较强。基于以上两种方案比较,采用方案二。 经过上述的分析和论证,决定了系统各模块采用的最终方案如下:(1) 控制模块:采用AT89S52单片机;(2) 循迹模块: 采用红外传感器构成循迹模块;(3) 键盘模块:采用矩阵键盘;(4) 显示模块:采用1602字符型LCM构成显示模块;(5) 电机驱动模块:采用L298N模块来实现;(6) 电源模块:采用过滤,滤波,稳压等电路实现。三、各模块电路原理图1、AT89S52控制模块原理如图3-1 图3-12、矩阵键盘原理图如图3-2 图3-23、电机驱动模块原理图如图3-3 图3-34、电源稳压电路如图3-4图3-4四、测试数据、测试结果分析及结果1、 测试仪器 测试仪器包括秒表、数字万用表、信号发生器、示波器、MCS51仿真机、直流稳压电源、卷尺:量程5m、秒表,直尺,坐标纸、黑色的胶布等。2、测试方法 数字万用表主要用来测试分立元件的电阻、压降、漏电流、截止/导通状态等参数;信号发生器与示波器用于测试各光电传感器信号的接收与传输;MCS51仿真机用于测试软件;直流稳压电源在测试期间为各待测系统供电;秒表用于产品测试,按照任务书的基本要求对制成的电动车进行产品测试。测试数据及测试结果分析: 计时精度分析 计时系统采用了新型显示芯片。理论上的误差不到1秒/年。测距精度分析 测速系统采用了电机轴光电码盘检测技术。电机轴与车轮轴之间采用了齿轮箱二级减速,变比1/16。车轮周长135mm,光电码盘与电机轴安装在一起,电机轴每一转产生2个脉冲,车轮每转产生32个脉冲,理论测量精度可达135mm/32=4.22mm4.5mm定位精度分析 本设计采用实际测量与软件补偿技术,理论上可使定位精度提高到误差10mm。3、转轮周长的测量 。(1)测试方法用测试程序控制转轮转动5周,然后测其总周长,然后求其平均值。(2)数据的记录表4.1 转轮周长测量数据初始长度 cm122.35 105.65 130.55 平均值 转动 5 周后 cm 28.40 12.25 36.30 5 周总长度 cm 93.95 93.40 94.25 98.67 (3)测试结果平均周长 98.67/518.773cm4、自行运动情况测试(1)测试方法和步骤:由于系统具有根据设定自由运动的功能,通过设定小车所要经过的点,然后对比设定值和小车实际所到点的坐标值,分析系统相应误差,同时由秒表记录完成相应运动所需的时间,完成相应的记录。(3)测试结果分析在Y方向的误差,到了(40,100)点,由于此时两直流电机的转速差较大,因此误差较大。5、自动曲线跟踪的测试(1)测试方法和测试步骤用黑色胶布,在光滑纸板上贴出圆形运动轨迹,然后观察小车的运动轨迹。(2)现象记录小车能够沿着运动轨迹平稳的走完全程,并且平稳的停在另一个端。(3)测试结果的分析通过上面的现象可以得出,系统能够准确完成连续曲线的运动。源代码:#include#include#include#define c 406 /411sbit DIR1=P34; sbit DIR2=P36; sbit CP1=P35;sbit CP2=P37;/*定义端口*/sbit RS=P23; sbit RW=P22; sbit E=P21; sbit PSB=P20;sbit buttonadd=P10;sbit buttondire=P11;sbit buttonenter=P13;/*定义数据*/unsigned char code show228=0xc9,0xe8,0xb6,0xa8,0x3a,0x20,0x20,0x20; unsigned char code show2218=0xd7,0xd4,0xb6,0xa8,0xd2,0xe5,0x31,0x20; unsigned char code show2228=0xd7,0xd4,0xb6,0xa8,0xd2,0xe5,0x32,0x20; unsigned char code show2238=0xd4,0xb2,0xd6,0xdc,0x20,0x20,0x20,0x20; unsigned char code show2248=0xb6,0xa8,0xb5,0xe3,0x20,0x20,0x20,0x20; unsigned char code show2258=0xc8,0xce,0xd2,0xe2,0x20,0x20,0x20,0x20; unsigned char code show2329=0xd7,0xf8,0xb1,0xea,0xc9,0xe8,0xb6,0xa8,0x3a;unsigned char code show2319=0xd4,0xb2,0xd0,0xc4,0xc9,0xe8,0xb6,0xa8,0x3a;unsigned char code show242=0x58,0x59,; /*函数原型说明*/void LCDinit();void writedata(unsigned char da);void LCDwritedata(unsigned char change,unsigned char n); void LCDwritecmd(unsigned char cmd);void LCDwait();void LCDlocate(unsigned char pox,unsigned char poy);void delay400ms();void delay1s();void delay100us();void delay100ms(void);void delayms(unsigned char k);void wait(); void JumpTo(unsigned char n);void oneadd(void);void showxy(void);void LCDdisp(unsigned int pox,unsigned int poy);void showxy1(unsigned char pox,unsigned char poy);unsigned char code offset50=1,4,6,9,11,13,16,19,20,23,26,28,30,32,34,37,39,41,43,45,48,49,51,53,54,57,58,59,62,63,64,65,67,69,69,71,71,73,71,76,76,75,77,76,78,78,78,78,78,79;unsigned int l1,l2,l3,l4,nowx,nowy,nextx,nexty,l11,l22;unsigned int times1,times2;unsigned char s,i,flag;bit last,drawflag;unsigned char placeflag,moveflag,aimx,aimy;void move(unsigned int pox,unsigned int poy);void startmotor(unsigned int lx,unsigned int ly);void inter1(void);void circle(unsigned char centx,unsigned char centy);void calculate(unsigned int nowx,unsigned int nowy);void defmove1(void);void defmove2(void);void beeline(unsigned int pox,unsigned int poy);void arc(unsigned char n);/*主函数*/void main(void) unsigned char data moveflag=1; unsigned int j;unsigned char n; delay100ms();LCDinit();delay400ms();LCDlocate(1,3); LCDwritedatashow11,8);LCDlocate(2,1);LCDlocate(3,1);LCDwritedata(show12,16);LCDlocate(4,3);LCDwritedata(show13,8); delay1s(); times1=0;times2=0;moveflag=0;nowx=7500;nowy=5000;drawflag=0;last=0;/CP1=0;CP2=0;/l1=sqrt(float)(1500+nowx)*(1500+nowx)+(float)(11500-nowy)*(11500-nowy);l2=sqrt(float)(9500-nowx)*(9500-nowx)+(float)(11500-nowy)*(11500-nowy);IE=0X83;TCON=0X08;TMOD=0X01;TH0=0XF8;TL0=0X2F; LCDwritecmd(0x01); LCDwritedata(show21,16); /circle(5000,5000);/while(1); LCDlocate(2,1); LCDwritedata(show22,8); LCDlocate(2,5); LCDwritedata(show221,7); LCDdisp(nowx/10,nowy/10); moveflag=1; drawflag=0;while(1) /*选择运动模式*/ while(1) if(buttonadd=0) delayms(10); if(buttonadd=0) moveflag+; if(moveflag=6)moveflag=1; if(buttonenter=0) delayms(10); if(buttonenter=0)break; LCDlocate(2,5); switch(moveflag) case 1: LCDwritedata(show221,8); break; case 2: LCDwritedata(show222,8); break; case 3: LCDwritedata(show223,8); break; case 4: LCDwritedata(show224,8); break; default: LCDwritedata(show225,8); break; /*执行运动*/ switch(moveflag)case 1: defmove1(); break; case 2: defmove2(); break; case 3: unsigned char j;LCDwritecmd(0x0f); LCDlocate(3,1); LCDwritedata(show231,9); showxy(); LCDwritecmd(0x10); JumpTo(5); placeflag=1; oneadd(); JumpTo(5); placeflag=0; oneadd(); JumpTo(3); placeflag=4; oneadd(); JumpTo(2); placeflag=3; oneadd(); LCDwritecmd(0x10); placeflag=2; last=1; oneadd(); circle(aimx,aimy); aimx=0; aimy=0; LCDlocate(3,1); for(j=0;j16;j+)writedata(0x20); LCDlocate(4,1); for(j=0;j16;j+)writedata(0x20); break; case 4: LCDwritecmd(0x0f); LCDlocate(3,1); LCDwritedata(show232,9); showxy(); LCDwritecmd(0x10); JumpTo(5); placeflag=1; oneadd(); JumpTo(5); placeflag=0; oneadd(); JumpTo(3); placeflag=4; oneadd(); JumpTo(2); placeflag=3; oneadd(); LCDwritecmd(0x10); placeflag=2; oneadd(); beeline(aimx*100,aimy*100); aimx=0; aimy=0; LCDlocate(3,1); for(j=0;j16;j+)writedata(0x20); LCDlocate(4,1); for(j=0;j16;j+)writedata(0x20); break; default:break; /*LCD初始化*/void LCDinit() PSB=0;delay400ms(); PSB=1; delay400ms();LCDwritecmd(0x30);delay100us(); LCDwritecmd(0x0c);delay100us(); LCDwritecmd(0x01);delay100us(); LCDwritecmd(0x06); delay100us(); /*向LCD写一个字节数据*/void writedata(unsigned char da) wait();RS=1;RW=0;P0=da;E=1;E=0;void LCDwritedata(unsigned char show,unsigned char n) unsigned char i; for(i=0;i0;a-)for(j=7269;j0;j-);void delay1s()unsigned int data a,j;for(a=100;a0;a-)for(j=1000;j0;j-);void delay100us()unsigned char j;for(j=10;j0;j-);void delayms(unsigned char k)unsigned int data a,j;for(a=0;aj;a+)for(j=0;j100;j+) ;void delay100ms(void)unsigned int j;for(j=0;j10000;j+);void JumpTo(unsigned char n) unsigned char j;for(j=0;j80) aimx=1; if(placeflag=1) aimx+=10; if(aimx80) aimx-=80; if(placeflag=2) aimy+; if(aimy100) aimy=0; if(placeflag=3) aimy+=10; if(aimy100) aimy-=100; if(placeflag=4) aimy+=100; if(aimy100) aimy-=100; if(aimy=200) aimy-=200; change=1; if(change) showxy1(aimx,aimy); if(buttonenter=0) delayms(10); if(buttonenter=0) change=0; showxy1(aimx,aimy); if(last) LCDwritecmd(0x0c);last=0; break; void LCDdisp(unsigned int pox,unsigned int poy)unsigned char j,num3;for(j=2;j=0;j-)numj=pox%10+0x30;pox/=10;if(j=0) break;for(j=0;j=1;j+) if(numj!=0x30) break; LCDlocate(1,4);if(j=2) writedata(0x30); else for(;j=0;j-)numj=poy%10+0x30;poy/=10;if(j=0) break;for(j=0;j=1;j+) if(numj!=0x30) break;writedata(0x20);writedata(0x59);if(j=2) writedata(0x30); else for(;j=1;j+) writedata(numj); writedata(0x2e); writedata(num2); void showxy(void) unsigned char j; LCDlocate(4,2); writedata(show240); for(j=0;j2;j+) writedata(0X20); writedata(0X30); for(j=0;j2;j+) writedata(0X20); writedata(show241); for(j=0;j=0;j-)num1j=pox%10+0x30;pox/=10;if(j=0) break;for(j=2;j=0;j-)num2j=poy%10+0x30;poy/=10;if(j=0) break; LCDlocate(4,1); writedata(0x20); writedata(0x20); writedata(show240); for(j=0;j2;j+) writedata(0X20); writedata(num1j); for(j=0;j2;j+) writedata(0X20); writedata(show241); for(j=0;jl3) l1=l1-l3; DIR1=1; /DIR1=1; shouelse l1=l3-l1; DIR1=0; /fang if(l2l4) l2=l2-l4; DIR2=0; /shouelsel2=l4-l2;DIR2=1; /fangstartmotor(l1,l2);l11=l1;l22=l2;l1=l3;l2=l4/*电动机运转函数*/void startmotor(unsigned int lx,unsigned int ly)times1=lx/(float)(c)*400;times1=4*times1;times2=ly/(float)(c)*400;times2=4*times2;TH0=0XF8;TL0=0X2F;TR0=1; /*定时中断函数*/void inter1(void) interrupt 1TH0=0XF8;TL0=0X2F;if(times1)CP1=!CP1;times1-;if(times2)CP2=!CP2;times2-;if(!times1&!times2) TR0=0;times1=0;times2=0;drawflag=1;/*画圆函数*/void circle(unsigned char cx,unsigned char cy)unsigned int centx,centy;centx=cx*100;centy=cy*100;nowx=centx+2500;nowy=centy;s=0;i=0;flag=0;l1=sqrt(float)(1500+nowx)*(1500+nowx)+(float)(11500-nowy)*(11500-nowy);l2=sqrt(float)(9500-nowx)*(9500-nowx)+(float)(11500-nowy)*(11500-nowy);while(1)calculate(nowx,nowy); move(nextx,nexty); while(!drawflag); drawflag=0; nowx=nextx; nowy=nexty; LCDdisp(nowx/10,nowy/10); if(s=200)s=0; break; times1=0;times2=0;/*计算圆的下一个坐标函数*/void calculate(unsigned int nowx1,unsigned int nowy1)s+;if(!flag)nextx=nowx1-offseti;nexty=nowy1+offset49-i;if(flag=1)nextx=nowx1-offset49-i; nexty=nowy1-offseti;if(flag=2) nextx=nowx1+offseti; nexty=nowy1-offset49-i;if(flag=3) nextx=nowx1+offset49-i; nexty=nowy1+offseti;i+; if(i49) flag+; i=0;if(flag3) flag=0;void beeline(unsigned int pox,unsigned int poy) unsigned int steps,j,step,hoh,coh;if(poxnowx)hoh=pox-nowx;else hoh=nowx-pox;if(poynowy)coh=poy-nowy;else coh=nowy-poy;if(hohcoh)steps=hoh/100;step=coh/steps;else steps=coh/100;step=hoh/steps;for(j=0;jcoh)if(poxnowx)&(poynowy) nextx=nowx+100;nexty=nowy+step;if(poxnowx)&(poy=nowy) nextx=nowx+100;nexty=nowy-step;if(poxnowy) nextx=nowx-100;nexty=nowy+step;if(pox=nowx)&(poynowx)&(poynowy) nexty=nowy+100;nextx=nowx+step;if(poxnowx)&(poy=nowy) nexty=nowy-100;nextx=nowx+step;if(poxnowy) nexty=nowy+100;nextx=nowx-step;if(pox=nowx)&(poy=n)s=0; break; times1=0;times2=0; 参考文献:1 梅遂生 . 杨家德 , 光电子技术信息装备的新秀M. 北京:国防工业出版社 . 1999 2 张友德 . 赵志英 .涂时亮 , 单片机微型机原理应用与实验(第三版)M. 上海:复旦大学出版社 . 2000 3 黄智伟 , 全国大学生电子设计竞赛训练教程 M. 北京:电子工业出版社. 20054 罗亚非 , 凌阳 16 位单片机应用基础 M. 北京:北京航空航天大学出版社 .2005 5 薛钧义 , 凌阳 16 位单片机原理及应用 M. 北京:北京航空航天大学出版社 .2003 6 何希才, 电动机控制电路应用电路实例 M .北京:中国电力出版社 .2005
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!