智能控制实验报告Word文档格式.docx
- 文档编号:19234524
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:14
- 大小:177.33KB
智能控制实验报告Word文档格式.docx
《智能控制实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《智能控制实验报告Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
要计算第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个脉冲设计的,但是因为机械原因会出现误差,所以用光电编码器读得的脉冲数计算速度之前要检测一下它的实际值。
求实际速度的算法如下:
floatv1,v2;
floatT=1.5;
voidmain()
{
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秒),记录不同时刻的输出值,测
得的实验数据如下:
表一:
1T
2T
3T
4T
5T
6T
左轮
47
51
48
49
右轮
46
44
输入输出图形大致如下
这样观察对象的特性,存在很多误差(每个周期记录的速度只是这个周期的平均速度,没法看到轮胎速度变化的全过程;
光电编码器的读值有误差,这样,平均速度就不是很准确),但因为我们这个实验只是用于说明我们可以控制能力风暴走直线这样一个事实,不追求很大的精确性,所以这样的误差就不去考虑了。
从上图可看出,输出对输入响应很快,反应时间几乎不用考虑,并且输出基本在某个定值附近脉动。
b.输入不同值,记录输出值于表二(T=1.5秒)
(2)AS-UII走直线的开环特性
代码如下:
{motor(1,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控制算法实现的走直线控制,位置式算法*/
/*左右轮有相同的设定值,对误差进行调整;
根据左右轮的误差再对右轮进行调整,使左右轮尽量保持一致,从而走直线。
*/
floatK1=0.05;
floatTi1=15.0;
floatTd1=0.1;
floatK2=0.2;
floatTi2=15.0;
floatTd2=0.1;
floatT=0.5;
floatvelocity_1;
floatvelocity_2;
floatu_1_i;
/*控制量*/
floatu_2_i;
floaterror_1_i,error_1_i1,error_1_i2;
floaterror_2_i,error_2_i1,error_2_i2;
/*将左右轮脉冲记数清零*/
/*系统时间复位*/
error_1_i1=0.0;
error_2_i1=0.0;
error_1_i2=0.0;
error_2_i2=0.0;
4.0)
/*计算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));
原来增量式算法是用于一些步进电机之类的对象,因为它的控制量是增量。
以增量为控制量可以减少切换时的冲击。
但是我们这里的电机并非步进电机,所以输入的控制量应是绝对数值。
所以算法公式应改成如下:
Ui=K*(Ei-Ei-1)+Ui-1;
Ui=K*(Ei-Ei-1+T/Ti*Ei)+Ui-1;
Ui=K*(Ei-Ei-1+T/Ti*Ei+Td/T*(Ei-2Ei-1+Ei-2))+Ui-1;
但是,这样的话,增量式算法和位置式算法的结果实质上是一样的。
这里就不采用了。
三、实验记录及数据分析:
1、测量光电编码器的实际分辨率:
给左右轮相同的设定值,在一定的时间段,读编码器的读数和轮胎转动圈数。
时间(秒)
左轮光电
编码器读
数
左轮圈数
分辨率
(脉冲/圈)
右轮光电
右轮圈数
1
10
582
16.75
34.75
546
15.75
34.67
2
20
1167
35.5
32.87
1109
34.5
32.14
3
30
1769
53.5
33.07
1692
52.75
32.08
4
40
2427
73.5
33.02
2249
70.25
32.01
5
50
3006
93
32.3
2847
90.25
31.55
6
60
3705
115
32.22
3390
111.25
30.47
平均值
33.04
32.16
从上表可见,左右轮的光电编码器的分辨率不同,左轮为33,右轮为32。
所以,我们在计算时将取左轮的光电编码器一圈读33个脉冲,右轮的光电编码器一圈读32个脉冲。
虽然左右轮的周长可能也不同,但是该误差较小,所以暂且假设他们相等,都为65mm,所以左轮的分辨率为6.18mm/脉冲,右轮的分辨率为6.35mm/脉冲。
2、观察对象的特性
输入不同值,记录输出值,实验测得的数据如下:
(T=1.5秒)
表二:
左轮输入值
左轮输出值
右轮输入值
右轮输出值
10.00
14.38
13.93
20.00
22.91
22.69
30.00
27.03
27.05
因为电机的控制函数motor()或drive()的控制范围在0~100之间,所以取10~90,在图纸上描点,发现对象是非线性的。
而且,在相同输入下,右轮比左轮输出值小。
我们得到了对象大致的特性后,就可以控制它,使它走直线。
使左轮右轮走直线,可以用两种方式。
第一种,使左轮右轮都趋近于同一个设定值;
第二种,使右轮跟随左轮的速度。
采用第一种,使左右轮都趋近于50。
从表一的图可看出,我们要控制的不是对象的反应速度,而是控制它的脉动和偏差,尽量趋向于设定值,从表二,可以看出右轮的特性与左轮不同,所以可以对左右轮分开控制。
因为PID调节方法对任何对象都有较大的调节作用,所以我们采用该调节方法对对象特性进行调节。
3、AS-UII走直线的开环特性
测得的实验数据如下:
输入值
偏移距离(米)
>
0.3
90
0.07
4、AS-UII的闭环特性
A.P算法,保持T=0.5不变,记录数据如下:
左轮比例系数K
右轮比例系数K
终点偏移距离
0.1
0.2
0.6
0.065,最后向右自转
0.5
1.8
0.08,最后向右自转
1.0
1.6
-1.3
由以上数据可见,要使能力风暴走直线,右轮的比例系数应比左轮的比例系数大一点,但右轮比左轮大到一定程度时走路会发生弯曲,并从偏移正值变为负值。
另一方面,他们的比例系数增大时,横向偏差越来越小。
但当比例系数大到一定程度时,速度会有较大的振荡。
取上面最理想的比例系数K1=0.1,K2=0.1不变,改变T。
T
偏移距离
走时左右微弱振荡
偏差小
所以,T取0.5最合适。
B.用PI算法,保持K1=0.1,K2=0.1,T=0.5不变。
左轮积分系数Ti1
右轮积分系数Ti2
0.13
-0.06,先左偏后右偏
PI算法可以减小静差,用在这里,效果不是很大,甚至会因为积分累积引起AS-UII走路弯曲。
C.PID算法,取K1=0.1,K2=0.1,Ti1=20,Ti2=30,T=0.5不变
左轮微分系数Td1
右轮微分系数Td2
0.01
0.18
PID可以减小超调,在PI基础上加上微分因子,超调就小了,从AS-UII的弯曲程度上就可看出。
四、实验结论
能力风暴的对象特性不确定,所以难以给出明确的对象传递函数,这样也就难以用我们平时所用的步骤来设计控制器,即根据传递函数来设计控制器的函数。
但实际上有时即使对象明确,也难以用计算得的PID控制器来控制,而是要采用试凑法,所以我们在能力风暴走直线的问题上采用试凑法。
事实证明,PID控制算法的确实能控制能力风暴走直线。
但是其中还存在不少问题,在电池电量不同的情况下,能力风暴在相同设定值下的转速不同,这样就会发生刚刚调的最好的PID参数过一会就显得没那么好了,所以我们要寻找鲁棒性最好的PID参数。
并且需注意的是,以上的数据是基于某台能力风暴,对于不同的能力风暴,机械特性不同,所以可以参照我做实验的步骤,从测对象特性开始做。
我的实验数据的价值在于观察变化趋势,其绝对值可能因为不同情况而不同。
附录:
参考程序
/*左右轮有相同的设定值,对误差进行调整。
floatK1=0.1;
floatTi1=20.0;
floatK2=0.1;
floatTi2=20.0;
motor(0,50);
5.5)
v1=%f"
velocity_1);
v2=%f\n"
velocity_2);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能 控制 实验 报告