好好学习,天天向上,一流范文网欢迎您!
当前位置:首页 >> 最新范文 内容页

磁悬浮原理实验仪制作及PID控制实验报告

磁悬浮原理实验仪制作及PID控制实验报告 本文关键词:原理,实验,控制,报告,制作

磁悬浮原理实验仪制作及PID控制实验报告 本文简介:开放性试验:《磁悬浮原理实验仪制作及PID控制》试验报告实验内容:学生通过磁悬浮有关知识的学习,根据已有的试验模型,设计出磁悬浮实验仪器,并进行制作,进而在计算机上用PID技术进行调节和控制。难点:PID控制程序的编写及调试。创新点:该实验以机械学院数控所得科研成果为依托,以一种新颖的方式,用磁悬浮

磁悬浮原理实验仪制作及PID控制实验报告 本文内容:

开放性试验:

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

试验报告

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

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

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

关键问题

1.

悬浮线圈的优化设计

2.

磁悬浮小球系统模型

3.

磁悬浮小球的PID控制

电磁绕组优化设计

小球质量:钢

小球质量:15~20g

小球直径:15mm

悬浮高度:3mm

要求:根据悬浮高度、小球大小、小球重量设计悬浮绕组

绕组铁芯尺寸、线圈匝数、额定电流、线径。

电磁绕组优化设计:

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

式中:μ0——空气磁导率,4πX10-7H/m;

A——铁芯的极面积,单位m2;

N——电磁铁线圈匝数;

z——小球质心到电磁铁磁极表面的瞬时气隙,单位m;

i——电磁铁绕组中的瞬时电流,单位A。

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

约束条件:U=12V

电流、电压与电阻的关系

电阻:

L——漆包线的总长度/m

S——漆包线的横截面积/m2

d——线径的大小/m

是漆包线线的电阻率,查表可知:

=1.5*1.75*e-8,单位:Ω*m

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

线圈的匝数为:

综上所述,电磁力为:

在线圈骨架几何尺寸和所加的电压固定的情况下,线圈漆包线线径d越大,漆包线的长度L越小,电磁力F越大

另外,漆包线线径和电流之间还存在下述关系:

因此,线径d越大通过线圈的电流也大,线圈发热越严重。

优化漆包线线径和线长必须综合考虑电磁力大小、线圈额定电流。

由最优的漆包线线径和线长,就可以得到合理的电磁绕组结构参数。

磁悬浮小球系统模型

将钢质小球放入电磁铁产生的磁场中,用传感器检测钢球在螺线管磁场中的位置,进而用PID方法控制线圈电流以达到磁力和重力的平衡。

磁悬浮小球系统可由下面方程描述

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

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

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

微分控制可以减小超调量,克服振荡,使系统的稳定性提高,同时加快系统的动态响应速度,减小调整时间,从而改善系统的动态性能。

PID控制器参数整定的方法很多,概括起来有两大类:

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

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

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

(1)首先预选择一个足够短的采样周期TS,一般说TS应小于受控对象纯延迟时间的十分之一。

(2)用选定的TS,仅加入比例控制环节使系统工作,逐渐减小比例度,即加大比例放大系数KP,直至系统对输入的阶跃信号的响应出现临界振荡(稳定边缘),将这时的比例放大系数记为Kr,临界振荡周期记为Tr。

(3)

以连续-时间PID控制器为基准,建立数字PID的控制度评价函数

,通过公式计算或查表确定PID控制器的参数TS,KP,TI和TD

n

反应曲线法(实验凑试法

通过闭环运行或模拟,观察系统的响应曲线,然后根据各参数对系统的影响,反复凑试参数,直至出现满意的响应,从而确定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;

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)中的相应位控制每个引脚工作类型;

举例:

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送往功率放大器,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以及数个工作

寄存器;可以编程控制工作寄存器,可以使MAX7219进入不

同的工作状态。控制信号:DIN为串行数据输入端,CIK为串行时钟输入端,LOAD为片选端;DIGO~DIG7为吸收显示器共阴极电流的位驱动线,其最大值可达500mA;SEGA~SEGG,DP

为驱动显示器7段及

小数点的输出电流,一般为40mA左右;DOUT

为串行数据输出端,通常直接接入下一片MAX7219的DIN端。

在试验中使用的源程序:

//test.c

#include

#include

#include

p0m0=0;

p0m1=0x00;

sbit

p02=P0^2;

sbit

p03=P0^3;

sbit

p00=P0^0;

sbit

p01=P0^1;

extern

pid(int

kp,ki,kd,spec,yk);

extern

disp1(unsigned

char

dat[4]);

//有时候真的很无奈,就少了一点东西。就是出不来啦,注意extern花了一天的时间,外加另建了一个项目。无语了

extern

disp2(unsigned

char

dat[4]);

//没一个冒号;害了我老半天,特别注意了

extern

unsigned

int

ADC_TURNON(unsigned

char

speed,chanl);

extern

void

Delayms(void);

extern

void

dac(unsigned

char

pwm);

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

show0[4]={0x00,0x01,0x02,0x03};

unsigned

int

a=0,b=0;

while(1){

p03=0;

a=ADC_TURNON(3,0);

show0[0]=(unsigned

char)(a/1000);

show0[1]=(unsigned

char)((a%1000)/100);

show0[2]=(unsigned

char)(((a%1000)%100)/10);

show0[3]=(unsigned

char)(((a%1000)%100)%10);

disp1(show0);

Delayms();

b=ADC_TURNON(3,4);

show0[0]=(unsigned

char)(b/1000);

show0[1]=(unsigned

char)((b%1000)/100);

show0[2]=(unsigned

char)(((b%1000)%100)/10);

show0[3]=(unsigned

char)(((b%1000)%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

disp_kp();

delay(20);

}

if(p02==0

disp_ki();

delay(20);

}

if(p02==0

disp_kd();

delay(20);

}

}//while的终止

}//main的终止

void

delay(unsigned

int

x)

{unsigned

int

m,k;

for

(m=0;m

#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>i))!=0)

din=1;

else

din=0;

clk=1;

for(j=0;j>i))!=0)

din=1;

else

din=0;

clk=1;

for(j=0;j

#include

extern

void

Delayms(void);

unsigned

int

ADC_TURNON(unsigned

char

speed,unsigned

char

chanl)

{

unsigned

int

x,y,z;

//整理SPEED

speed

speed=speed

#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;

}

//pid.c

pid算法程序

#include

#include

#include

mmul(int

x,int

y);

madd(int

x,int

y);

char

change16_8(int

wd);//△yk=kp【ek-ek_1】+ki[ts*ek]+kd/ts[ek-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=spec-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((z

else

s=0x7fff;

}

else

if((t

else

s=z;

}

else

if

((t

else

s=0x8000;

return(s);

}

char

change16_8(int

wd)

{

char

z,t,s;

z=wd

t=(wd>>8)

if(t==0x00)

{

if((z

else

s=0x7f;

}

else

if

((t

else

s=z;

}

else

if

((t

else

s=0x80;

return(s);

}

int

mmul(int

x,int

y)

{

int

t,z;

long

s;

s=x*y;

z=(int)(s

s=change32_16(z,t);

return(s);

}

int

madd(int

x,int

y)

{

int

t;

t=x+y;

if(x>=0}

else

if

(x<=0

}

return(t);

}

试验心得及小结:

当初想不就是把一个小球浮起来嘛,挺简单的,可是实际操作时才知道要把这么一个小球扶起来还真是一件不容易的事啊。先不说电路设计,时间都花在了程序的调试上以及PID参数的调整上。可是到目前为止还没有把小球扶起来。还得继续努力了。

虽然没有把小球浮起来,不过在这个过程中却是收获许多课本上学不到的知识。

首先是电路以及电路板的设计,虽然电路板不是我们设计的,不过通过别人设计的电路板自己也能学到不少东西,加之我们刚学过电路板的设计protel软件以及keilc51程序设计,可以把学过的知识应用于实践,事实也证明我们刚学过的知识还是很有用的。

我们每个组的任务就是把各个模块组装在一起。完成程序的设计,这个过程中大家一起努力,一起调试,一起解决问题。其乐融融,收获不仅是知识方面的还有大家的友谊。因为刚学过protel,所以电路不是多大的问题,程序设计花了一些时间,总是不停的调试不停的修改程序,有时搞了半天也调好只通过google查找资料,就这样不停的google终于还是把程序搞定了,看着自己完成的程序,虽然不是很长,不过也是自己辛辛苦苦写出来的,还是充满了欣慰。

这次开放性试验让我们在课堂上学到的知识应用到了实际中,使我们真正的认识到了理论和实际的差距,同时用理论指导实践,从实践中学到知识,收获良多,希望学校多组织这样的开放性试验,让更多的同学能把知识应用于实践,从实践中学到更多的知识。

实验感想

通过本次实验,使我接触到许多课堂上很难学到的知识,极大地增长了我们的见识,学到了很多非常实用的技术,更进一步理解了pid控制的基本原理,这对我们技能的提高是大有裨益的。同时,作为团队的一员,充分感受了团队合作的快乐。具体来讲,实验的内容包括磁悬浮小球模型的建立、基本模型参数的计算、小球高度的控制模块设计。通过实验过程,深刻体会了一个典型机电产品开发的基本流程。学会了根据实验现象分析实验问题,并解决问题的一般过程。

在一定意义上讲,实验过程基本就是解决问题的过程。在这个过程中,徐老师给于了我们最真诚的帮助和不厌倦的教诲,同时提供给我们充分发挥才能的机会与平台,指导形成了我们一个学习型的团队。我们的队长徐学卫同学做了大量细致的工作,作为团队的一员,从队长身上学到对待实验一丝不苟的科学严谨态度,我想这些品质都是非常珍贵的。经过一学期的探索学习,使我对于磁悬浮原理及控制方面的认识有了较为深刻的理解,下面是我关于本次实验的一些思考。

(1)成绩是显著的。作为一个典型的机电产品,其开发过程非常具有代表性,极大的提高了我们的动手能力、学习能力,体味了所谓研发产品的科学内涵。互相交流学习的过程中,每一位队员都感觉收获颇多。集中学习了单片机方面的知识,并就pid控制算法设计进行了较为合理的应用。

(2)实验过程中的问题。始终困扰我们的问题就是在小球平衡位置pid参数的寻找上。虽然对程序的算法进行了不断的改进,不断的探索,但最终的实验结果还是不能令人满意。再者,实验的分工上不太明确,导致队长的实验任务过大,这几乎影响了我们实验的进度。

(3)关于教学实验的些思考。作为课外创新实验,可以说我们学校对学生动手实践能力的培养方面做了一次大胆的尝试,同时也是一次飞跃。把几个志趣相同的同学集中到一起,充分发挥各自的才能,完成一项系统设计。我想,不论实验结果的成功或是失败,这种探索的机制是非常积极的,是值得肯定的。

TAG标签: