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软件仿真调试,
6、易于进行功能扩展,但由于系统对数据处理的要求不高,而FPGA引脚较多,步线复杂,成本也偏高。方案二:采用单片机作为控制器。单片机使用简单,软件编程灵活。选用msp430(MSP430F22X4)单片机作为核心器件。该单片机具有高速的运算能力以及含有丰富的功能模块,例如:多通道1014位AD转换器,双路12位DA转换器,比较器,看门狗定时器和多个16位,8位定时器(可进行捕获,比较,PWM输出)以及FALASH存储器,他可以在运行过程中由程序控制写操作和段擦除(In system programmable),不需要额外的高电压等,软件编程灵活,自由度大,可用软件编程实现各种算法和逻辑控制。综上比
7、较,选择方案二。(2)执行电机根据题目的要求,我们选用了步进电机,因为本系统要求电机能实现精确的位置控制,若采用直流电机,只能通过软件算法, ,调节占空比。但占空比与电机速度的准确关系不易掌握,控制精度不够高。由于步进电机的步距角一定,控制输入步进电机的脉冲数就可以精确控制步进电机的角度,从而精确控制物体的位置。(3)电机驱动模块方案一:用三极管和与门等简单的元器件设计H桥式电机控制电路。该方案涉及的元件简单,设计方便,然而其通断速率可能受到元件反映速率的影响,且不能驱动较大电流的电机。方案二:采用步进电机专用驱动芯片LM298N。芯片内含两个H桥式电机驱动电路,其优点在于驱动电流大,工作稳定
8、。综上比较,选择方案二。二、主要电路设计本系统采用单片机作为控制核心,对键盘输入的控制信号和传感器送来的信号进行分析处理,然后控制画笔在画板上运动,并通过LED数码管显示各种界面的输出数据。本系统主要的单元电路有步进电机驱动电路、物体寻轨检测电路、键盘及LED显示接口电路。1. 步进电机驱动电路及接口电路的设计系统需要控制两个步进电机的运动,则需要两个独立的L298N驱动电路分别驱动两个步进电机。L298N驱动电路如图2所示。IN1IN4接单片机I/O口,OUT1 OUT4分别接步进电机4相输入引线,ENA和ENB为使能端,接高电平允许。步进电机另外两条中间抽头悬空。另外,在L298N外围还接
9、了8个续流二极管,起保护电机的作用。图2 步进电机驱动电路2. 物体寻轨检测电路的设计光电传感器检测电路如图3所示。当传感器位于白纸上时,输出为低电平;当传感器位于黑线上时,输出为高电平。因此,当传感器由白纸运动到黑线或是黑线运动到白纸上时,电平会发生变化。单片机接收到这些脉冲信号并作相应的处理,从而控制重物寻轨运动。由于8个光电传感器的灵敏度可能不一致,即当外界光源或传感器离画板距离变化时,8个光电传感器检测出的信号不统一,故每个传感器电路中都加上一个运放作为比较器,并通过滑动电阻器改变比较电压,这样,可由试验调整8个光电传感器的灵敏度,使之统一。图3 光电传感器检测电路3. 键盘及LED显
10、示接口电路的设计本系统采用4*4矩阵式键盘,处理方式采用行扫描法来识别键是否按下。程序可以通过外部中断来进行键盘输入的控制。LED电视接口电路的设计:本系统采用2个四位一体数码管和两个74HS138构成显示部分,能够达到题目的要求。三、系统的软件设计本系统以msp430单片机为控制器,采用C语言对单片机进行编程。主程序主要起导向和决策的作用,它控制整个系统协调稳定的运作,系统各种功能主要通过调用具体的子程序来实现。系统中的其他子程序有:键盘扫描程序,数码管显示程序,延时程序,步进电机转动控制程序。开始设置当前坐标检测键盘寻坐标 ?自定义 ?画圆 ?寻黑线 ?输入目标坐标输入运行轨迹输入圆心输入
11、黑线子程序坐标合理 ?进入画圆子程序进入坐标子程序进入自定义曲线子程序YNYYYYNNNN图4 系统总流程图控制算法分析:控制算法中,我们选择的是数学建模法。数学建模法是指用数学方法,运用几何知识(极坐标)把圆上的点和两个电机所在的位置联系起来,通过相关计算把圆上的点的坐标用数学表达式表示出来,并转换成电机所要转动的偏移量,最后把偏移量转化为电机所要转的速度。此方法,计算复杂,但所得数据较为准确,只要编程正确,用电机所画出来的线就不会偏差大。(1)直线的计算从右图我们可以看到假设原点坐标X0,Y0,要达到的坐标点X1,Y1,那么到坐标点的距离: 201201)()(yxL我们没有采用Y=Kx+
12、B的直线方程,而是把L的长度分为 等分。5._COUNT然后计算出每一个增量INC_X,INC_Y。 ( X0, Y0) XY( X1, Y1)L的 直 线即 LCOUNTXI_01LCOUNTYI_01我们假设一个变量i,i的范围从1-COUNT_L,所以每走一步的坐标值0*Ii0*Ii(2)圆的的计算在圆弧的编程中,它的算法比直线的算法更复杂.从图我们可以看到假设圆心坐标X0,Y0,半径为R,圆上的一点坐标为XQ,YQ。即:(XQ=X0+R,YQ=Y0)而我们把圆分成360,即设一个变量i,i的范围从1到360,每走一小步的坐标值XX,YY。0)*18cos(xiX0)*18sin(yiR
13、Y那么它的力臂LL,LR22)5()15(yxL 22)15()95(yxLR而原点坐标的力臂LL0,LR0 2020)15()(yx9LR因此力臂的增量为LL,LR0因我们的步进不同,所以它的增量分别为0.026,0.026,最后才计算出要给的脉冲数COUNT_L,COUNT_R039._LCOUNT078._LRCOUNT四、系统测试在底板上覆上厘米方格纸,对准坐标,设定不同的圆心及起始点坐标,分别进行圆周直线的绘图测试。测试仪器:米尺,秒表,以及必要的仪表。(1)测量设置坐标点参数功能和定点运动纪录数据见表一原点坐标(X,Y) 输入坐标(X,Y) 实际测量距离/cm 误差值/cm 运行时
14、间/s(30,30) (40,30) 9.9 0.1 11(40,30) (50,40) 14.1 0.3 15(50,40) (30,20) 28.2 0 20( X0, Y0) YXXQ, YR(2)测量圆周运动纪录的数据见表二圆心坐标/cm 实际圆心坐标/cm 半径最大偏差/cm 运行时间/s(40,50) (39,50) 0.9 21(50,40) (50,40) 0 16时实显示当前坐标位置能够精确的显示当前坐标。五、总结通过控制步进电机转动角度以改变吊绳长度来实现对物体位置的控制,完成了系统基础部分和部分发挥部分的性能要求。在系统设计过程中,硬件线路简单,充分发挥软件编程方便灵活的
15、特点,调试过程中详细分析系统可能的误差来源,并通过软件算法对误差进行补偿,以满足系统设计要求。画圆时误差范围在题目给定范围之内,从原点开始运动时终点与任意设定的目标点的偏差均不超过1cm。通过本次训练,也让我们对电机控制有了新的了解,也从程序的算法中获得了相应的知识。参考文献全国大学生电子设计竞赛组委会.全国大学生电子设计竞赛获奖作品选编(2005).北京理工大学出版社.2007.02悬挂运动控制系统中的循环算法研究.唐涛,刘波,袁磊.文章编号:1006-2475(2008)01-0048-04悬挂运动控制系统设计.刘华章,张晨亮,唐建华.海军航空工程学院学报.2006年5月第21卷 第3期附
16、录:1.总图2.详细流程图:开始计算直线长度 L输入两点坐标( X 0 , Y 0 )计算直线以 0 . 5 等分计算出步数 c o u n t _ L计算出 x 轴 y 轴的增量I N C _ X , I N C _ Y计算 ( x 0 , y 0 ) 对应的两条线的长度计算出第 i 步的坐标并转换成对应的长度L _ 1 , L _ r计算输送给电机的脉冲驱动电机转动I #include#include#define uchar unsigned char #define uint unsigned int #define KEYDIR P3DIR /键盘接口P3#define KEYIN
17、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_画直线,2_画圆uchar X11,X12,Y
18、11,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,0x90;uchar table10 =
19、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_line(float,float,float
20、,float);void draw_circularity(float,float,float);void key_pass(uchar);/*主函数部分*/main( void )/ WDTCTL =WDTPW+WDTCNTCL; /看门狗模式,定时时间为32msWDTCTL=WDTPW+WDTHOLD; /关看门狗BCSCTL1 =CALBC1_1MHZ; /设定DCO 为1MHZDCOCTL =CALBC1_1MHZ;P1DIR =0xff; /P1口接数码管P2DIR =0xff; /P2口低四位用于数码管片选P4DIR =0xff; /P4口接电机TACTL=TASSEL1+TACL
21、R; /定时器A 时钟源为SMCLK,并清TARCCTL0 |=CCIE; /CCR0 中断使能CCR0 =15000; /计数值为15000 个SMCLK 周期,即15msTACTL |=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;model=1; / 初始状态为模式1_EINT(); /开中断 while(1) k
22、bscan(); /无键按下,则等待 /*键盘延时函数,消抖*/void delays(void) /510msuint 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(KEYINif(KEYINn0) motor_l_loosen(); /左马达松开线(一个步进)if(c_l0) motor_r_loosen(); /右马达松开线if(c_r=0 ?0.5:-0.5) ;/步进电机每步弧长(厘
23、米)(后面的式子为了减小误差而设置)count_r=(int)(inc_Lr/step_r+(inc_Lr=0 ?0.5:-0.5) ;/右步进电机每步弧长(厘米)drive_motor(count_l,count_r) ; /step_l,step_r影响最终到达的点,即影响长度delay(50) ; /延时50ms test: x0,y0,x1,y1=10,10,40,40L_l0=L_l ; /纠正比较数据L_r0=L_r ; /*画圆*/void draw_circularity(float rr,float x0,float y0) /rr:半径,(x0,y0):圆心坐标float
24、L_l,L_r,L_l0,L_r0,inc_Ll,inc_Lr,xx,yy ;int count_l,count_r,i ;L_l0=sqrt(x0+rr+15)*(x0+rr+15)+(75-y0)*(75-y0) ;/(x0+rr,y0):画圆起点坐标L_r0=sqrt(95-x0-rr)*(95-x0-rr)+(75-y0)*(75-y0) ;for(i=1;i=0 ?0.5:-0.5) ; / 左步进电机每步弧长(厘米)count_r=(int)(inc_Lr/step_r+(inc_Lr=0 ?0.5:-0.5) ; / 右步进电机每步弧长(厘米)drive_motor(count_
25、l,count_r) ;delay(50) ; /延时50msL_l0=L_l ;L_r0=L_r ; /*键码处理程序*/void key_pass(uchar keycode)Delay5Ms(); /按键松开后延时,等待稳定Delay5Ms();switch (keycode) case 0x0a: /模式选择键,每按一次,模式改变一次 if(ctrl_edit=0) /只有在ctrl_edit为0时起作用 model+; if(model=3) model=1; break;/*一. 光标控制键 (坐标位输入数据选择键,例如按动一次选择输入坐标是X或Y,是坐标的十位或个位)二. 在这里
26、用数码管显示出来,对于画直线: 起始点 ( 1-横坐标的十位,2-横坐标的个位,3-纵坐标的十位,4-纵坐标的个位)终点(5-横坐标的十位,6-横坐标的个位,7-纵坐标的十位,8-纵坐标的个位)三. 对于画圆 : 1-半径十位,2-半径个位,3-圆心横坐标十位,4-圆心横坐标个位5-圆心纵坐标十位,6-圆心纵坐标个位*/case 0x0b: /光标控制键 ,值变化, 根据model和ctrl_edit来决定 /还要考虑ctrl_edit if(ctrl_edit=0) if(model=1) /表示在画直线下,输入数据Position+; if(Position=9) Position =1;
27、 /共有8次输入 if(model=2) /表示在画圆下,输入数据Position+;if(Position=7) Position =1; /共有6次输入 break;case 0x0c: /确认键,根据model和ctrl_edit决定操作,ctrl_edit为0或1状态下都可以进行操作 if(ctrl_edit=0) /ctrl_edit是0,应变为1,即在次状态下禁止其他按键操作 ctrl_edit=!ctrl_edit; /执行操作时不能选择模式和输入数据switch (model) case 1: /直线 line_point0= utof(X11,X12);/将二个uchar转换
28、成一个floatline_point1= utof(Y11,Y12);line_point2= utof(X21,X22);/将二个uchar转换成一个floatline_point3= utof(Y21,Y22); raw_line(line_point0,line_point1,line_point2,line_point3);ctrl_edit=!ctrl_edit; /允许输入模式和数据 ,即 ctrl_edit=0 break;case 2: /圆 circle_point0 =utof(X11,X12);/将二个uchar转换成一个float,半径值circle_point1 =u
29、tof(Y11,Y12); /圆心横坐标circle_point2= utof(X21,X22); /圆心纵坐标draw_circularity(circle_point0,circle_point1,circle_point2);ctrl_edit=!ctrl_edit; /允许输入模式 break;if(ctrl_edit=1) /执行操作时不能选择模式和输入数据switch (model) case 1: /直线 line_point0= utof(X11,X12); /将二个uchar转换成一个floatline_point1= utof(Y11,Y12);line_point2= u
30、tof(X21,X22); /将二个uchar转换成一个floatline_point3= utof(Y21,Y22); draw_line(line_point0,line_point1,line_point2,line_point3);ctrl_edit=!ctrl_edit; /允许输入模式和数据 break; case 2: /圆 circle_point0 =utof(X11,X12); /将二个uchar转换成一个float,半径值circle_point1 =utof(Y11,Y12); /圆心横坐标circle_point2= utof(X21,X22); /圆心纵坐标draw
31、_circularity(circle_point0,circle_point1,circle_point2);ctrl_edit=!ctrl_edit; /允许输入模式 break; break;case 0x0: /数字键0,在相应的位置上给X,Y赋值 if(ctrl_edit=0)if(Position=1) X11=0; /起始点横坐标十位,或圆半径十位if(Position=2) X12=0; /起始点横坐标个位,或圆半径个位if(Position=3) Y11=0; /起始点纵坐标十位,或圆心横坐标十位if(Position=4) Y12=0; /起始点纵坐标个位,或圆心横坐标个位
32、if(Position=5) X21=0; /终点横坐标十位,或圆心纵坐标十位if(Position=6) X22=0; /终点横坐标个位,或圆心纵坐标个位if(Position=7) Y21=0; /终点纵坐标十位if(Position=8) Y22=0; /终点纵坐标个位break;case 0x01: /数字键1 if(ctrl_edit=0)if(Position=1) X11=1; /起始点横坐标十位,或圆半径十位if(Position=2) X12=1; /起始点横坐标个位,或圆半径个位if(Position=3) Y11=1; /起始点纵坐标十位,或圆心横坐标十位if(Posit
33、ion=4) Y12=1; /起始点纵坐标个位,或圆心横坐标个位if(Position=5) X21=1; /终点横坐标十位,或圆心纵坐标十位if(Position=6) X22=1; /终点横坐标个位,或圆心纵坐标个位if(Position=7) Y21=1; /终点纵坐标十位if(Position=8) Y22=1; /终点纵坐标个位 break;case 0x02: /数字键2if(ctrl_edit=0)if(Position=1) X11=2; if(Position=2) X12=2;if(Position=3) Y11=2;if(Position=4) Y12=2;if(Posi
34、tion=5) X21=2;if(Position=6) X22=2;if(Position=7) Y21=2;if(Position=8) Y22=2; break;case 0x03: /数字键3 if(ctrl_edit=0)if(Position=1) X11=3; /起始点横坐标十位,或圆半径十位if(Position=2) X12=3; /起始点横坐标个位,或圆半径个位if(Position=3) Y11=3; /起始点纵坐标十位,或圆心横坐标十位if(Position=4) Y12=3; /起始点纵坐标个位,或圆心横坐标个位if(Position=5) X21=3; /终点横坐标
35、十位,或圆心纵坐标十位if(Position=6) X22=3; /终点横坐标个位,或圆心纵坐标个位if(Position=7) Y21=3; /终点纵坐标十位if(Position=8) Y22=3; /终点纵坐标个位 break;case 0x04: /数字键4 if(ctrl_edit=0)if(Position=1) X11=4;if(Position=2) X12=4;if(Position=3) Y11=4;if(Position=4) Y12=4;if(Position=5) X21=4;if(Position=6) X22=4;if(Position=7) Y21=4;if(P
36、osition=8) Y22=4; break;case 0x05: /数字键5 if(ctrl_edit=0)if(Position=1) X11=5;if(Position=2) X12=5;if(Position=3) Y11=5;if(Position=4) Y12=5;if(Position=5) X21=5;if(Position=6) X22=5;if(Position=7) Y21=5;if(Position=8) Y22=5; break;case 0x06: /数字键6 if(ctrl_edit=0)if(Position=1) X11=6; /起始点横坐标十位,或圆半径十
37、位if(Position=2) X12=6; /起始点横坐标个位,或圆半径个位if(Position=3) Y11=6; /起始点纵坐标十位,或圆心横坐标十位if(Position=4) Y12=6; /起始点纵坐标个位,或圆心横坐标个位if(Position=5) X21=6; /终点横坐标十位,或圆心纵坐标十位if(Position=6) X22=6; /终点横坐标个位,或圆心纵坐标个位if(Position=7) Y21=6; /终点纵坐标十位if(Position=8) Y22=6; /终点纵坐标个位 break;case 0x07: /数字键7 if(ctrl_edit=0)if(P
38、osition=1) X11=7;if(Position=2) X12=7;if(Position=3) Y11=7;if(Position=4) Y12=7;if(Position=5) X21=7;if(Position=6) X22=7;if(Position=7) Y21=7;if(Position=8) Y22=7; break;case 0x08: /数字键8if(ctrl_edit=0) if(Position=1) X11=8;if(Position=2) X12=8;if(Position=3) Y11=8;if(Position=4) Y12=8;if(Position=5
39、) X21=8;if(Position=6) X22=8;if(Position=7) Y21=8;if(Position=8) Y22=8; break;case 0x09: /数字键9 if(ctrl_edit=0)if(Position=1) X11=9; /起始点横坐标十位,或圆半径十位if(Position=2) X12=9; /起始点横坐标个位,或圆半径个位if(Position=3) Y11=9;/起始点纵坐标十位,或圆心横坐标十位if(Position=4) Y12=9;/起始点纵坐标个位,或圆心横坐标个位if(Position=5) X21=9; /终点横坐标十位,或圆心纵坐
40、标十位if(Position=6) X22=9; /终点横坐标个位,或圆心纵坐标个位if(Position=7) Y21=9; /终点纵坐标十位if(Position=8) Y22=9; /终点纵坐标个位 break;default: break;/*定时器0中断服务函数*/用于时时显示画笔所在位置的坐标#pragma vector =TIMERA0_VECTOR /10ms中断_interrupt void timer0(void)/ WDTCTL =WDTPW+WDTCNTCL; /看门狗定时器清零 P4OUT =tablexshi;P4OUT P4OUT |=BIT4+BIT5;dela
41、y(50);P4OUT =tablexge;P4OUT P4OUT |=BIT5;delay(50);P4OUT =tableyshi;P4OUT P4OUT |=BIT4;delay(50);P4OUT =tableyge;P4OUT delay(50);P4OUT =tablePosition; /光标控制P4OUT P4OUT |=BIT6;delay(50);P4OUT =tablemodel; /模式选择(直线或圆)(1-直线, 2-圆)P4OUT P4OUT |=BIT6+BIT4;delay(50);/输入方式选择(0-数据,模式输入 2-确定)P4OUT =tablectrl_edit;P4OUT P4OUT |=BIT6+BIT5;delay(50); /*影响精度的几个因素:1. 步进电机每步弧长,即step_l,step_r;2. 等份划分,划分地越多越精确,即0.5地取值(可取更小) 及i(对圆取等份)的取值(可取更大);3. 使用绳子的质料,最好是无弹性的;4. 左右绳子长度计算;5. 绳子由于电机的抖动打滑;6. 电机本生产生的误差;7. 在进行算法处理时,产生的误差(较小);问题?计算机在处理有浮点型向整型转换时,是怎么做的.*/4.元件清单序