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

位置式 PID 控制算法

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
位置式 PID 控制算法
/ P) q% P, q0 ^9 z8 d# u
- W# Q* `4 ?4 D) x2 f/ _/ i) N
在使用单片机作为控制 cpu 时,请稍作简化,具体的 PID 参数必须由具体对象通过实验确定。由于单片机的处理速度和 ram 资源的限制,一般不采用浮点数运算,而将所有参数全部用整数,运算到最后再除以一个 2 的 N 次方数据(相当于移位) ,作类似定点数运算,可大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的 “余数 ”,做好余数补偿。这个程序只是一般常用 pid 算法的基本架构,没有包含输入输出处理部分。/ L0 M- e; A8 p

' r( J% k- N( n: W# e4 G, ^* ~#include <string.h> $ v9 t0 b( E: q1 t! A* H  v' t
#include <stdio.h> 0 |$ F: y, I# }: a, j
0 g* n: P9 T6 y
PID Function
0 _' C6 M% S# B5 A6 o, N+ yThe PID function is used in mainly 8 A2 {1 o- J8 s' c& o' N
control applications. PID Calc peRForms one iteration of the PID
* k6 Z) A6 Y! f6 }& J, v8 malgorithm.
& y. K- r: G$ ]' a% i: D8 I# N6 uWhile the PID function works, main is just a dummy program showing 6 p1 _0 ~  R: G
a typical usage.
* T# a' E% s+ _, o3 g& ~# z) A7 [- c- `4 H
PID 功能
" a% v! d/ {( E" [' H在 PID 功能主要用于控制应用。 PID 计算器执行一个 PID 的迭代算法。虽然 PID 功能的工程,$ a3 G" v; S* G3 ?- H/ z
主要只是一个虚拟程序显示一个典型的使用。
9 I& m1 F  x, Y5 stypedef struct PID {
1 l& ^8 m5 d. P; j- y. ~! v" fdouble SetPoint; // 设定目标 Desired Value
$ D. @/ W2 S3 l) k+ zdouble Proportion; // 比例常数 Proportional Const : [2 y+ V: C2 g4 _
double Integral; // 积分常数 Integral Const 8 e' y: S9 S) T( j, U* E
double Derivative; // 微分常数 Derivative Const
* \+ k+ l- r. r' Xdouble LastError; // Error[-1] / `2 _( x: M8 Y7 }2 D( ]' V
double PrevError; // Error[-2]
* U, m# w9 f) J& H  `/ tdouble SumError; // Sums of Errors
- H  Y$ d0 x" i1 p- C9 E5 Q} PID; 1 W( |% Q% m8 }3 P
double PIDCalc( PID *pp, double NextPoint ) $ a* d) y1 {) F( D  u* h& u4 t$ i( r6 W
{ ) x0 N. M7 z3 ?* k
double dError, Error; 3 p, o9 M6 J% b$ U2 p
Error = pp->SetPoint - NextPoint; // 偏差
7 ?4 A$ V- U- C4 ]) _
% H0 B4 w- V1 D( z* o: U
6 v5 w! r- D& l$ qpp->SumError += Error; // 积分
9 i; W/ X/ H) d. S. E6 m. w( VdError = pp->LastError - pp-> PrevError; // 当前微分
3 I8 L# @% a7 E* T% Wpp-> PrevError = pp->LastError; 9 ?# @  t4 Y: i& H. l
pp->LastError = Error;
: J# q8 c: a  sreturn (pp-> Proportion * Error // 比例项+ F5 M7 B% ]: H* X" h
+ pp->Integral * pp->SumError // 积分项8 y" W! ]& p$ F. K. l+ J
+ pp->Derivative * dError // 微分项0 t9 A3 `' ?+ H/ T* D
); . a  `4 B* G* J, v/ i
}
( B/ u- n6 s& X- H- d% o/*======================= 初始化的 PID 结构 Initialize PID 0 l6 |1 D4 D/ s* v
Structure===========================*/
, a( o$ G6 j6 o, qvoid PIDInit (PID *pp)
/ ]% l1 H" Q' o$ U{ 4 o. Z4 l" D# E
memset ( pp,0,sizeof(PID)); 5 v' ~1 b1 o3 I. |
}
  q) m- v+ U. V2 q  j7 k  @( A/*======================= 主程序 Main
4 \, }. }3 H; @) \' N! M; |0 WProgram=======================================*/ 2 T0 d* q1 l; b3 t
double sensor (void) // 虚拟传感器功能 Dummy Sensor Function{ return 100.0;} 2 }+ L* _- [! i0 ?; \* e
void actuator(double rDelta) // 虚拟驱动器功能 Dummy Actuator Function{} 7 \, Z5 ~9 L- m1 y4 ?- Y! g
void main(void)
8 _, J. F2 K9 s{
- U, I( R+ e, \( gPID sPID; // PID 控制结构 PID Control Structure
0 o6 l  J6 p$ t  K6 E$ tdouble rOut; // PID 响应(输出) PID Response (Output)
+ ]/ O) O9 l! r2 O7 q( f. C- Edouble rIn; // PID 反馈(输入) PID Feedback (Input) ! G: [) D/ |: f
PIDInit ( &sPID ); // 初始化结构 Initialize Structure
( k0 Q8 m4 T' m1 T4 C7 |6 ^" B  nsPID.Proportion = 0.5; // 设置 PID 系数 Set PID Coefficients
% l& n9 j0 T( j, ^sPID.Integral = 0.5; 3 W) i9 u- w# g- r/ H6 G
sPID.Derivative = 0.0;
/ W  I0 ^+ O( ]sPID.SetPoint = 100.0; // 设置 PID 设定 Set PID Setpoint 6 W* Y, U" s" f
for (;;) . j! t3 l# h  p- B
{ // 模拟最多的 PID 处理 Mock Up of PID Processing 2 t* c- p( z) z% k: y3 R/ S+ N
rIn = sensor (); // 读取输入 Read Input
1 g- i* E7 c0 g( C' R6 W5 K5 @  M/ ~, g
' o1 G+ s$ t, b( v* n, c
rOut = PIDCalc ( &sPID,rIn ); // 执行的 PID 迭代 Perform PID Interation , ]$ s$ r# G' q0 y' Y
actuator ( rOut ); // 所需的更改的影响 Effect Needed Changes
* y4 b' T  }, [6 K* R; o7 t/ B/ g' N" Q% C* O! \
游客,如果您要查看本帖隐藏内容请回复
0 K: X4 y5 W% A2 X
( N7 K* b' z3 h% z2 l' X

- ~5 ?6 Z4 u2 G" M$ Q, F! f6 t
$ T% K' p7 [$ F5 Z; a& |# {0 ^- n# }

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-9-4 00:18 , Processed in 0.109375 second(s), 26 queries , Gzip On.

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

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

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