增量式pid的c语言程序,增量式PID推导及C语言实现

PID控制器表达式为:

[u(t) = K_pe(t) + K_iint_0^t e(au)dau + K_dfrac{de(t)}{dt}

]

离散化:

令 $ t = nT,~T$为采样周期。可得:

[e(t) = e(nT) \\

int_0^t e(au)dau = sum_{i=0}^{n-1} e(iT) \\

frac{de(t)}{dt} = frac{e(nT)-e[(n-1)T]}{T}

]

因为(T)是固定的,不妨设为1,可简化为:

[e(t) = e(n) \\

int_0^t e(au)dau = sum_{i=0}^n e(i) \\

frac{de(t)}{dt} = e(n)-e(n-1) ]

所以:

[u(n) = K_pe(n) + K_isum_{i=0}^n e(i) + K_d[e(n)-e(n-1)]

]

增量化:

令 (Delta u(n) = u(n) - u(n-1)) 可得:

[ egin{aligned}

Delta u(n) &=

{K_pe(n) + K_isum_{i=0}^n e(i) + K_d[e(n)-e(n-1)]} \\

&~~~~ - {K_pe(n-1) + K_isum_{i=0}^{n-1} e(i) + K_d[e(n-1)-e(n-2)]} \\

&= (K_p + K_i + K_d)e(n) - (K_p + 2K_d)e(n-1) + K_de(n-2)

end{aligned} ]

所以:

[ egin{aligned}

u(n) &= u(n-1) + Delta u(n) \\

Delta u(n) &= a_0e(n) + a_1e(n-1) + a_2e(n-2) \\

a_0 &= K_p + K_i + K_d \\

a_1 &= -(K_p + 2K_d) \\

a_2 &= K_d

end{aligned} ]

C语言实现

dpid.h:

#ifndef __DPID_H__

#define __DPID_H__

typedef struct

{

float Kp, Ki, Kd;

float a[3];

float e[3];

}dpid_t;

void dpid_init(dpid_t *pid, float Kp, float Ki, float Kd);

float dpid(dpid_t *pid, float e);

#endif

dpid.c:

#include "dpid.h"

void dpid_init(dpid_t *pid, float Kp, float Ki, float Kd)

{

pid->Kp = Kp;

pid->Ki = Ki;

pid->Kd = Kd;

pid->a[0] = Kp + Ki + Kd;

pid->a[1] = -(Kp + 2*Kd);

pid->a[2] = Kd;

pid->e[0] = pid->e[1] = pid->e[2] = 0;

}

float dpid(dpid_t *pid, float e)

{

//! 更新误差

pid->e[2] = pid->e[1];

pid->e[1] = pid->e[0];

pid->e[0] = e;

return pid->a[0]*pid->e[0]

+ pid->a[1]*pid->e[1]

+ pid->a[2]*pid->e[2];

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值