磁悬浮实验报告

更新时间:2023-12-19 00:45:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

开放性试验:

《磁悬浮原理实验仪制作及PID控制》

试验报告

实验内容:学生通过磁悬浮有关知识的学习,根据已有的试验模型,设计出磁悬浮实验仪器,并进行制作,进而在计算机上用PID技术进行调节和控制。

难点:PID控制程序的编写及调试。

创新点:该实验以机械学院数控所得科研成果为依托,以一种新颖的方式,用磁悬浮小球直观的展示了PID控制理论的应用。该仪器构造简单,成本低廉。此实验综合应用了电磁场、计算机、机械控制等相关知识,具有一定的研究创新性特点。该仪器有望成为中学物理实验仪器,和高校PID控制实验仪器。

关键问题

1. 悬浮线圈的优化设计 2. 磁悬浮小球系统模型 3. 磁悬浮小球的PID控制 电磁绕组优化设计 小球质量:钢

小球质量:15~20g 小球直径:15mm 悬浮高度:3mm

要求:根据悬浮高度、小球大小、小球重量设计悬浮绕组 绕组铁芯尺寸、线圈匝数、额定电流、线径。 电磁绕组优化设计:

由磁路的基尔霍夫定律、毕奥-萨格尔定律和能量守恒定律,可得电磁吸力为:

2 ?0AN2?i?F????

2?z?式中:μ0——空气磁导率,4πX10-7H/m; A——铁芯的极面积,单位m2; N——电磁铁线圈匝数;

z——小球质心到电磁铁磁极表面的瞬时气隙,单位m; i——电磁铁绕组中的瞬时电流,单位A。

功率放大器中放大元器件的最大允许电压为15V。为了降低功率放大器件上的压力差,减少功率放大器件的发热,设定悬浮绕组线圈电压该值为12V。 约束条件:U=12V

U电流、电压与电阻的关系 i?LR电阻: R??S

L——漆包线的总长度/m S——漆包线的横截面积/m2

1S??d2d——线径的大小/m

4

?是漆包线线的电阻率,查表可知: ?=1.5*1.75*e-8,单位:Ω*m

根据线圈的结构,可以得出漆包线的总长度为:

L???(a?id)i?1nL1 dn?b?a2d线圈的匝数为:N ??nL1/d综上所述,电磁力为:

?0?2AL12(b?a)2U2F?? 128?2z2L2在线圈骨架几何尺寸和所加的电压固定的情况下,线圈漆包线线径d越大,漆包线的长度L越小,电磁力F越大 。

另外,漆包线线径和电流之间还存在下述关系: ?d2Ui? 4?L因此,线径d越大通过线圈的电流也大,线圈发热越严重。

优化漆包线线径和线长必须综合考虑电磁力大小、线圈额定电流。 由最优的漆包线线径和线长,就可以得到合理的电磁绕组结构参数。 磁悬浮小球系统模型

将钢质小球放入电磁铁产生的磁场中,用传感器检测钢球在螺线管磁场中的位置,进而用PID方法控制线圈电流以达到磁力和重力的平衡。 磁悬浮小球系统可由下面方程描述 : 功放 ?d2z?t?电+?mg?F?i,z??m2

?dt磁U2 2? 控钢 制 球器 y(t)传r(t) PID功率放大器电磁铁线圈感 器 传感器 当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术

+?0AN?i????F?i,z???2?z ????U?t??Ri?t??Ldi?t??dt?22???ANi?mg?F?i,z???00??00??2?z0???e(t)baL1

铁-z-难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象﹐或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。

比例控制能迅速反应误差,从而减小稳态误差。但是,比例控制不能消除稳态误差。比例放大系数的加大,会引起系统的不稳定。

积分控制的作用是,只要系统有误差存在,积分控制器就不断地积累,输出控制量,以消除误差。因而,只要有足够的时间,积分控制将能完全消除误差,使系统误差为零,从而消除稳态误差。积分作用太强会使系统超调加大,甚至使系统出现振荡。

微分控制可以减小超调量,克服振荡,使系统的稳定性提高,同时加快系统的动态响应速度,减小调整时间,从而改善系统的动态性能。 PID控制器参数整定的方法很多,概括起来有两大类:

一是理论计算整定法。它主要是依据系统的数学模型,经过理论计算确定控制器参数。这种方法所得到的计算数据未必可以直接用,还必须通过工程实际进行调整和修改。

二是工程整定方法,它主要依赖工程经验,直接在控制系统的试验中进行,且方法简单、易于掌握,在工程实际中被广泛采用。PID控制器参数的工程整定方法,主要有临界比例法、反应曲线法和衰减法。

临界比例度法进行PID控制器参数的整定步骤:

(1)首先预选择一个足够短的采样周期TS,一般说TS应小于受控对象纯延迟时间的十分之一。 (2)用选定的TS,仅加入比例控制环节使系统工作,逐渐减小比例度,即加大比例放大系数KP,直至系统对输入的阶跃信号的响应出现临界振荡(稳定边缘),将这时的比例放大系数记为Kr,临界振荡周期记为Tr。

(3) 以连续-时间PID控制器为基准,建立数字PID的控制度评价函数 ,通过公式计算或查表确定PID控制器的参数TS,KP,TI和TD 。 ? 反应曲线法(实验凑试法 ) 通过闭环运行或模拟,观察系统的响应曲线,然后根据各参数对系统的影响,反复凑试参数,直至出现满意的响应,从而确定PID控制参数。

实验凑试法的整定步骤为“先比例,再积分,最后微分”。 (1)整定比例控制

将比例控制作用由小变到大,观察各次响应,直至得到反应快、超调小的响应曲线。 (2)整定积分环节

若在比例控制下稳态误差不能满足要求,需加入积分控制。

先将步骤(1)中选择的比例系数减小为原来的50~80%,再将积分时间置一个较大值,观测响应曲线。然后减小积分时间,加大积分作用,并相应调整比例系数,反复试凑至得到较满意的响应,确定比例和积分的参数。 (3)整定微分环节 若经过步骤(2),PI控制只能消除稳态误差,而动态过程不能令人满意,则应加入微分控制,构成PID控制。

先置微分时间TD=0,逐渐加大TD,同时相应地改变比例系数和积分时间,反复试凑至获得满意的控制效果和PID控制参数。 比例十积分十微分(PID)控制器

式中 KP——比例放大系数;TI——积分时间; TD——微分时间。 PID控制的程序实现: Up=Kp*error(k) Ui=Ui+Ki*error(k)

Ud=Kd*(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液晶数据传输; *P3.2-P3.4液晶控制线; *P3.0、P3.1接RS-232; *P3.5、P3.7两路DA;

disp1(show0); Delayms();

b=ADC_TURNON(3,4);

show0[0]=(unsigned char)(b/1000);

show0[1]=(unsigned char)((b00)/100);

show0[2]=(unsigned char)(((b00)0)/10); show0[3]=(unsigned char)(((b00)0)); 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) {flag=1; disp_kd(); delay(20); }

}//while的终止 }//main的终止

void delay(unsigned int x)

{unsigned int m,k ; for (m=0;m

{for (k=0;k<0xffff;k++); } }

n=(unsigned char)((b00)/100); }

//disp.c用来led显示结果

#include #include

sbit P15 =P1^5; sbit P16 = P1^6; sbit P17 = P1^7;

#define din P17 #define load P16 #define clk P15

#define NoOp 0x00 #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 0x0f

unsigned char code dispcode_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;a<20;a++) for(b=0;b<100;b++); }

void MAX7219_Write(unsigned char com, unsigned char dat) { unsigned char temp,i,j; load=0; clk=0; for(i=0;i<8;i++) { temp=com; if((temp&(0x80>>i))!=0) din=1; else din=0; clk=1; for(j=0;j<5;j++); clk=0; }

for(i=0;i<8;i++) { temp=dat; if((temp&(0x80>>i))!=0) din=1; else din=0; clk=1; for(j=0;j<5;j++); clk=0; } load=1; }

void MAX7219_Init()

{ MAX7219_Write(ShutDown ,0x00); Delayms();

MAX7219_Write(ShutDown ,0x01);

MAX7219_Write(DecodeMode,0xff); 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,0x07); } void disp1(unsigned char dat[4]) { 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,dat[0]); MAX7219_Write(Digit1,dat[1]); MAX7219_Write(Digit2,dat[2]); MAX7219_Write(Digit3,dat[3]); } void disp2(unsigned char dat[4]) { load=1; clk=1; din=1; MAX7219_Init(); P1M0=0x1F;

P1M1=0x00; MAX7219_Write(Digit4,dat[0]); MAX7219_Write(Digit5,dat[1]); MAX7219_Write(Digit6,dat[2]); MAX7219_Write(Digit7,dat[3]); }

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_Write(Digit1,0x0F); MAX7219_Write(Digit2,0x67); MAX7219_Write(Digit3,0); b=ADC_TURNON(3,3);

m=(unsigned char)(b/1000);

n=(unsigned char)((b00)/100);

x=(unsigned char)(((b00)0)/10); y=(unsigned char)(((b00)0)); MAX7219_Write(Digit4,dispcode_char[m]); MAX7219_Write(Digit5,dispcode_char[n]); MAX7219_Write(Digit6,dispcode_char[x]); MAX7219_Write(Digit7,dispcode_char[y]); } 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); b=ADC_TURNON(3,2);

本文来源:https://www.bwwdw.com/article/mh55.html

Top