磁悬浮实验报告.doc

上传人:罗晋 文档编号:6081053 上传时间:2020-09-06 格式:DOC 页数:21 大小:261.50KB
返回 下载 相关 举报
磁悬浮实验报告.doc_第1页
第1页 / 共21页
磁悬浮实验报告.doc_第2页
第2页 / 共21页
磁悬浮实验报告.doc_第3页
第3页 / 共21页
磁悬浮实验报告.doc_第4页
第4页 / 共21页
磁悬浮实验报告.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《磁悬浮实验报告.doc》由会员分享,可在线阅读,更多相关《磁悬浮实验报告.doc(21页珍藏版)》请在三一文库上搜索。

1、开放性试验:磁悬浮原理实验仪制作及PID控制试验报告实验内容:学生通过磁悬浮有关知识的学习,根据已有的试验模型,设计出磁悬浮实验仪器,并进行制作,进而在计算机上用PID技术进行调节和控制。难点:PID控制程序的编写及调试。创新点:该实验以机械学院数控所得科研成果为依托,以一种新颖的方式,用磁悬浮小球直观的展示了PID控制理论的应用。该仪器构造简单,成本低廉。此实验综合应用了电磁场、计算机、机械控制等相关知识,具有一定的研究创新性特点。该仪器有望成为中学物理实验仪器,和高校PID控制实验仪器。关键问题1. 悬浮线圈的优化设计2. 磁悬浮小球系统模型3. 磁悬浮小球的PID控制 电磁绕组优化设计小

2、球质量:钢小球质量:1520g小球直径:15mm悬浮高度:3mm要求:根据悬浮高度、小球大小、小球重量设计悬浮绕组绕组铁芯尺寸、线圈匝数、额定电流、线径。电磁绕组优化设计:由磁路的基尔霍夫定律、毕奥-萨格尔定律和能量守恒定律,可得电磁吸力为: 式中:0空气磁导率,4X10-7H/m; A铁芯的极面积,单位m2; N电磁铁线圈匝数; z小球质心到电磁铁磁极表面的瞬时气隙,单位m; i电磁铁绕组中的瞬时电流,单位A。功率放大器中放大元器件的最大允许电压为15V。为了降低功率放大器件上的压力差,减少功率放大器件的发热,设定悬浮绕组线圈电压该值为12V。 约束条件:U12V电流、电压与电阻的关系 电阻

3、:L漆包线的总长度/mS漆包线的横截面积/m2 d线径的大小/m是漆包线线的电阻率,查表可知:1.5*1.75*e-8,单位:*m根据线圈的结构,可以得出漆包线的总长度为:线圈的匝数为:综上所述,电磁力为:在线圈骨架几何尺寸和所加的电压固定的情况下,线圈漆包线线径d越大,漆包线的长度L越小,电磁力F越大 。另外,漆包线线径和电流之间还存在下述关系:因此,线径d越大通过线圈的电流也大,线圈发热越严重。优化漆包线线径和线长必须综合考虑电磁力大小、线圈额定电流。由最优的漆包线线径和线长,就可以得到合理的电磁绕组结构参数。磁悬浮小球系统模型将钢质小球放入电磁铁产生的磁场中,用传感器检测钢球在螺线管磁场

4、中的位置,进而用PID方法控制线圈电流以达到磁力和重力的平衡。 磁悬浮小球系统可由下面方程描述 :当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。 比例控制能迅速反应误差,从而减小稳态误差。但是,比例控制不能消除稳态误差。比例放大系数的加大,会引起系统的不稳定。积分控制的作用是,只要系统有误差存在,积分控制器就不断地积累,输出控制量,以消除误差。因而,只要有足够的时间

5、,积分控制将能完全消除误差,使系统误差为零,从而消除稳态误差。积分作用太强会使系统超调加大,甚至使系统出现振荡。微分控制可以减小超调量,克服振荡,使系统的稳定性提高,同时加快系统的动态响应速度,减小调整时间,从而改善系统的动态性能。PID控制器参数整定的方法很多,概括起来有两大类:一是理论计算整定法。它主要是依据系统的数学模型,经过理论计算确定控制器参数。这种方法所得到的计算数据未必可以直接用,还必须通过工程实际进行调整和修改。二是工程整定方法,它主要依赖工程经验,直接在控制系统的试验中进行,且方法简单、易于掌握,在工程实际中被广泛采用。PID控制器参数的工程整定方法,主要有临界比例法、反应曲

6、线法和衰减法。 临界比例度法进行PID控制器参数的整定步骤: (1)首先预选择一个足够短的采样周期TS,一般说TS应小于受控对象纯延迟时间的十分之一。 (2)用选定的TS,仅加入比例控制环节使系统工作,逐渐减小比例度,即加大比例放大系数KP,直至系统对输入的阶跃信号的响应出现临界振荡(稳定边缘),将这时的比例放大系数记为Kr,临界振荡周期记为Tr。 (3) 以连续-时间PID控制器为基准,建立数字PID的控制度评价函数 ,通过公式计算或查表确定PID控制器的参数TS,KP,TI和TD 。n 反应曲线法(实验凑试法 )通过闭环运行或模拟,观察系统的响应曲线,然后根据各参数对系统的影响,反复凑试参

7、数,直至出现满意的响应,从而确定PID控制参数。 实验凑试法的整定步骤为“先比例,再积分,最后微分”。 (1)整定比例控制 将比例控制作用由小变到大,观察各次响应,直至得到反应快、超调小的响应曲线。 (2)整定积分环节 若在比例控制下稳态误差不能满足要求,需加入积分控制。 先将步骤(1)中选择的比例系数减小为原来的5080,再将积分时间置一个较大值,观测响应曲线。然后减小积分时间,加大积分作用,并相应调整比例系数,反复试凑至得到较满意的响应,确定比例和积分的参数。 (3)整定微分环节 若经过步骤(2),PI控制只能消除稳态误差,而动态过程不能令人满意,则应加入微分控制,构成PID控制。 先置微

8、分时间TD=0,逐渐加大TD,同时相应地改变比例系数和积分时间,反复试凑至获得满意的控制效果和PID控制参数。比例十积分十微分(PID)控制器式中 KP比例放大系数;TI积分时间; TD微分时间。PID控制的程序实现:UpKp*error(k)UiUiKi*error(k)UdKd*(error(k)-error(k-1))U=Up+Ui+Ud在程序中我们采用的是增量是算法磁悬浮控制器介绍1、磁悬浮控制系统原理框图磁悬浮控制器组成资源配置:*P0.0蜂鸣器,P0.1测试灯,P0.2、P0.3两个按键。*P1.0-P1.4五路A/D;*P1.5-P1.7控制LED;*P2.0-P2.7液晶数据传

9、输;*P3.2-P3.4液晶控制线;*P3.0、P3.1接RS-232;*P3.5、P3.7两路DA;1、P0口:STC125412AD的P0口只有四个引脚,资源分配如下: P0.0蜂鸣器,P0.1测试灯,P0.2、P0.3两个按键。2、STC125412AD的I/O口资源介绍: *四个I/O口,共27个引脚,其中P0口上只有4个引脚P0.0-P0.3,P3口上只有7个引脚却少P3.6脚,P1、P2口和8051一样有8个引脚; *所有I/O口都有四种类型:准双向口(传统8051模式)、推挽输出、仅为输入和开漏模式,均可由软件配置成4种工作类型之一; *每个口由2个控制寄存器(PxM0和PxM1

10、)中的相应位控制每个引脚工作类型;举例: P2M0=0xC0;P2M0=0xA0; P2.7为开漏,P2.6为高阻输入,P2.5为推挽输出,P2.4-P2.0为弱上拉。1、控制器设计了5路AD,都经调理送入单片机,占用P1.0-P1.4五个I/O引脚,其中P1.4用于采集传感器送入信号,P1.1-P1.3用于控制PID算法参数,P0.0用于设置小球浮起高度。2、设置P1口:设置:P1M0=0x1F;P1M1=0x00;或者P1M0=0x1F;PIM1=0x1F;传感器信号AD转换原理框图2、控制信号AD转换原理框图1、控制器设计了两路DA,占用P3.5和P3.7两个引脚,P3.5路DA送往功率

11、放大器,P3.7路DA备用。2、DA电路原理: STC12C5412AD本没有集成DA转换功能,但是它有4路的PWM(脉冲宽度调制)信号,PWM信号可以通过调理电路转化为DA信号。3、DA电路原理框图:4、I/O口设定:不能设置为高阻输入!6、LED模块1、P1.5-P1.7控制8个数码管(LED) 为了节省I/O资源,选用了一片MAX7219。2、MAX7219简介 *一种高集成化的串行输入输出的共阴极LED显示驱动器; *每片可驱动8位7段加小数点的共阴极数码管,与单片机相连仅需3根线; *包括BCD译码器、多位扫描电路、段驱动器、位驱动器和用于存放每个数据位的8X8静态RAM以及数个工作

12、寄存器; *可以编程控制工作寄存器,可以使MAX7219进入不同的工作状态。*控制信号:DIN为串行数据输入端,CIK为串行时钟输入端,LOAD为片选端;*DIGODIG7为吸收显示器共阴极电流的位驱动线,其最大值可达500mA;*SEGASEGG,DP 为驱动显示器7段及小数点的输出电流,一般为40mA左右;*DOUT 为串行数据输出端,通常直接接入下一片MAX7219的DIN端。在试验中使用的源程序:/test.c#include #include #includep0m0=0;p0m1=0x00;sbit p02=P02; sbit p03=P03; sbit p00=P00; sbit

13、 p01=P01; extern pid(int kp,ki,kd,spec,yk);extern disp1(unsigned char dat4); /有时候真的很无奈,就少了一点东西。就是出不来啦,注意extern花了一天的时间,外加另建了一个项目。无语了extern disp2(unsigned char dat4); /没一个冒号;害了我老半天,特别注意了extern unsigned int ADC_TURNON(unsigned char speed,chanl);extern void Delayms(void);extern void dac(unsigned char pw

14、m);externvoid disp_kp();externvoid disp_ki();externvoid disp_kd();unsigned char flag=1;void delay(unsigned int x); void main() int kp=0,ki=0,kd=0,spec=0,yk=0; unsigned char da;unsigned char show04=0x00,0x01,0x02,0x03;unsigned int a=0,b=0; while(1) p03=0;a=ADC_TURNON(3,0); show00=(unsigned char)(a/10

15、00);show01=(unsigned char)(a%1000)/100);show02=(unsigned char)(a%1000)%100)/10);show03=(unsigned char)(a%1000)%100)%10); disp1(show0); Delayms(); b=ADC_TURNON(3,4); show00=(unsigned char)(b/1000);show01=(unsigned char)(b%1000)/100);show02=(unsigned char)(b%1000)%100)/10);show03=(unsigned char)(b%100

16、0)%100)%10); disp2(show0); Delayms(); kp=ADC_TURNON(3,3); ki=ADC_TURNON(3,2); kd=ADC_TURNON(3,1); spec=ADC_TURNON(3,0); yk=ADC_TURNON(3,4); da=pid(kp/100,ki/10,kd/10,spec/10,yk/10); dac(da); if(p02=0&flag=1) flag+; disp_kp(); delay(20); if(p02=0&flag=2) flag+; disp_ki(); delay(20); if(p02=0&flag=3)

17、flag=1; disp_kd(); delay(20); /while的终止 /main的终止 void delay(unsigned int x)unsigned int m,k;for (m=0;mx;m+)for (k=0;k0xffff;k+); n=(unsigned char)(b%1000)/100);/disp.c用来led显示结果#include #include sbit P15 =P15;sbit P16 = P16;sbit P17 = P17;#define din P17#define load P16 #define clk P15#define NoOp 0x

18、00 #define Digit0 0x01 #define Digit1 0x02#define Digit2 0x03 #define Digit3 0x04 #define Digit4 0x05 #define Digit5 0x06 #define Digit6 0x07 #define Digit7 0x08 #define DecodeMode 0x09 #define Intensity 0x0a #define ScanLimit 0x0b #define ShutDown 0x0c #define DisplayTest 0x0funsigned char code dis

19、pcode_char=0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b, 0x0, 0x1;extern unsigned int ADC_TURNON(unsigned char speed,chanl); void MAX7219_Write(unsigned char com, unsigned char dat); void Delayms(void) unsigned int a,b; for(a=0;a20;a+) for(b=0;b100;b+);void MAX7219_Write(unsigned char com, unsi

20、gned char dat)unsigned char temp,i,j;load=0;clk=0;for(i=0;ii)!=0)din=1;else din=0;clk=1;for(j=0;j5;j+);clk=0; for(i=0;ii)!=0)din=1;else din=0;clk=1;for(j=0;j5;j+);clk=0; load=1;void MAX7219_Init() MAX7219_Write(ShutDown ,0x00);Delayms();MAX7219_Write(ShutDown ,0x01); MAX7219_Write(DecodeMode,0xff);

21、MAX7219_Write(Intensity ,0x0a); / Intensity Register Format MAX7219_Write(ScanLimit,0x07); void MAX7219_Init1() MAX7219_Write(ShutDown ,0x00);Delayms();MAX7219_Write(ShutDown ,0x01); MAX7219_Write(DecodeMode,0x00); MAX7219_Write(Intensity ,0x0a); / Intensity Register Format MAX7219_Write(ScanLimit,0

22、x07); void disp1(unsigned char dat4) load=1; clk=1; din=1; MAX7219_Init(); /设P1.0/P1.1/P1.2/P1.3/P1.4为高阻输入,其他为IO P1M0=0x1F; P1M1=0x00; MAX7219_Write(Digit0,dat0);MAX7219_Write(Digit1,dat1);MAX7219_Write(Digit2,dat2);MAX7219_Write(Digit3,dat3); void disp2(unsigned char dat4)load=1; clk=1; din=1; MAX7

23、219_Init();P1M0=0x1F; P1M1=0x00; MAX7219_Write(Digit4,dat0);MAX7219_Write(Digit5,dat1);MAX7219_Write(Digit6,dat2);MAX7219_Write(Digit7,dat3); void disp_kp() /用于显示kp,ki,kd的值 unsigned int b;unsigned char m,n,x,y;load=1; clk=1; din=1; MAX7219_Init1();P1M0=0x1F; P1M1=0x00;MAX7219_Write(Digit0,0);MAX7219

24、_Write(Digit1,0x0F);MAX7219_Write(Digit2,0x67);MAX7219_Write(Digit3,0); b=ADC_TURNON(3,3); m=(unsigned char)(b/1000); n=(unsigned char)(b%1000)/100); x=(unsigned char)(b%1000)%100)/10); y=(unsigned char)(b%1000)%100)%10); MAX7219_Write(Digit4,dispcode_charm);MAX7219_Write(Digit5,dispcode_charn);MAX7

25、219_Write(Digit6,dispcode_charx);MAX7219_Write(Digit7,dispcode_chary);void disp_ki() /用于显示kp,ki,kd的值 unsigned int b;unsigned char m,n,x,y;load=1; clk=1; din=1; MAX7219_Init1();P1M0=0x1F; P1M1=0x00;MAX7219_Write(Digit0,0);MAX7219_Write(Digit1,0x0F);MAX7219_Write(Digit2,0x30);MAX7219_Write(Digit3,0);

26、b=ADC_TURNON(3,2); m=(unsigned char)(b/1000); n=(unsigned char)(b%1000)/100); x=(unsigned char)(b%1000)%100)/10); y=(unsigned char)(b%1000)%100)%10); MAX7219_Write(Digit4,dispcode_charm);MAX7219_Write(Digit5,dispcode_charn);MAX7219_Write(Digit6,dispcode_charx);MAX7219_Write(Digit7,dispcode_chary);vo

27、id disp_kd() /用于显示kp,ki,kd的值 unsigned char m,n,x,y; unsigned int b;load=1; clk=1; din=1; MAX7219_Init1();P1M0=0x1F; P1M1=0x00;MAX7219_Write(Digit0,0);MAX7219_Write(Digit1,0x0F);MAX7219_Write(Digit2,0x3D);MAX7219_Write(Digit3,0); b=ADC_TURNON(3,1); m=(unsigned char)(b/1000); n=(unsigned char)(b%1000)

28、/100); x=(unsigned char)(b%1000)%100)/10); y=(unsigned char)(b%1000)%100)%10); MAX7219_Write(Digit4,dispcode_charm);MAX7219_Write(Digit5,dispcode_charn);MAX7219_Write(Digit6,dispcode_charx);MAX7219_Write(Digit7,dispcode_chary);/adc.c用来实现ad转换的子程序#include #include extern void Delayms(void); unsigned i

29、nt ADC_TURNON(unsigned char speed,unsigned char chanl) unsigned int x,y,z; /整理SPEED speed&=0x03; speed=speed5; /整理通道chanl chanl&=0x07; /ADC_POWER开 ADC_CONTR=0x80; Delayms(); /加入转换速度SPEED1/SPEED0 ADC_CONTR|=speed; /加入通道CHS2/CHS1/CHS0 ADC_CONTR|=chanl; /启动转换 ADC_CONTR|=0x08; Delayms(); /查结束标志位 if(ADC_

30、CONTR&0x10)=0) /while还是if有待商榷 /复位ADC_FLAG ADC_CONTR&=0xef; x=ADC_DATA; x=x*4; y=ADC_LOW2&0x03; z=x+y; return(z);/da.cda转换子程序#include #include #include void dac(unsigned char pwm) CMOD=0X02; CL=0; CH=0; CCAP0L=0x00-pwm; CCAP0H=0x00-pwm; CCAPM0=0X42; CCAP1L=0x00-pwm; CCAP1H=0x00-pwm; CCAPM1=0X42; CR=1

31、; /pid.c pid算法程序#include #include #includemmul(int x,int y);madd(int x,int y); char change16_8(int wd);/yk=kp【ek-ek_1】+kits*ek+kd/tsek-2*ek_1+ek_2 char pid(int kp,ki,kd,spec,yk)/pid的系数,设定值spec由0通道提供,实时的值yk由4通道提供 int p,i,d,ek,ek_1,aek,ts=1,bek,k,ake,ck,ck_1; char iband=0x50; ts=20; yk=k=p=i=d=0; ek=s

32、pec-yk;/error bek=ek-ek_1-aek; aek=ek-ek_1; if(abs(ek)abs(iband) i=0;/判断积分分离? else i=(ek*ts)*ki; p=kp*ake; d=(kd/ts)*bek/1000;/ts去单位为1ms k=madd(i,p); k=madd(k,d); k=mmul(k,kp); k=k/10; ck=k+ck_1; ck=change16_8(ck); ck_1=ck; ek_1=ek; ck=ck+0x80; / return ck;int change32_16(int z,int t)int s;if(t=0)if

33、(z&0x8000)=0 )s=z;else s=0x7fff;else if(t&0xffff)=0xffff)if(z&0x8000)=0) s=0x7fff;else s=z;else if (t&0x8000)=0) s=0x7fff;else s=0x8000;return(s);char change16_8(int wd)char z,t,s;z=wd&0x0ff;t=(wd8)&0x0ff;if(t=0x00)if(z&0x80)=0) s=z;else s=0x7f;else if (t&0xff)=0xff)if(z&0x80)=0)s=0x80;else s=z;else

34、 if (t&0x80)=0) s=0x7f;else s=0x80;return(s);int mmul(int x,int y)int t,z;long s;s=x*y;z=(int)(s&0x0ffff);s=change32_16(z,t);return(s);int madd(int x,int y)int t; t=x+y;if(x=0&y=0)if(t&0x8000)!=0)t=0x7fff;else if (x=0&y=0)if(t&0x8000)=0)t=0x8000;return(t);试验心得及小结: 当初想不就是把一个小球浮起来嘛,挺简单的,可是实际操作时才知道要把这么

35、一个小球扶起来还真是一件不容易的事啊。先不说电路设计,时间都花在了程序的调试上以及PID参数的调整上。可是到目前为止还没有把小球扶起来。还得继续努力了。 虽然没有把小球浮起来,不过在这个过程中却是收获许多课本上学不到的知识。首先是电路以及电路板的设计,虽然电路板不是我们设计的,不过通过别人设计的电路板自己也能学到不少东西,加之我们刚学过电路板的设计protel软件以及keilc51程序设计,可以把学过的知识应用于实践,事实也证明我们刚学过的知识还是很有用的。 我们每个组的任务就是把各个模块组装在一起。完成程序的设计,这个过程中大家一起努力,一起调试,一起解决问题。其乐融融,收获不仅是知识方面的

36、还有大家的友谊。因为刚学过protel,所以电路不是多大的问题,程序设计花了一些时间,总是不停的调试不停的修改程序,有时搞了半天也调好只通过google查找资料,就这样不停的google终于还是把程序搞定了,看着自己完成的程序,虽然不是很长,不过也是自己辛辛苦苦写出来的,还是充满了欣慰。 这次开放性试验让我们在课堂上学到的知识应用到了实际中,使我们真正的认识到了理论和实际的差距,同时用理论指导实践,从实践中学到知识,收获良多,希望学校多组织这样的开放性试验,让更多的同学能把知识应用于实践,从实践中学到更多的知识。实验感想 通过本次实验,使我接触到许多课堂上很难学到的知识,极大地增长了我们的见识

37、,学到了很多非常实用的技术,更进一步理解了pid控制的基本原理,这对我们技能的提高是大有裨益的。同时,作为团队的一员,充分感受了团队合作的快乐。具体来讲,实验的内容包括磁悬浮小球模型的建立、基本模型参数的计算、小球高度的控制模块设计。通过实验过程,深刻体会了一个典型机电产品开发的基本流程。学会了根据实验现象分析实验问题,并解决问题的一般过程。在一定意义上讲,实验过程基本就是解决问题的过程。在这个过程中,徐老师给于了我们最真诚的帮助和不厌倦的教诲,同时提供给我们充分发挥才能的机会与平台,指导形成了我们一个学习型的团队。我们的队长徐学卫同学做了大量细致的工作,作为团队的一员,从队长身上学到对待实验

38、一丝不苟的科学严谨态度,我想这些品质都是非常珍贵的。经过一学期的探索学习,使我对于磁悬浮原理及控制方面的认识有了较为深刻的理解,下面是我关于本次实验的一些思考。(1)成绩是显著的。作为一个典型的机电产品,其开发过程非常具有代表性,极大的提高了我们的动手能力、学习能力,体味了所谓研发产品的科学内涵。互相交流学习的过程中,每一位队员都感觉收获颇多。集中学习了单片机方面的知识,并就pid控制算法设计进行了较为合理的应用。(2)实验过程中的问题。始终困扰我们的问题就是在小球平衡位置pid参数的寻找上。虽然对程序的算法进行了不断的改进,不断的探索,但最终的实验结果还是不能令人满意。再者,实验的分工上不太明确,导致队长的实验任务过大,这几乎影响了我们实验的进度。(3)关于教学实验的些思考。作为课外创新实验,可以说我们学校对学生动手实践能力的培养方面做了一次大胆的尝试,同时也是一次飞跃。把几个志趣相同的同学集中到一起,充分发挥各自的才能,完成一项系统设计。我想,不论实验结果的成功或是失败,这种探索的机制是非常积极的,是值得肯定的。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1