《悬挂运动控制系统毕业设计.doc》由会员分享,可在线阅读,更多相关《悬挂运动控制系统毕业设计.doc(28页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、悬挂运动控制系统摘要本系统以msp430(MSP430F22X4)单片机为核心作为悬挂运动控制的系统,实现了键盘输入识别、传感器信号采集、电机驱动电路控制等功能。根据物体在平面任一处两端吊绳的长度唯一确定的原理,通过单片机编程控制电机转动带动吊绳伸长或缩短,实现物体沿任意设定轨迹运动。引导部分用反射式红外传感器探测板面黑线,信息送入单片机处理后,控制物块沿黑线前进。以完成到达任意预设坐标,沿自行设定轨迹运动,以板上任意处为圆心画直径为50cm的圆和寻黑线前进任务。关键词: msp430(MSP430F22X4) 步进电机 红外传感器AbstractThe system to msp430 (M
2、SP430F22X4) microcontroller as the core as the hoisting of the movement control system, the keyboard input to achieve recognition, sensors signal acquisition, motor drive circuit control, and other functions. According to the objects in a flat at both ends of Diaosheng only determine the length of t
3、he principles of programming through the MCU control motor driven rotational Diaosheng elongate or shorten, and objects along the arbitrary tracking movement. Reflective of the guide with infrared sensors detect board black line, processing the information into the microcontroller, control of block
4、along the black line forward. To complete the landing coordinates of any default, set your own path along the campaign to the board for the center of arbitrary diameter of 50 cm painting of the circle and look forward line and tasks.Key words: msp430(MSP430F22X4) step-motor infrared wave sensor一、系统方
5、案选择与论证根据设计要求,系统可分为控制部分和信号检测部分。其中信号检测部分通过传感器检测黑色轨迹,并将信号传回控制器处理。控制部分的作用是接受并处理键盘输入的控制信号以及检测信号,通过控制电机的转动改变吊绳长度,从而控制悬挂物体的运动,并将物体坐标实时显示出来,系统框图如图1所示。图1 系统框图系统分为控制器模块,物体轨迹检测模块,键盘输入模块,显示模块,电机驱动模块。(1) 控制器模块方案一:采用FPGA作为系统的控制器。FPGA可以实现各种复杂的逻辑功能,所有器件集中在一块芯片上,体积小,稳定性高。同时FPGA可用EDA软件仿真调试,易于进行功能扩展,但由于系统对数据处理的要求不高,而F
6、PGA引脚较多,步线复杂,成本也偏高。方案二:采用单片机作为控制器。单片机使用简单,软件编程灵活。选用msp430(MSP430F22X4)单片机作为核心器件。该单片机具有高速的运算能力以及含有丰富的功能模块,例如:多通道1014位AD转换器,双路12位DA转换器,比较器,看门狗定时器和多个16位,8位定时器(可进行捕获,比较,PWM输出)以及FALASH存储器,他可以在运行过程中由程序控制写操作和段擦除(In system programmable),不需要额外的高电压等,软件编程灵活,自由度大,可用软件编程实现各种算法和逻辑控制。综上比较,选择方案二。(2)执行电机根据题目的要求,我们选用
7、了步进电机,因为本系统要求电机能实现精确的位置控制,若采用直流电机,只能通过软件算法,调节占空比。但占空比与电机速度的准确关系不易掌握,控制精度不够高。由于步进电机的步距角一定,控制输入步进电机的脉冲数就可以精确控制步进电机的角度,从而精确控制物体的位置。(3)电机驱动模块方案一:用三极管和与门等简单的元器件设计H桥式电机控制电路。该方案涉及的元件简单,设计方便,然而其通断速率可能受到元件反映速率的影响,且不能驱动较大电流的电机。方案二:采用步进电机专用驱动芯片LM298N。芯片内含两个H桥式电机驱动电路,其优点在于驱动电流大,工作稳定。综上比较,选择方案二。二、主要电路设计本系统采用单片机作
8、为控制核心,对键盘输入的控制信号和传感器送来的信号进行分析处理,然后控制画笔在画板上运动,并通过LED数码管显示各种界面的输出数据。本系统主要的单元电路有步进电机驱动电路、物体寻轨检测电路、键盘及LED显示接口电路。1. 步进电机驱动电路及接口电路的设计系统需要控制两个步进电机的运动,则需要两个独立的L298N驱动电路分别驱动两个步进电机。L298N驱动电路如图2所示。IN1IN4接单片机I/O口,OUT1 OUT4分别接步进电机4相输入引线,ENA和ENB为使能端,接高电平允许。步进电机另外两条中间抽头悬空。另外,在L298N外围还接了8个续流二极管,起保护电机的作用。图2 步进电机驱动电路
9、2. 物体寻轨检测电路的设计光电传感器检测电路如图3所示。当传感器位于白纸上时,输出为低电平;当传感器位于黑线上时,输出为高电平。因此,当传感器由白纸运动到黑线或是黑线运动到白纸上时,电平会发生变化。单片机接收到这些脉冲信号并作相应的处理,从而控制重物寻轨运动。由于8个光电传感器的灵敏度可能不一致,即当外界光源或传感器离画板距离变化时,8个光电传感器检测出的信号不统一,故每个传感器电路中都加上一个运放作为比较器,并通过滑动电阻器改变比较电压,这样,可由试验调整8个光电传感器的灵敏度,使之统一。图3 光电传感器检测电路3. 键盘及LED显示接口电路的设计本系统采用4*4矩阵式键盘,处理方式采用行
10、扫描法来识别键是否按下。程序可以通过外部中断来进行键盘输入的控制。LED电视接口电路的设计:本系统采用2个四位一体数码管和两个74HS138构成显示部分,能够达到题目的要求。三、系统的软件设计本系统以msp430单片机为控制器,采用C语言对单片机进行编程。主程序主要起导向和决策的作用,它控制整个系统协调稳定的运作,系统各种功能主要通过调用具体的子程序来实现。系统中的其他子程序有:键盘扫描程序,数码管显示程序,延时程序,步进电机转动控制程序。图4 系统总流程图控制算法分析:控制算法中,我们选择的是数学建模法。数学建模法是指用数学方法,运用几何知识(极坐标)把圆上的点和两个电机所在的位置联系起来,
11、通过相关计算把圆上的点的坐标用数学表达式表示出来,并转换成电机所要转动的偏移量,最后把偏移量转化为电机所要转的速度。此方法,计算复杂,但所得数据较为准确,只要编程正确,用电机所画出来的线就不会偏差大。(1)直线的计算从右图我们可以看到假设原点坐标X0,Y0,要达到的坐标点X1,Y1,那么到坐标点的距离:我们没有采用Y=Kx+B的直线方程,而是把L的长度分为等分。然后计算出每一个增量INC_X,INC_Y。即 我们假设一个变量i,i的范围从1-COUNT_L,所以每走一步的坐标值 (2)圆的的计算在圆弧的编程中,它的算法比直线的算法更复杂.从图我们可以看到假设圆心坐标X0,Y0,半径为R,圆上的
12、一点坐标为XQ,YQ。即:(XQ=X0+R,YQ=Y0)而我们把圆分成360,即设一个变量i,i的范围从1到360,每走一小步的坐标值XX,YY。 那么它的力臂LL,LR 而原点坐标的力臂LL0,LR0因此力臂的增量为LL,LR 因我们的步进不同,所以它的增量分别为0.026,0.026,最后才计算出要给的脉冲数COUNT_L,COUNT_R 四、系统测试在底板上覆上厘米方格纸,对准坐标,设定不同的圆心及起始点坐标,分别进行圆周直线的绘图测试。测试仪器:米尺,秒表,以及必要的仪表。(1)测量设置坐标点参数功能和定点运动纪录数据见表一原点坐标(X,Y)输入坐标(X,Y)实际测量距离/cm误差值/
13、cm运行时间/s(30,30)(40,30)9.90.111(40,30)(50,40)14.10.315(50,40)(30,20)28.2020(2)测量圆周运动纪录的数据见表二圆心坐标/cm实际圆心坐标/cm半径最大偏差/cm运行时间/s(40,50)(39,50)0.921(50,40)(50,40)016时实显示当前坐标位置能够精确的显示当前坐标。五、总结通过控制步进电机转动角度以改变吊绳长度来实现对物体位置的控制,完成了系统基础部分和部分发挥部分的性能要求。在系统设计过程中,硬件线路简单,充分发挥软件编程方便灵活的特点,调试过程中详细分析系统可能的误差来源,并通过软件算法对误差进行
14、补偿,以满足系统设计要求。画圆时误差范围在题目给定范围之内,从原点开始运动时终点与任意设定的目标点的偏差均不超过1cm。通过本次训练,也让我们对电机控制有了新的了解,也从程序的算法中获得了相应的知识。参考文献全国大学生电子设计竞赛组委会.全国大学生电子设计竞赛获奖作品选编(2005).北京理工大学出版社.2007.02悬挂运动控制系统中的循环算法研究.唐涛,刘波,袁磊.文章编号:1006-2475(2008)01-0048-04悬挂运动控制系统设计.刘华章,张晨亮,唐建华.海军航空工程学院学报.2006年5月第21卷 第3期附录:1.总图2.详细流程图: 直线函数的流程图 画圆函数的流程图3.
15、源程序/*File name: 悬挂运动控制系统Processor: msp430f2274Description: 本系统用于悬挂物体运动 接口安排: P4 - 电机(两个步进电机) P3 - 键盘(4*4) P1.0P1.3和P2.0P2.3 - 数码管(8位)(单4拍) (左电机):P4.0P P4.3 - A B C D (右电机):P4.4P4.7 - A B C D (双4拍) */#include#include#include#define uchar unsigned char #define uint unsigned int #define KEYDIR P3DIR /键
16、盘接口P3#define KEYIN P3IN#define KEYOUT P3OUT #define step_l 0.04475 /左步进电机每步弧长(厘米)(即每一个脉冲,步进电机能够带动绳子变化的长度)#define step_r 0.04475 /右步进电机每步弧长(厘米)#define pai 3.14159uchar B1,B2; /B1,B2:左,右电机相位计数变量uint xshi,xge,yshi,yge; /实时显示X,Y坐标 uchar Position; /控制数据输入,Position不断变化,则输入值也应不断变化uchar model; /工作模式变量 ,1_画直
17、线,2_画圆uchar X11,X12,Y11,Y12; /第一点座标 (每一个坐标为两位)uchar X21,X22,Y21,Y22; /第二点座标float line_point4; /直线的座标float circle_point3; /圆心的座标uint x_zuobiao,y_zuobiao; /时时显示横纵坐标值uchar forl=0; /马达放松或收紧,0放松,uchar ctrl_edit=0; /以此标志判断是选择工作方式还是输入数据,0是选择模式,1是输入数据/uchar table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f
18、,0x90;uchar table10 =0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9;void Delay5Ms(void);void delay(unsigned time);void kbscan (void);void delays(void); float utof(uchar,uchar);void motor_r_frap();void motor_r_loosen();void motor_l_loosen();void motor_l_frap();void drive_motor(int,int);void draw_l
19、ine(float,float,float,float);void draw_circularity(float,float,float);void key_pass(uchar);/*主函数部分*/main( void ) / WDTCTL =WDTPW+WDTCNTCL; /看门狗模式,定时时间为32ms WDTCTL=WDTPW+WDTHOLD; /关看门狗 BCSCTL1 =CALBC1_1MHZ; /设定DCO 为1MHZ DCOCTL =CALBC1_1MHZ; P1DIR =0xff; /P1口接数码管 P2DIR =0xff; /P2口低四位用于数码管片选 P4DIR =0xf
20、f; /P4口接电机 TACTL=TASSEL1+TACLR; /定时器A 时钟源为SMCLK,并清TAR CCTL0 |=CCIE; /CCR0 中断使能 CCR0 =15000; /计数值为15000 个SMCLK 周期,即15ms TACTL |=MC0; /启动定时器A 为增计数模式 B1=1;B2=1; /电机驱动初始化 / P4OUT=0x33; /左右电机相序初始化(以双4拍运行) P1OUT =0xf3; P2OUT =0xf3; X11=0; X12=0; /坐标初始化 Y11=0; Y12=0; X21=0; X22=0; Y21=0; Y22=0; Position=1;
21、 model=1; / 初始状态为模式1 _EINT(); /开中断 while(1) kbscan(); /无键按下,则等待 /*键盘延时函数,消抖*/void delays(void) /510ms uint n; for(n=14000;n0;n-);/void kbscan (void) / 4X4键盘扫描显示 uchar x=40,row=0x0e,n; KEYDIR=0xff; KEYOUT=0xf0; KEYDIR=0x0f; KEYOUT=0xf0; if(KEYIN&0xf0)!=0xf0) delays(); if(KEYIN&0xf0)!=0xf0) /如果真的有键按下
22、for(n=0;n4;n+) KEYOUT=row; if(KEYIN&0xf0)=0xe0) x=4*n+0; else if(KEYIN&0xf0)=0xd0) x=4*n+1; else if(KEYIN&0xf0)=0xb0) x=4*n+2; else if(KEYIN&0xf0)=0x70) x=4*n+3; row=(row1)&0x0f)|0x01; key_pass(x); / WDTCTL =WDTPW+WDTCNTCL; /看门狗定时器清零 /*廷时5ms*/void Delay5Ms(void) /用于按键松开后的去抖 uint i; for(i=0;i1000;i+)
23、 ;/*用于电机速度控制*/void delay(unsigned time)while(time-);/*将二个uchar型转换成一个float*/float utof(uchar c11,uchar c12) float f11=(float)c11,f12=(float)c12; float n=f11*10+f12; return n;/*右马达收紧线*/ /绕线不同,即可达到改变方向的目地void motor_r_frap() B2-; if(B2=0) B2=4; switch (B2) /p4高四位控制右边电机 /* case 1: P4OUT |=0x10; P4OUT &=0
24、x1f; delay(3000); break; /A=1 case 2: P4OUT |=0X20; P4OUT &=0x2f; delay(3000); break; /B=1 case 3: P4OUT |=0X40; P4OUT &=0x4f; delay(3000); break; /C=1 case 4: P4OUT |=0X80; P4OUT &=0x8f; delay(3000); break; /D=1*/ case 1: P1OUT |=0x03; P1OUT &=0xf3; delay(2000); break; /4-1 case 2: P1OUT |=0x06; P1
25、OUT &=0xf6; delay(2000); break; case 3: P1OUT |=0x0c; P1OUT &=0xfc; delay(2000); break; case 4: P1OUT |=0x09; P1OUT &=0xf9; delay(2000); break; /*右马达松开线*/void motor_r_loosen() B2+; if(B2=5) B2=1; switch (B2) /根据电机线的接法来赋值 /*case 1: P4OUT |=0x80; P4OUT &=0x8f; delay(3000); break; case 2: P4OUT |=0x40;
26、 P4OUT &=0x4f; delay(3000); break; case 3: P4OUT |=0x20; P4OUT &=0x2f; delay(3000); break; case 4: P4OUT |=0x10; P4OUT &=0x1f; delay(3000); break;*/ case 1: P1OUT |=0x03; P1OUT &=0xf3; delay(2000); break; /1-4 case 2: P1OUT |=0x06; P1OUT &=0xf6; delay(2000); break; case 3: P1OUT |=0x0c; P1OUT &=0xfc
27、; delay(2000); break; case 4: P1OUT |=0x09; P1OUT &=0xf9; delay(2000); break; /*左马达松开线*/void motor_l_loosen() B1-; if(B1=0) B1=4; switch (B1) /p4低四位控制左边电机 /*case 1: P4OUT |=0x01; P4OUT &=0xf1; delay(3000); break; /A=1 case 2: P4OUT |=0x02; P4OUT &=0xf2; delay(3000); break; /B=1 case 3: P4OUT |=0x04;
28、 P4OUT &=0xf4; delay(3000); break; /C=1 case 4: P4OUT |=0x08; P4OUT &=0xf8; delay(3000); break; /D=1*/ /4-1 case 1: P2OUT |=0x03; P2OUT &=0xf3; delay(2000); break; /双四拍 case 2: P2OUT |=0x06; P2OUT &=0xf6; delay(2000); break; case 3: P2OUT |=0x0c; P2OUT &=0xfc; delay(2000); break; case 4: P2OUT |=0x0
29、9; P2OUT &=0xf9; delay(2000); break; /*左马达收紧线*/void motor_l_frap() B1+; if(B1=5) B1=1; switch (B1) /* case 1: P4OUT |=0x08; P4OUT &=0xf8; delay(3000); break; case 2: P4OUT |=0x04; P4OUT &=0xf4; delay(3000); break; case 3: P4OUT |=0x02; P4OUT &=0xf2; delay(3000); break; case 4: P4OUT |=0x01; P4OUT &=
30、0xf1; delay(3000); break; /1-4 case 1: P2OUT |=0x03; P2OUT &=0xf3; delay(2000); break; case 2: P2OUT |=0x06; P2OUT &=0xf6; delay(2000); break; case 3: P2OUT |=0x0c; P2OUT &=0xfc; delay(2000); break; case 4: P2OUT |=0x09; P2OUT &=0xf9; delay(2000); break; /*驱动电机*/void drive_motor(int c_l,int c_r) /c_
31、l和c_r为步进脉冲数 int j; for(j=0;jabs(c_l)|jabs(c_r);j+) /每次给一个脉冲,循环j=c_l或j=c_r次后到达预期的距离 if(j0) motor_l_loosen(); /左马达松开线(一个步进) if(c_l0) motor_l_frap(); /左马达收紧线 if(j0) motor_r_loosen(); /右马达松开线 if(c_r0) motor_r_frap(); /右马达收紧线 /*画直线*/void draw_line(float x0,float y0,float x1,float y1) /(x0,y0):起点坐标,(x1,y1
32、):停止点坐标float ll,inc_x,inc_y,xx,yy,L_l0,L_r0,L_l,L_r,inc_Ll,inc_Lr ; /kk:斜率 cc:初点始常数(yy=kk*xx+cc) int count_ll,count_l,count_r,i ; /(x0,y0):画直线起点坐标 ll=sqrt(x1-x0)*(x1-x0)+(y1-y0)*(y1-y0) ; /ll:斜边长度,待画直线长度 count_ll=(int)(ll/0.5+0.5) ; /count_ll:把ll的长度分为count_ll等份 (其中0.5不影响长度,只影响精度) inc_x=(x1-x0)/count
33、_ll ; / 沿X,Y方向上,分为count_ll等分,每一份的距离 inc_y=(y1-y0)/count_ll ; L_l0=sqrt(x0+15)*(x0+15)+(75-y0)*(75-y0) ; /L1,L2的长度 L_r0=sqrt(95-x0)*(95-x0)+(75-y0)*(75-y0) ; for(i=1; i=count_ll; i+) xx=inc_x*i+x0 ; / xxx=xx ; X,Y不断行走后的坐标(不断变化) yy=inc_y*i+y0 ; x_zuobiao=(uint)xx; y_zuobiao=(uint)yy; xshi= x_zuobiao/10; xge = x_zuobiao%10; yshi = y_zuobiao/10; yge = y_zuobiao%10;