智能控制实验报告

校名2

智能控制实验报告

数字PID及其算法

戴子文 200730580307

房柳煌 200730580309

张荣春200730580331

指导老师:陈瑜

日期:20##年12月2日

华南农业大学工程学院


数字PID及其算法

一、  实验目的:

1、    掌握数字PID及其算法

2、    掌握AS-UII电机的软件驱动方法特性、AS-UII走直线的开环特性、AS-UII的闭环特性及其分析方法

二、  实验原理及实验步骤:

1、PID算法的数字化实现

在模拟系统中,PID算法的表达式为:

式中,

P(t)----调节器的输出信号;

e(t)-----调节器的偏差信号,它等于测量值与给定值之差;

Kp-----调节器的比例系数;

T1----调节器的积分时间;

TD----调节器的微分时间;

离散化的PID:

Δt=T     采样周期,必须使T足够少,才能保证系统有一定的精度;

E(k)    第K次采样时的偏差值;

E(k-1)  第K-1次采样时的偏差值;

K         采样序号,K=0,1,2……;

P(k)    第K次采样时调节器的输出;

上式计算复杂,经过化简为:

式中:

积分系数

微分系数

要计算第K次输出值P(k),只需要知道P(K-1),E(K),E(k-1),E(K-2)即可。

上式也称为位置型PID的位置控制算法。

在很多控制系统中,由于执行机构是采用布进电机进行控制,所以只要给一个增量信号即可。因此得到增量型PID的位置控制算法

2、AS-UII的PID算法的程序设计

(1) AS-UII电机的软件驱动特性

我们控制AS-UII的电机转动是通过编程实现的,我们的编译环境是VJC1.5开发版。这种用软件实现控制的方式与一般的用电压或频率直接控制电机不同,控制量是通过函数drive(参1,参2)或motor(参1,参2)给予。函数motor()用于电机功率级别的控制,功率范围是-100(反向最大)到100(前向最大),系统软件实际上只能控制电机工作于7个不同的功率级别,但参数是从-100到100。

我们的问题是,这个对象没有准确的数学模型。

那么,输入和输出大概有什么样的关系呢,我们需要通过测量得到对象大致的特性。在motor()内输入控制量,记下输出值,也即左右轮胎速度。这些都是通过编程实现的。输出值显示在AS-UII上的液晶显示屏上。

求轮胎的速度要用到光电编码器,虽然AS-UII的每个光电编码器都是按照每圈33个脉冲设计的,但是因为机械原因会出现误差,所以用光电编码器读得的脉冲数计算速度之前要检测一下它的实际值。

求实际速度的算法如下:

float v1,v2;

float T=1.5;

void main()

{

motor(1,50);

motor(2,50);

rotation(1);

rotation(2);

resettime();

while(1)

{

if(seconds()>5.0)

{

stop();

break;

}

wait(T);

v1=(float)rotation(1)*v1/T;

v2=(float)rotation(2)*v2/T;

printf("v1=%f,v2=%f\n",v1,v2);

}

}

注:v1、v2分别是测得的左轮和右轮的分辨率

2)观察对象的特性

a.输入定值(左轮右轮的输入值都为50,T=1.5秒),记录不同时刻的输出值,测

得的实验数据如下:

表一:

输入输出图形大致如下

这样观察对象的特性,存在很多误差(每个周期记录的速度只是这个周期的平均速度,没法看到轮胎速度变化的全过程;光电编码器的读值有误差,这样,平均速度就不是很准确),但因为我们这个实验只是用于说明我们可以控制能力风暴走直线这样一个事实,不追求很大的精确性,所以这样的误差就不去考虑了。

从上图可看出,输出对输入响应很快,反应时间几乎不用考虑,并且输出基本在某个定值附近脉动。

b. 输入不同值,记录输出值于表二(T=1.5秒)

(2) AS-UII走直线的开环特性

代码如下:

void main()

{motor(1,50);

motor(2,50);

}

让AS-UII纵向走两米,观察它的横向偏移。

改变输入值,测量偏移距离。

(3) AS-UII的闭环特性

应用PID算法进行反馈控制。根据控制量,我们采用位置式算法。

3、         位置式算法

P公式如:U=Kei+Uo;

PI公式如:U=K(Ei+T/Ti*Σej)+Uo;

PID公式如:U=K(Ei+T/Ti*Σej+Td/T*(Ei-Ei-1))+Uo;

因为左右轮的特性不一样,可以对他们分别控制。

这里Uo是控制量的基准,这里是50,电机期望的速度是50,E是实际速度与期望速度的偏差,U是控制量,将做为motor()的控制参数。

代码如下:

/*用PID控制算法实现的走直线控制,位置式算法*/

/*左右轮有相同的设定值,对误差进行调整;根据左右轮的误差再对右轮进行调整,使左右轮尽量保持一致,从而走直线。*/

float K1=0.05;

float Ti1=15.0;

float Td1=0.1;

float K2=0.2;

float Ti2=15.0;

float Td2=0.1;

float T=0.5;

float velocity_1;

float velocity_2;

float u_1_i;/*控制量*/

float u_2_i;

float error_1_i,error_1_i1,error_1_i2;

float error_2_i,error_2_i1,error_2_i2;

void main()

{

motor(1,50);

motor(2,50);

rotation(1); /*将左右轮脉冲记数清零*/

rotation(2);

resettime(); /*系统时间复位*/

error_1_i1=0.0;

error_2_i1=0.0;

error_1_i2=0.0;

error_2_i2=0.0;

while(1)

{

if(seconds()>4.0)

{

stop();

break;

}

wait(T);

/*计算error_i*/

velocity_1=(float)rotation(1)*0.619/T;

error_1_i=50.0-velocity_1;

velocity_2=(float)rotation(2)*0.659/T;

error_2_i=50.0-velocity_2;

printf(“v1=%f”,velocity_1);

printf(“v2=%f\n”,velocity_2);

u_1_i=K1*(error_1_i+T/Ti1*error_1_i2+Td1/T*(error_1_i-error_1_i1))+50.0; //PID算法

u_2_i=K2*(error_2_i+T/Ti2*error_2_i2+Td2/T*(error_2_i-error_2_i1))+50.0;

/*

u_1_i=K1*error_1_i+50.0; //P算法

u_2_i=K2*error_2_i+50.0;

*/

/*

u_1_i=K1*(error_1_i+T/Ti1*error_1_i2)+50.0; //PI算法

u_2_i=K2*(error_2_i+T/Ti2*error_2_i2)+50.0;

*/

motor(1,(int)u_1_i);

motor(2,(int)u_2_i);

/*将error_i的值赋给error_i1,并将error_i叠加到error_i2上*/

error_1_i1=error_1_i;

error_2_i1=error_2_i;

error_1_i2=error_1_i2+error_1_i;

error_2_i2=error_2_i2+error_2_i;

}

}

对偏移有如下规定:

A.先用P算法,保持T=0.5不变。测量左右轮比例系数和重点偏移距离。

B.用PI算法,取上一步骤中直线效果较好的K1和K2, T取0.5,测量左右轮微分系数和偏移距离。

C.PID算法,取上一步骤中直线效果较好的Ti1和Ti2,K1、K2 和T不变,测量左右轮微分系数和偏移距离。

2)增量式算法

P算法公式如:Δui=Ui-Ui-1=K*(Ei-Ei-1);

PI算法公式如:Δui=Ui-Ui-1=K*(Ei-Ei-1+T/Ti*Ei);

PID算法公式如:Δui=Ui-Ui-1=K*(Ei-Ei-1+T/Ti*Ei+Td/T*(Ei-2Ei-1+Ei-2));

原来增量式算法是用于一些步进电机之类的对象,因为它的控制量是增量。以增量为控制量可以减少切换时的冲击。但是我们这里的电机并非步进电机,所以输入的控制量应是绝对数值。所以算法公式应改成如下:

P算法公式如:Ui=K*(Ei-Ei-1)+Ui-1;

PI算法公式如:Ui=K*(Ei-Ei-1+T/Ti*Ei)+Ui-1;

PID算法公式如:Ui=K*(Ei-Ei-1+T/Ti*Ei+Td/T*(Ei-2Ei-1+Ei-2))+Ui-1;

但是,这样的话,增量式算法和位置式算法的结果实质上是一样的。这里就不采用了。

三、实验记录及数据分析:

1、测量光电编码器的实际分辨率:

给左右轮相同的设定值,在一定的时间段,读编码器的读数和轮胎转动圈数。

从上表可见,左右轮的光电编码器的分辨率不同,左轮为33,右轮为32。

所以,我们在计算时将取左轮的光电编码器一圈读33个脉冲,右轮的光电编码器一圈读32个脉冲。虽然左右轮的周长可能也不同,但是该误差较小,所以暂且假设他们相等,都为65mm,所以左轮的分辨率为6.18mm/脉冲,右轮的分辨率为6.35mm/脉冲。

2、         观察对象的特性

输入不同值,记录输出值,实验测得的数据如下:(T=1.5秒)

表二:

因为电机的控制函数motor()或drive()的控制范围在0~100之间,所以取10~90,在图纸上描点,发现对象是非线性的。而且,在相同输入下,右轮比左轮输出值小。

我们得到了对象大致的特性后,就可以控制它,使它走直线。使左轮右轮走直线,可以用两种方式。第一种,使左轮右轮都趋近于同一个设定值;第二种,使右轮跟随左轮的速度。采用第一种,使左右轮都趋近于50。

从表一的图可看出,我们要控制的不是对象的反应速度,而是控制它的脉动和偏差,尽量趋向于设定值,从表二,可以看出右轮的特性与左轮不同,所以可以对左右轮分开控制。因为PID调节方法对任何对象都有较大的调节作用,所以我们采用该调节方法对对象特性进行调节。

3、AS-UII走直线的开环特性

测得的实验数据如下:

4AS-UII的闭环特性

A.P算法,保持T=0.5不变,记录数据如下:

由以上数据可见,要使能力风暴走直线,右轮的比例系数应比左轮的比例系数大一点,但右轮比左轮大到一定程度时走路会发生弯曲,并从偏移正值变为负值。另一方面,他们的比例系数增大时,横向偏差越来越小。但当比例系数大到一定程度时,速度会有较大的振荡。取上面最理想的比例系数K1=0.1,K2=0.1不变,改变T。

所以,T取0.5最合适。

B.用PI算法,保持K1=0.1,K2=0.1,T=0.5不变。

PI算法可以减小静差,用在这里,效果不是很大,甚至会因为积分累积引起AS-UII走路弯曲。

C.PID算法,取K1=0.1,K2=0.1,Ti1=20,Ti2=30,T=0.5不变

PID可以减小超调,在PI基础上加上微分因子,超调就小了,从AS-UII的弯曲程度上就可看出。

四、实验结论

能力风暴的对象特性不确定,所以难以给出明确的对象传递函数,这样也就难以用我们平时所用的步骤来设计控制器,即根据传递函数来设计控制器的函数。但实际上有时即使对象明确,也难以用计算得的PID控制器来控制,而是要采用试凑法,所以我们在能力风暴走直线的问题上采用试凑法。事实证明,PID控制算法的确实能控制能力风暴走直线。但是其中还存在不少问题,在电池电量不同的情况下,能力风暴在相同设定值下的转速不同,这样就会发生刚刚调的最好的PID参数过一会就显得没那么好了,所以我们要寻找鲁棒性最好的PID参数。

并且需注意的是,以上的数据是基于某台能力风暴,对于不同的能力风暴,机械特性不同,所以可以参照我做实验的步骤,从测对象特性开始做。我的实验数据的价值在于观察变化趋势,其绝对值可能因为不同情况而不同。

附录:参考程序

/*用PID控制算法实现的走直线控制,位置式算法*/

/*左右轮有相同的设定值,对误差进行调整。*/

float K1=0.1;

float Ti1=20.0;

float Td1=0.1;

float K2=0.1;

float Ti2=20.0;

float Td2=0.1;

float T=0.5;

float velocity_1;

float velocity_2;

float u_1_i;/*控制量*/

float u_2_i;

float error_1_i,error_1_i1,error_1_i2;

float error_2_i,error_2_i1,error_2_i2;

void main()

{

motor(0,50);

motor(0,50);

rotation(1); /*将左右轮脉冲记数清零*/

rotation(2);

resettime(); /*系统时间复位*/

error_1_i1=0.0;

error_2_i1=0.0;

error_1_i2=0.0;

error_2_i2=0.0;

while(1)

{

if(seconds()>5.5)

{

stop();

break;

}

wait(T);

/*计算error_i*/

velocity_1=(float)rotation(1)*0.619/T;

error_1_i=50.0-velocity_1;

velocity_2=(float)rotation(2)*0.659/T;

error_2_i=50.0-velocity_2;

printf("v1=%f",velocity_1);

printf("v2=%f\n",velocity_2);

/*

u_1_i=K1*(error_1_i+T/Ti1*error_1_i2+Td1/T*(error_1_i-error_1_i1))+50.0;

u_2_i=K2*(error_2_i+T/Ti2*error_2_i2+Td2/T*(error_2_i-error_2_i1))+50.0;

*/

u_1_i=K1*error_1_i+50.0;

u_2_i=K2*error_2_i+50.0;

/*

u_1_i=K1*(error_1_i+T/Ti1*error_1_i2)+50.0;

u_2_i=K2*(error_2_i+T/Ti2*error_2_i2)+50.0;

*/

motor(1,(int)u_1_i);

motor(2,(int)u_2_i);

/*将error_i的值赋给error_i1,并将error_i叠加到error_i2上*/

error_1_i1=error_1_i;

error_2_i1=error_2_i;

error_1_i2=error_1_i2+error_1_i;

error_2_i2=error_2_i2+error_2_i;

}

}

 

第二篇:智能控制实验报告

智能控制实验报告

-BP网络

一.实验内容

 设计BP网络,映射函数为:

1.y=sin(x)   x(0 ,2

2.y=x1^2+x2^2+x1*x2   x1,x2(0,1)

给出训练后的权值矩阵,并考察训练拟合的效果。

二.实验原理

1.BP网络原理

BP网络模型处理信息的基本原理是:输入信号Xi通过中间节点(隐层点)作用于输出节点,经过非线形变换,产生输出信号Yk,网络训练的每个样本包括输入向量X和期望输出量t,网络输出值Y与期望输出值t之间的偏差,通过调整输入节点与隐层节点的联接强度取值Wij和隐层节点与输出节点之间的联接强度Tjk以及阈值,使误差沿梯度方向下降,经过反复学习训练,确定与最小误差相对应的网络参数(权值和阈值),训练即告停止。此时经过训练的神经网络即能对类似样本的输入信息,自行处理输出误差最小的经过非线形转换的信息。

2.BP学习的过程

正向传播:

Ø  输入样本---输入层---各隐层---输出层

判断是否转入反向传播阶段:

Ø  若输出层的实际输出与期望的输出(教师信号)不符

  误差反传

3.BP网络的设计

在本次试验中,均采用了三层的BP网络,即输入层,一隐层,输出层。隐层结点数均定义为10个。

 

在取样本时,采取均匀采样的方法,在测试时采用未使用的数据。对于初始值采用随机选取的办法。

采用单极性Sigmoid函数: ,其具有连续、可导的特点。

 

4.算法

1)        初始化网络参数,其阈值和各层之间的权值均用随机数产生,其范围[-1,1];

2)        .输入样本及教师信号,(x,y),并归一化,其函数为:

[0,1]归一化([min,max]---->[0,1]):

[0,1]反归一化([0,1]---->[min,max]):

[-1,1]归一化([min,max]---->[-1,1]):

[-1,1]反归一化([-1,1]---->[min,max]):

(其中

3)        计算隐层及输出层的输出

设其函数为:f(x)=1/(1+exp(x))

则隐层输出为:

输出层输出为:

4)        计算各层的误差信号并改变权值。

1)计算隐层对输出层的误差信号,,并根据误差信号求出权值增量,  。进而可更新权值:

2)计算输入层对隐层的误差信号,,并根据误差信号,求出权值增量,。进而可更新权值:

5)   计算网络均方根误差E,判断误差是否达到要求或者达到训练次数,若未达到要求,则执行3,4部知道到达要求。

6)        若满足要求,则进行测试。

5..算法的流程图为:

 

三.实验结果

(1)有y=sin(x)

在实验时将隐层节点个数设为:10;学习率为:0.1;误差设定值为:0.00013;

实验截图如图所示:

l  实验次数及误差

经试验,当误差达到0.00013后,误差减小的很慢,当达到0.00012后便开始增加。故选定误差为0.00013,训练次数为36624次。

l  实验结束后的权值:

l   测试:

(2)y=x1^2+x2^2+x1*x2   x1,x2(0,1)

在实验时将隐层节点个数设为:10;学习率为:0.5;误差设定值为:0.0015;

实验截图如图所示:

l  实验次数及误差

经试验,当误差达到0.0015后,误差减小的非常慢,但一直在减小,故选定误差为0.0015,且选定的学习率比较高。最终的训练次数为56788次。

l   最终的权值为

l 数据测试

四.实验结果分析

    在BP网络训练的过程中,误差开始减小的非常快,到后来训练了一万次后误差减小开始变得非常慢。当改变学习率时,学习率增加时,学习的速度增加,但是出现了震荡的现象。选取较小的学习率时,学习的速率明显变慢,但是选取的值较多,震荡的现象减小。隐层节点数减少时学习的速率变快,但是相应的测试误差变大。

在测试时,有的数的误差明显偏大,这是由于训练次数少,隐层结点数少,训练有误差而导致的仿真结果不准确造成的。

五.实验中存在的不足

   (1)对于第一题,在训练时,产生了很多次的震荡,而且不能保证最后的结果是最优的结果。

   (2)对于第二题,误差减小的很慢,到了最后基本上不减小。训练次数多使得学习效率低,收敛速度慢;

(3)实验训练结束后的测试,最终的绝对误差均在0.05左右,有些大。训练次数少,误差较大而引起的。

六.实验中出现的问题

   (1)在调试程序的过程中出现误差非常大,而且不减小的情况——进入了平坦区

   产生的原因:没有进行归一化处理。

进行归一化处理的原因:

①网络的各个输入数据常常具有不同的物理意义和不同的量纲,归一化给各输入分量以同等重要的地位;

②BP网的神经元均采用Sigmoid转移函数,变换后可防止因净输入的绝对值过大而使神经元输出饱和,继而使权值调整进入误差曲面的平坦区;

③Sigmoid转移函数的输出在0~1或-1~1之间。教师信号如不进行归一化处理,势必使数值大的输出分量绝对误差大,数值小的输出分量绝对误差小。

(2在调试的过程中出现了误差震荡——陷入某个极小点

产生的原因:标准BP算法的局限性,存在多个极小点

相关推荐