1.根据我控制算法类文章中关于PID的理论的一些描述,同时也根据网络上一些其他的PID文章,以及自己最近一个项目的实践后,总结了几套基于C语言的PID算法,由于网络中很少有人进行分享完整的PID算法实现,我这里分享下。 (1)头文件,定义pid的结构体,类的概念,包含pid的属性和方法 - #ifndef __PID_H_
- #define __PID_H_
- #include <stdint.h>
- typedef struct _pid
- {
- int16_t set_value; // 给定值,rin(k)
- int16_t actual_value; // 实际值,反馈值,rout(k)
- int16_t err; // 偏差值,rin(k) - rout(k)
- int16_t err_last; // 上一次偏差值,rin(k - 1) - rout(k - 1)
- int16_t err_last_last; // 上一次上一次的偏差值,rin(k - 2) - rout(k - 2)
- float kp; // 比例系数
- float ki; // 积分系数
- float kd; // 微分系数
- float uk; // pid公式运算结果值
- float incremental_value; // 增量值
- float integral_value; // 积分值
- float umax; // uk的上限值,抗积分饱和用
- float umin; // uk的下限值,抗积分饱和用
- int16_t err_up_value; // 偏差上限值,积分分离用
- int16_t ki_k; // 积分的再次乘机系数,积分分离用
-
- float out_value; //
-
- float(*position_type)(struct _pid *ppid); // 位置型PID算法,无积分分离、无抗积分饱和
- float(*incremental_type)(struct _pid *ppid); // 增量型PID算法
- float(*integral_separation_type)(struct _pid *ppid); // 积分分离PID算法
- float(*int_sep_anti_sat_type)(struct _pid *ppid); // 积分分离 + 抗积分饱和PID算法
- }_pid_t;
- _pid_t *pid_create(void);
- extern _pid_t *pg_pid;
- #endif
(2).c文件,包含头文件中4个PID算法的实现,包含位置型PID算法、增量型PID算法、积分分离PID算法、积分分离+抗饱和PID算法 (3)PID的实现算法有了,但还是要根据实际情况进行调试选取最适合的PID算法以及修改可能存在的不恰当的位置。
|