PID控制算法的实现

  • 格式:docx
  • 大小:49.41 KB
  • 文档页数:3

PID 控制算法的实现
1. PID 基本介绍
PID 控制器以期望值与输出值的偏差为输入,经过三个环节的作用后控被控对象,其原理图如图1所示:
图1 PID 控制器原理图
图中输入与输出可以表示为:
0()()()()t p i d de t u t K e t K e t dt K dt
=++⎰ (1) 其中:p K 表示比例参数;i K 表示积分时间参数;d K 表示微分时间参数。

图1中PID 的设置信号()sp y t 为每个关节所期望的步态参数,事先存在存储器中,根据需要进行读取,PID 的参数p K 、i K 、d K 是在现场进行整定,一般步骤是先选择一个较大p K ,先整定i K 再整定(一般情况下可以选择i K 为p K 的11~510
),如果满足要求了不需要整定d K ,(d K 会放大现场干扰,如果需要整定d K ,需要对采集到信号进行比较好的抗干扰处理)
3.2 PID 的数字实现
PID 算法的数字实现方式为位置式和增量式,一般选择增量式。

增量式PID 控制算法:有式(1)离散化可以得到控制器的K 和K-1个采样时刻的输出值为
112110k k k k p k i j d
j e e u K e K e K T
-----=-=++∑(2)
10k k k k p k i j d
j e e u K e K e K T
-=-=++∑(3) 由式(3)减去式(2)可得
122()k k k k p k k i j d e e e u K e e K e K T
---+∆=-++(4) T 为采样周期
1k k k u u u -=+∆(5)
3.3 PID 算法的C 语言实现
下面样例程序采用的是整数计算(当时因为采样频率高,如果采用浮点计算,会影响实时性)。

可以修改为浮点计算,结算结果需要转换为12位整数,PID 计算过程要考虑中间结果是否溢出,最终结果是在满足DA 转换器的需求
//pid 结构参数定义
Struct PidStruct
{
int32putValue;
int32 Error,Error_1,Error_2;
uint16pgain;
uint16igain;
uint16dgain; };
Struct PidParamStruct
{
uint16pgain;
uint16igain;
uint16dgain; };
//PID 计算函数,增量式PID
int32 PidProcess(int32 nRetValue,int16 nSetValue,structPidStruct *pPID)
{
int32 retPutoutValue,temp1,temp2,temp3;
pPID->Error=nSetValue-nRetValue; //输入给定值与反馈值求和
temp1=pPID->Error - pPID->Error_1; //比例部分因子
temp2=pPID->Error - 2*pPID->Error_1 + pPID->Error_2; //微分部分因子
temp3=pPID->Error; //积分部分因子retPutoutValue= pPID->pgain*temp1; //输出值的比例部分
retPutoutValue+=pPID->igain*temp3; //输出值加上积分部分
retPutoutValue+=pPID->dgain*temp2; //输出值加上微分部分
retPutoutValue+=pPID->putValue;
pPID->Error_2=pPID->Error_1;
pPID->Error_1=pPID->Error;
//考虑PutoutValue中间计算结果的处理,这个值理论上不能大于int32所表示的范围,但是考虑到控制的输出结果为int16,(需要进行修改DA为12位)
//暂时把设置为int16的表示范围,可以把该值放大,但是会引起计算的饱和,退出饱和会花较长的时间,对控制效果不好
if(retPutoutValue>32767)
{
pPID->putValue=32767;
}
else if(retPutoutValue<-32768)
{
pPID->putValue=-32768;
}
else
{
pPID->putValue=retPutoutValue; //更新输出值
}
return retPutoutValue; //返回PID输出值
}。