三维滑台实验指导一、实验目的1.认识三维滑台装置,了解其工作原理2.结合《运动控制系统》课程,了解步进电机的工作原理及其控制方式3.熟悉Keil编程软件,练习C语言编程二、实验器材1.三维滑台机械装置;2.三维滑台控制箱;3.电脑一台4.单片机下载线1根;5.A4大小纸张若干三、实验原理1.三维滑台介绍三维滑台是一种可以在X、Y、Z三个方向运动的机械装置,其中X、Y方向可以实现纸张的平面移动,在Z方向装有铅笔。运用此装置可以实现运动控制中的位置控制,以及可以模仿实际工程中的钢板切割、雕刻刺绣、机械加工甚至是3D打印技术。三维滑台的X、Y、Z轴方向使用步进电机作为动力源,步进电机的最初模型是在19世纪30年代出现的。步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电机的转速、停止的位置取决于脉冲信号的频率和脉冲个数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。使得在速度、位置等控制领域用步进电机来控制变的非常的简单。图1三维滑台2.步进电机的工作原理步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。当电流流过定子绕组时,定子绕组产生一矢量磁场。该磁场会带动转子旋转一角度,使得转子的一对磁场方向与定子的磁场方向一致。当定子的矢量磁场旋转一个角度。转子也随着该磁场转一个角度。每输入一个电脉冲,电动机转动一个角度前进一步。它输出的角位移与输入的脉冲数成正比、转速与脉冲频率成正比。改变绕组通电的顺序,电机就会反转。所以可用控制脉冲数量、频率及电动机各相绕组的通电顺序来控制步进电机的转动。通常见到的各类电机,内部都是有铁芯和绕组线圈的。绕组有电阻,通电会产生损耗,损耗大小与电阻和电流的平方成正比,这就是我们常说的铜损,如果电流不是标准的直流或正弦波,还会产生谐波损耗;铁心有磁滞涡流效应,在交变磁场中也会产生损耗,其大小与材料,电流,频率,电压有关,这叫铁损。铜损和铁损都会以发热的形式表现出来,从而影响电机的效率。步进电机一般追求定位精度和力矩输出,效率比较低,电流一般比较大,且谐波成分高,电流交变的频率也随转速而变化,因而步进电机普遍存在发热情况,且情况比一般交流电机严重。步进电机的详细学习可以参考相关资料或学PPT2.三维滑台的工作原理三维滑台控制系统的滑台部分以买的机械装置为载体,进行硬件系统的设计,功能模块主要包括:步进电机驱动模块、电源管理模块、单片机模块。三维滑台控制系统以STC89C52RC为核心。三维滑台控制系统系统结构框图如图1所示。图1三维滑台控制系统系统结构框图四、实验内容1程序流程图写程序需要一个清晰地思路,而程序流程图就是对我们解决问题的一个清晰的描述。本软件编写的主体思路是将系统按功能模块化划分,然后根据模块要实现的功能编写各个子程序。流程图如图:图8主程序流程图2数字零程序清单#includereg52.h#includeLCD1602.h#includemath.h#includefloat.h#defineucharunsignedchar#defineuintunsignedintconstfloatPI=3.141593;uintCont=0;//Cont为步进电机运行的步数bitflag=0;//作为按键(0)或画图(1)的标志位,两者的最佳频率不一样**********************************************************************函数功能:按键定义及各个步进驱动器与单片机的接口定义********************************************************************sbitxsr=P1^3;//按键定义:x轴电机运动方向(后)sbitxsl=P1^0;//按键定义:x轴电机运动方向(前)sbitxen=P2^0;//定义x轴电机使能的端口sbitxcw=P2^1;//定义x轴电机转向的端口sbitxcp=P2^2;//定义控制x轴电机的脉冲端口sbitysr=P1^4;//按键定义:y轴电机运动方向(左)sbitysl=P1^1;//按键定义:y轴电机运动方向(右)sbityen=P2^3;//定义y轴电机使能的端口sbitycw=P2^4;//定义控制y轴电机转向的端口sbitycp=P2^5;//定义控制y轴电机的脉冲端口sbitzsr=P1^5;//按键定义:z轴电机运动方向(上)sbitzsl=P1^2;//按键定义:z轴电机运动方向(下)sbitzen=P2^6;//定义z轴电机使能的端口sbitzcw=P2^7;//定义控制z轴电机转向的端口sbitzcp=P1^7;//定义控制z轴电机的脉冲端口**********************************************************************函数功能:上电初始化********************************************************************voidMotor_INIT()//步进电机初始化{xen=0;yen=0;zen=0;}voidTIM_INIT()//定时器初始化{TMOD=0x01;//定时器0,工作方式1PCON=0x80;//SMOD=1;TH0=0Xff;TL0=0X9b;//定时器0装初值ET0=1;//定时器0允许中断TR0=1;//timer0runEA=1;//CPU允许中}**********************************************************************函数功能:定时器中断设置,利用定时器产生周期脉冲********************************************************************voidtimer0()interrupt1using2{if(flag){TH0=0xfe;TL0=0x01;}//画图周期1020uselse{TH0=0xff;TL0=0x9b;}//按键周期200us5KHzif(Cont!=0)//要走的步数Cont不为0,则还没走完继续走{Cont--;if(xen==1){xcp=~xcp;//等于1,则取反}if(yen==1){ycp=~ycp;}if(zen==1){zcp=~zcp;}}}**********************************************************************函数功能:3个函数:X_Move(方向,大小),Y_Move(方向,大小),Z_Move(方向,大小)方向:1为正0为负,大小:1~16000********************************************************************voidX_Move(bitdirection,uintdx){xen=1;yen=0;zen=0;//x轴电机使能xcw=~direction;ycw=0;zcw=0;//x轴电机转向Cont=dx;while(Cont!=0);xcp=1;}voidY_Move(bitdirection,uintdy){xen=0;yen=1;zen=0;//y轴电机使能xcw=0;ycw=~direction;zcw=0;//y轴电机转向Cont=dy;while(Cont!=0);ycp=1;}voidZ_Move(bitdirection,uintdz){xen=0;yen=0;zen=1;//z轴电机使能xcw=0;ycw=0;zcw=direction;//z轴电机转向Cont=dz;while(Cont!=0);zcp=1;}**********************************************************************函数功能:按键扫描********************************************************************voidSCAN_KEY(){flag=0;if(xsr==0){X_Move(1,100);}elseif(xsl==0){X_Move(0,100);}if(ysr==0){Y_Move(1,100);}elseif(ysl==0){Y_Move(0,100);}if(zsr==0){Z_Move(1,100);}elseif(zsl==0){Z_Move(0,100);}}****************************************************************************函数功能:画(X,Y)向量的方向线段()**************************************************************************voidLine(intX,intY){intt=0;floatk=0;uintdx=0,dy=0;if(X!=0){k=(1.0*Y)/(1.0*X);dx=97;dy=1*(abs(1*(97.0*k)));for(t=0;tabs(0.65*X);t++)//系数0.65是为了让与圆的半径符合上{X_Move(X0?1:0,97);Y_Move(Y0?1:0,dy);}}else{dy=97;for(t=0;tabs(0.65*Y);t++)//系数0.65是为了让与圆的半径符合上{Y_Move(Y0?1:0,dy);}}}****************************************************************************函数功能:书写数字0**************************************************************************voidxieshu(){Line(200,0);//写0Line(0,400);Line(-200,0);Line(0,-400);Z_Move(0,5000);//写0完成}**********************************************************************函数功能:主函数********************************************************************voidmain(){TIM_INIT();//定时器初始化Motor_INIT();//步进电机进行初始化LCD_1602_Init();//液晶显示前进行初始化flag=1;//初始化为按键适用频率Write_1602_String(XIESHU,0X80);Write_1602_String(x,y,zdirection,0XC0);while(1){SCAN_KEY();}}五实验要求1认真阅读三维滑台实验指导书,理解三维滑台的工作原理和电路图的原理。2事先编写程序,控制滑台写出自己姓氏的首字母(利用线段拼凑出字母,如H就用2根竖线和1根横线写出来),实验时到实验室三维滑台装置上验证。3报告里附上画出来的字母(要求:必须为三维滑台铅笔做出来的,不能用手工作图做假,画好也