找回密码
 注册
关于网站域名变更的通知
查看: 372|回复: 1
打印 上一主题 下一主题

位置式 PID 控制算法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-1-8 13:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
位置式 PID 控制算法

. K- [6 I, b: T. o$ X7 v0 G* q1 W! C: S4 W# E6 @# L
在使用单片机作为控制 cpu 时,请稍作简化,具体的 PID 参数必须由具体对象通过实验确定。由于单片机的处理速度和 ram 资源的限制,一般不采用浮点数运算,而将所有参数全部用整数,运算到最后再除以一个 2 的 N 次方数据(相当于移位) ,作类似定点数运算,可大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的 “余数 ”,做好余数补偿。这个程序只是一般常用 pid 算法的基本架构,没有包含输入输出处理部分。
5 X2 P1 L3 {" [4 _$ L7 p8 S
/ [6 Z3 L3 c1 d- z9 U#include <string.h> * j* w) L5 ~- g4 [' R) }
#include <stdio.h>
; U. t. l$ W, V/ S. }$ {: \; D, _' U& w% {7 B6 _/ c
PID Function # j4 ]# r4 ], H( P* H* A5 `# C
The PID function is used in mainly
. ^  X, X, j% S; |5 Kcontrol applications. PID Calc peRForms one iteration of the PID + Y2 @4 V1 x. F5 Z" Z& S% V
algorithm.
1 U; _2 x, k: yWhile the PID function works, main is just a dummy program showing
$ E, x. ~0 \$ l. c! Ka typical usage. , z+ W  {: H2 v0 V0 r  o
+ r" }. @7 _, R) f0 y% q& y
PID 功能  _2 ^' }' L! ]; z
在 PID 功能主要用于控制应用。 PID 计算器执行一个 PID 的迭代算法。虽然 PID 功能的工程,! N- d9 o7 K5 {5 i2 ?- J! R
主要只是一个虚拟程序显示一个典型的使用。
, n/ m" |/ }7 q& N# Y3 jtypedef struct PID {
  d- p2 K7 o/ ^+ Q( Adouble SetPoint; // 设定目标 Desired Value
- g; k0 D, E8 b0 h2 W( }/ Ddouble Proportion; // 比例常数 Proportional Const - P; U& ^/ R; F6 C( U
double Integral; // 积分常数 Integral Const
: e% ^+ B7 Z3 h8 U9 i8 E; s+ _; {double Derivative; // 微分常数 Derivative Const ; Z* p1 p' w% G: T" b4 q' i
double LastError; // Error[-1]
+ q+ W' Q- q8 e8 x; E1 h" e$ Hdouble PrevError; // Error[-2] ' L1 j- e+ L: z) f3 b9 t
double SumError; // Sums of Errors 9 f. u) y& @: Q) ?
} PID;
6 J$ w! h1 K: x( u) ydouble PIDCalc( PID *pp, double NextPoint )
1 j1 k# r1 N/ Q- E9 O{
6 _( ^8 e: Z4 m6 p1 ~# z3 ldouble dError, Error; . s" L7 b4 I1 s; v! L: k+ [' u
Error = pp->SetPoint - NextPoint; // 偏差9 e* w" C" O& B+ \) f
/ f& d! O. i; j5 S; q! s

1 D- ~- Q% B- j) Kpp->SumError += Error; // 积分
6 R. P/ p. }! BdError = pp->LastError - pp-> PrevError; // 当前微分4 e9 O  Q; P4 ]
pp-> PrevError = pp->LastError; * [. O5 y7 a/ X; t$ b0 j
pp->LastError = Error;
; a3 j5 R  c& {* wreturn (pp-> Proportion * Error // 比例项% E4 c3 f; W/ Q2 V+ v& T, c' o
+ pp->Integral * pp->SumError // 积分项# I8 g8 g, q" i4 F
+ pp->Derivative * dError // 微分项9 ?' [" b/ w  }
); . Q: }( `) Y9 x& W$ ]/ r
} , ?' u9 i8 A: e; x/ O* I
/*======================= 初始化的 PID 结构 Initialize PID
0 D$ \7 N" [: v! r) ^2 bStructure===========================*/ & R- n9 P9 z; C$ S! m& e6 j5 `
void PIDInit (PID *pp)
$ s$ Z# k& p' C8 Y/ E9 `4 v{ " {4 C  T5 d+ y8 C' R9 A3 h
memset ( pp,0,sizeof(PID)); ! f- T6 `  X! [: S
} 3 ]6 {# z) V4 ~8 c$ [) J" G
/*======================= 主程序 Main
3 `( a- v+ B% e3 \Program=======================================*/
, |2 ]5 o  u3 U5 @# Q% odouble sensor (void) // 虚拟传感器功能 Dummy Sensor Function{ return 100.0;}
8 ]# E+ x% ~/ [2 x* zvoid actuator(double rDelta) // 虚拟驱动器功能 Dummy Actuator Function{}
) Z" }7 P3 ?  T* r7 xvoid main(void)
% f. y4 |, N5 V! N; i' H4 x{ ! |0 \! b8 }" e& w: y
PID sPID; // PID 控制结构 PID Control Structure & ^7 R; f2 c5 h  Q9 V- W
double rOut; // PID 响应(输出) PID Response (Output) & B; S8 |- @+ t
double rIn; // PID 反馈(输入) PID Feedback (Input)
7 I2 \2 G* |. N! r0 A  pPIDInit ( &sPID ); // 初始化结构 Initialize Structure
/ r- t, b! X& q$ M$ DsPID.Proportion = 0.5; // 设置 PID 系数 Set PID Coefficients
% Y" A& x. g4 u( ^1 P* k1 u( EsPID.Integral = 0.5; ) D6 X4 \! I& _) s% H( _7 n  P+ t
sPID.Derivative = 0.0; ' Y" _" {8 H' L( b, y
sPID.SetPoint = 100.0; // 设置 PID 设定 Set PID Setpoint
5 Q$ N; P( v4 N' Ifor (;;) # M9 C  m1 |% X" ?3 W
{ // 模拟最多的 PID 处理 Mock Up of PID Processing
1 r. N; Q, `/ A6 \( v/ D( ?rIn = sensor (); // 读取输入 Read Input* P  B$ c; j3 g6 F  G
5 h5 r. N: A$ _% h' ^+ ?

9 e* j; m3 O9 t4 V( k) UrOut = PIDCalc ( &sPID,rIn ); // 执行的 PID 迭代 Perform PID Interation
2 b; Y% k5 F& Dactuator ( rOut ); // 所需的更改的影响 Effect Needed Changes
' B0 V+ _1 {" A5 {. d" `
( F3 g, k/ j! y6 ~- O3 F9 U
游客,如果您要查看本帖隐藏内容请回复
" T) C9 F$ d0 g, S0 |# k
& B3 k+ i- _- b" N1 j& U& U

) @+ Z* c, a/ v& F  |$ |/ A. e1 L/ G9 `! F2 Y7 v' D
2 R% \& ]* m" L3 M

该用户从未签到

2#
发表于 2020-1-8 19:19 | 只看该作者
位置式 PID 控制算法
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-18 15:41 , Processed in 0.125000 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表