PID控制调节,pid调节器的使用操作与调整
我们发表了一系列与PID控制器相关的文章,包括经典PID控制器和参数自适应PID控制器。虽然该系列PID控制器实现了主要功能,在实际使用中取得了良好的效果,但仍有许多细节可以改进,以提高性能和灵活性。因此,在本文中,我们将讨论PID控制器的改进,以实现方便的手动切换。
1.提问
PID控制器的效果众所周知,但有时我们想强制输出某个值来查看执行器的响应,或者有时我们想直接指定执行器的行为而不要求它随时调整。在这些情况下我们应该怎么做?
这时,我们需要解释两个定义。当PID控制器用于自动调节时,我们称之为自动运行;在上述情况下,当我们直接指定控制器的输出,或者直接指定执行器的行为时,我们称之为手动。显然,为了实现上述相应的操作,我们需要在PID控制器中加入手动自动转换功能。在本文中,我们将讨论这个问题。
2.分析和设计
现在需要考虑的是如何实现自动换手功能。首先,我们需要给PID对象添加一个属性,用来标识PID控制器是处于手动模式还是自动模式。为了对外修改PID对象的手动自动模式,我们设计了一个指向uint16 _ t的指针类型,所以我们设计PID对象如下:
1 /*定义PID对象类型*/
2 typedef结构经典
3 {
4 float * pPV//测量值指针
5 float * pSV//设置值指针
6 float * pMV//输出值指针
7 float * pKp//比例系数指针
8 float * pKi//整型系数指针
9 float * pKd//微分系数指针
10 uint16 _ t * pMA//手动自动操作指针
11
12浮动设定值;//设置值
13浮点lasterror//前一节拍偏差
14浮点预误差;//前两拍的偏差
15浮动死区;//死区
16浮点结果;//PID控制器//的计算结果
17浮点输出;//输出值为0-100%
最大18浮动;//输出值的上限
19浮动最小值;//输出值的下限
20浮点误差absmax;//最大偏差绝对值
21浮点误差absmin;//绝对偏差的最小值
22浮动;//不完全微分系数
23浮点deltadiff//差分增量
24浮点积分值;//累计积分金额
25浮动伽马;//差分第一滤波器系数
26浮点lastPv//最后一拍的过程测量值
27 float lastDeltaPv//前一个节拍的过程测量值的增量
28 } CLASSICPID对于手动自动操作,我们需要通过外部变量赋值。初始化时,我们默认将其初始化为自动模式。毕竟使用PID控制器的目的不是手动操作。
3.软件实现。
我们给PID对象添加了手动自动运行的属性,那么根据这个属性我们需要对PID控制器做哪些修改呢?让我们考虑一下在自动状态和手动状态下需要做哪些工作。
自动状态下没事做,让PID控制器正常输出就好。在手动状态下,我们希望PID控制器的输出是我们人为给定的输出。只有这样,自然不行。我们来考虑一下PID控制器由自动改为手动可能会对系统产生什么影响。事实上,当我们从自动改为手动时,只要不修改输出,整个系统的状态就不会改变。但是,当从手动切换到自动时,测量值也会随着我们修改输出值而改变。在原设定值的情况下,从手动切换到自动时,不可避免地会出现阶跃干扰。为了避免这种情况,我们在手动状态下让设定值跟随测量值,实现无扰切换。相应地,我们修改PID控制器代码如下:
1 /*一般PID控制器采用增量算法,具有变积分、梯形积分和抗积分饱和功能。微分项采用不完全微分和一阶滤波。alpha值越大,过滤效果越强*/
2空PID调节器(CLASSICPID *vPID)
3 {
4 float thisError
5浮动结果;
6浮动因子;
7浮动增量;
8 float pError,dError,iError
九
1if(* vpid-PMA 1)//手动模式
11 {
12 vPID-输出=*vPID-
13 //设置无扰动切换
14 vPID- result=(vPID-最大值-vPID-最小值)*vPID-输出/100.0 -vPID-最小值;
15 *vPID- pSV=*vPID-
16 vPID-设定点=*vPID-
17 }
18 else //自动模式
19 {
20 vPID-设定值=*vPID-
21该误差=vPID-设定点-(* vPID-pPV);//得到偏差值
22结果=vPID-结果;
23 if (fabs(thisError) vPID-死区)
24 {
25 pError=this error-vPID-lasterror;
26i error=(thisError vPID-lasterror)/2.0;
27 dError=this error-2 *(vPID-lasterror)vPID-preerror;
28
29 //变积分系数获取
30 factor=VariableIntegralCoefficient(this error,vPID- errorabsmax,vPID-error absmin);
31
32 //计算微分项增量带不完全微分
33 vPID-delta diff=(* vPID-pKd)*(1-vPID-alpha)* dError vPID-alpha * vPID-delta diff;
34
35增量=(* vPID-pKp)* pError(* vPID-pKi)* factor * I error vPID-delta diff;//增量计算
36 }
其他37个
38 {
39 if((fabs(vPID-设定点-vPID-最小值)vPID-死区)(fabs(* vPID-pPV)-vPID-最小值)vPID-死区))
40 {
41结果=vPID-最小值;
42 }
43增量=0.0;
44 }
45
46结果=结果增量;
47
48 /*对输出限值,避免超调和积分饱和问题*/
49如果(结果=vPID-最大值)
50 {
51结果=vPID-最大值;
52 }
53如果(结果=vPID-最小值)
54 {
55结果=vPID-最小值;
56 }
57
58 vPID-preerror=vPID-lasterror;//存放偏差用于下次运算
59 vPID-lasterror=这个错误;
60 vPID-结果=结果;
61
62 vPID-output=(vPID-result-vPID-minimum)/(vPID-maximum-vPID-minimum)* 100.0;
63 * vPID-pMV=vPID-output;
64 }
65 }4、总结
我们添加了手自动转换功能,并在手动转为自动时,做了无扰动切换的预置。经测试效果与我们的预期一致。当我们将PID控制器置为自动状态时,我们通过修改设定值(服务)来实现对系统的影响。而当我们将PID控制器置为手动状态时,我们通过修改输出值(MV)来实现对系统的影响。
欢迎关注:
如果您希望更方便且及时的阅读相关文章,关注我的微信公众号【木南创智】
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。