1、要计算第K次输出值P(k),只需要知道P(K-1),E(K),E(k-1),E(K-2)即可。上式也称为位置型PID的位置控制算法。在很多控制系统中,由于执行机构是采用布进电机进行控制,所以只要给一个增量信号即可。因此得到增量型PID的位置控制算法2、AS-UII的PID算法的程序设计(1) ASUII电机的软件驱动特性我们控制ASUII的电机转动是通过编程实现的,我们的编译环境是VJC1.5开发版。这种用软件实现控制的方式与一般的用电压或频率直接控制电机不同,控制量是通过函数drive(参1,参2)或motor(参1,参2)给予。函数motor()用于电机功率级别的控制,功率范围是-100(
2、反向最大)到100(前向最大),系统软件实际上只能控制电机工作于7个不同的功率级别,但参数是从-100到100。我们的问题是,这个对象没有准确的数学模型。那么,输入和输出大概有什么样的关系呢,我们需要通过测量得到对象大致的特性。在motor()内输入控制量,记下输出值,也即左右轮胎速度。这些都是通过编程实现的。输出值显示在ASUII上的液晶显示屏上。求轮胎的速度要用到光电编码器,虽然ASUII的每个光电编码器都是按照每圈33个脉冲设计的,但是因为机械原因会出现误差,所以用光电编码器读得的脉冲数计算速度之前要检测一下它的实际值。求实际速度的算法如下:float v1,v2;float T=1.5
3、;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=%fn,v1,v2);注:v1、v2分别是测得的左轮和右轮的分辨率2)观察对象的特性a输入定值(左轮右轮的输入值都为50,T=1.5秒),记录不同时刻的输出值,测得的实验数据如下:表一:1T2T3T4T5T6T左轮475148
4、49右轮4644输入输出图形大致如下这样观察对象的特性,存在很多误差(每个周期记录的速度只是这个周期的平均速度,没法看到轮胎速度变化的全过程;光电编码器的读值有误差,这样,平均速度就不是很准确),但因为我们这个实验只是用于说明我们可以控制能力风暴走直线这样一个事实,不追求很大的精确性,所以这样的误差就不去考虑了。从上图可看出,输出对输入响应很快,反应时间几乎不用考虑,并且输出基本在某个定值附近脉动。b. 输入不同值,记录输出值于表二(T=1.5秒)(2) ASUII走直线的开环特性代码如下:motor(1,50);让AS-UII纵向走两米,观察它的横向偏移。改变输入值,测量偏移距离。(3) A
5、S-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控制算法实现的走直线控制,位置式算法*/*左右轮有相同的设定值,对误差进行调整;根据左右轮的误差再对右轮进行调整,使左右轮尽量保持一致,从而走直线。*/flo
6、at 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; /*将左右轮脉冲记数清零*/ /*系统时间复位*/error_1_i1=0.0;error_2_i1=0.0;error_1_i
7、2=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=%fn”,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
8、_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
9、上*/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,测量左右轮微分系数和偏移距离。CPID算法,取上一步骤中直线效果较好的Ti1和Ti2,K1、K2 和T不变,测量左右轮微分系数和偏移距离。2)增量式算法P算法公式如:ui=Ui-Ui-1=K*(Ei-Ei-1);PI算法公式如:
10、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;但是,这样的话,增量式算法和位置式算法
11、的结果实质上是一样的。这里就不采用了。三、实验记录及数据分析:1、测量光电编码器的实际分辨率:给左右轮相同的设定值,在一定的时间段,读编码器的读数和轮胎转动圈数。时间(秒)左轮光电编码器读数左轮圈数分辨率(脉冲/圈)右轮光电右轮圈数11058216.7534.7554615.7534.67220116735.532.87110934.532.14330176953.533.07169252.7532.08440242773.533.02224970.2532.0155030069332.3284790.2531.55660370511532.223390111.2530.47平均值33.043
12、2.16从上表可见,左右轮的光电编码器的分辨率不同,左轮为33,右轮为32。所以,我们在计算时将取左轮的光电编码器一圈读33个脉冲,右轮的光电编码器一圈读32个脉冲。虽然左右轮的周长可能也不同,但是该误差较小,所以暂且假设他们相等,都为65mm,所以左轮的分辨率为6.18mm/脉冲,右轮的分辨率为6.35mm/脉冲。2、 观察对象的特性输入不同值,记录输出值,实验测得的数据如下:(T=1.5秒)表二:左轮输入值左轮输出值右轮输入值右轮输出值10.0014.3813.9320.0022.9122.6930.0027.0327.05因为电机的控制函数motor()或drive()的控制范围在010
13、0之间,所以取1090,在图纸上描点,发现对象是非线性的。而且,在相同输入下,右轮比左轮输出值小。我们得到了对象大致的特性后,就可以控制它,使它走直线。使左轮右轮走直线,可以用两种方式。第一种,使左轮右轮都趋近于同一个设定值;第二种,使右轮跟随左轮的速度。采用第一种,使左右轮都趋近于50。从表一的图可看出,我们要控制的不是对象的反应速度,而是控制它的脉动和偏差,尽量趋向于设定值,从表二,可以看出右轮的特性与左轮不同,所以可以对左右轮分开控制。因为PID调节方法对任何对象都有较大的调节作用,所以我们采用该调节方法对对象特性进行调节。3、ASUII走直线的开环特性测得的实验数据如下:输入值偏移距离
14、(米)0.3900.074、AS-UII的闭环特性AP算法,保持T=0.5不变,记录数据如下:左轮比例系数K右轮比例系数K终点偏移距离0.10.20.60.065,最后向右自转0.51.80.08,最后向右自转1.01.6-1.3由以上数据可见,要使能力风暴走直线,右轮的比例系数应比左轮的比例系数大一点,但右轮比左轮大到一定程度时走路会发生弯曲,并从偏移正值变为负值。另一方面,他们的比例系数增大时,横向偏差越来越小。但当比例系数大到一定程度时,速度会有较大的振荡。取上面最理想的比例系数K1=0.1,K2=0.1不变,改变T。T偏移距离走时左右微弱振荡偏差小所以,T取0.5最合适。B用PI算法,
15、保持K1=0.1,K2=0.1,T=0.5不变。左轮积分系数Ti1右轮积分系数Ti20.13-0.06,先左偏后右偏PI算法可以减小静差,用在这里,效果不是很大,甚至会因为积分累积引起AS-UII走路弯曲。CPID算法,取K10.1,K2=0.1,Ti1=20,Ti2=30,T=0.5不变左轮微分系数Td1右轮微分系数Td20.010.18PID可以减小超调,在PI基础上加上微分因子,超调就小了,从AS-UII的弯曲程度上就可看出。四、实验结论能力风暴的对象特性不确定,所以难以给出明确的对象传递函数,这样也就难以用我们平时所用的步骤来设计控制器,即根据传递函数来设计控制器的函数。但实际上有时即
16、使对象明确,也难以用计算得的PID控制器来控制,而是要采用试凑法,所以我们在能力风暴走直线的问题上采用试凑法。事实证明,PID控制算法的确实能控制能力风暴走直线。但是其中还存在不少问题,在电池电量不同的情况下,能力风暴在相同设定值下的转速不同,这样就会发生刚刚调的最好的PID参数过一会就显得没那么好了,所以我们要寻找鲁棒性最好的PID参数。并且需注意的是,以上的数据是基于某台能力风暴,对于不同的能力风暴,机械特性不同,所以可以参照我做实验的步骤,从测对象特性开始做。我的实验数据的价值在于观察变化趋势,其绝对值可能因为不同情况而不同。附录:参考程序/*左右轮有相同的设定值,对误差进行调整。float K1=0.1;float Ti1=20.0;float K2=0.1;float Ti2=20.0;motor(0,50);5.5)v1=%f,velocity_1);v2=%fn,velocity_2);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1