你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32直流电机中PID的控制

[复制链接]
攻城狮Melo 发布时间:2023-3-18 11:59
一.PID控制算法% e0 s  [! g+ v0 W9 d/ Q
1.什么是PID

5 E* e( M4 X2 k9 S2 n4 NPID:Proportion-Integral-Differential( L/ p, f7 Q+ ^! {2 k/ Z

: S8 e) B( h$ f) O% r  _在过程控制中,我们经常使用的一种算法就是PID算法了,所谓PID控制算法就是对偏差进行比例、积分、微分控制,来使偏差趋于某一固定的值,PID核心由三个单元组成:比例单元(P)、积分单元(I)、微分单元(D),PID实际上就是误差控制。
; w/ @9 p  _# J/ l

7 V, C# w5 U2 ~' ?" ^PID控制系统(模拟)的框图如下:
! Y) ~5 B7 f0 t# D" g+ \0 Q, H
8 p1 {/ K" o1 D% a) h
20200428231808887.png
  d, ]) ?4 T8 A* S/ ~1 h4 U4 g# k8 X

  v7 W/ A$ z3 B( o* R+ ~5 u2.PID系数的理解
* o# q9 g7 y  S9 C1 _6 D
理解PID的三个系数,可以结合PID调节时候的响应曲线,要使实际中的响应曲线趋近于理想状态下的响应曲线,无非就是三点灵魂:快速(P)、准确(I)、稳定(D),要想控制的变量保持在完美的状态,这三个灵魂就必须调整好。
0 u3 j9 n8 b# `  E: w4 Q: |
" E$ _3 B  c0 }* k( l3 P  V以下分析中的:P、I、D都指的是PID的三个系数7 K, N/ ]& h- [3 S7 B3 V0 x

; n: C5 d3 Q$ R8 e9 O  \# w, u
下面从三个系数对整体控制的影响做出分析
/ q0 G, g) |; K% N9 x( w3 f
- C& l/ i/ k% d
Ⅰ.比例(P)部分! N8 {! ~$ ~3 [% ?! ^
输入值一旦与目标值产生偏差e,就需要缩小偏差,P就是用来缩小偏差的,使控制量向减少偏差的方向改变,而且P越大,偏差缩小的速度就越快,所以P的作用就是使控制量更快地接近目标值。
  ]! a8 a# s; y# t) y/ {. J: s/ u2 ~$ J0 e4 z3 |
但是!十肇九快!!!P过大的时候,就容易刹不住,很容易超出目标值,当超出目标值时,又会反向朝目标值飞奔,然后又太快了,再次偏离目标值,然后又朝目标值…这样反反复复的在目标值附近震荡,这就是P太大的弊端:不够稳定。
0 c* n+ |4 T2 G. `9 R) }
' }3 X1 Q' E& ?8 F0 [3 J2 X
所以,P大了虽然可以快速响应,但也容易产生震荡,破坏系统的稳定性,可以适当增大D来提高稳定性。
/ r. i  F+ B6 \1 @1 c4 M0 \* E6 q! k' n+ w5 a' A: ~( a# Z& q
$ C3 ^' [0 L/ x+ k5 C+ @
Ⅱ.积分(I)部分
, T: E0 G& s  z) G* {积分的表达式如下:8 e% W+ ~6 Z; o: V. e1 S; k

! E1 i8 T- G7 w# Q1 @$ b
20200428231837441.png % \+ G! I, _4 ^7 }( p" U$ J

6 B7 P0 Y3 b- L$ D3 h8 E- M0 T
从其表达式中可以看出,只要存在偏差,积分结果就会不断增加,也就是控制作用会不断增加;当偏差为0时,积分结果是一个常数,此时控制作用才可能是一个稳定的值。* }: `. ]' e, G7 }  s5 M9 @
6 K6 ~% F# m  x( F* b
所以直观的来看,积分可以消除系统的静态偏差,因为一旦有误差,积分就会增加,系统就会做出反应,直到偏差为0,也就是积分保证了控制的准确性。4 X8 @" F2 m1 e$ J- p

+ ]7 K" \  W7 m( ?9 u1 b
积分的作用虽然会消除静态偏差,但是也会拉低系统的响应速度,就是说I对P有抑制作用。
8 ~. _8 h$ h- @6 T+ K& f
: b$ x1 I) g, w: K- B
3 J' i/ o& F2 j
Ⅲ.微分(D)部分
5 A# ?2 K+ P) }8 w$ z' T( s上面说了,P过大会引起震荡,降低系统稳定性,可以通过提高D来减小震荡。
- {( P9 G/ l1 e
( ]" P. y6 F2 w
微分的作用就是根据偏差的变化趋势预先给出纠正!怎么个预先法呢?因为微分可以看作是求导,上过高中同鞋都知道:求导可以反映函数的变化趋势。所以,通过微分,可以对偏差的变化进行预判地抑制,防止 矫枉过。
& p0 W& p% H9 u  ?2 d$ s8 [
  Z2 B# a! c% i2 i1 Q6 ]! l
微分的引入,有助于减小震荡,使系统趋于稳定,D越大,抑制P的效果就越强。
1 Y' Q4 N( z6 b( {+ A7 ~  ]
6 K6 H8 x+ F7 N0 n
* y# Q( Z& g+ T$ Q
3.PID的数字化处理7 I7 I) z& k4 F  c; Q( q: X5 P& z
由于计算机控制是一种采样控制,只能根据采样时刻的偏差值计算控制量,所以我们是通过软件实现控制算法的,要对PID进行离散化处理(也就是数字化处理),就是根据离散采样点的偏差值进行控制,在离散化处理后,相比于模拟控制由如下改变:
) |- y* D) V3 v9 G. `; s! R由差分代替微分
! D8 [1 X1 d/ ^6 V由累加代替积分
  d8 a6 ^) H6 J0 C& v1 F2 ^
数字化处理后的PID系统如下:
1 B, g/ V8 q( L9 ^% W+ y% H! R$ r9 V, C8 h" Y
20200428231857511.png   Q: S, g4 z# F2 \

8 e! [9 P) ~* u! r采样的周期越小,就越接近模拟控制,控制的效果也就越好。& r3 M0 T/ F% U. S# C
$ q4 u3 v  f' r3 J5 p
2 b1 J9 p' W' ?# I7 B
二.位置闭环控制2 x0 H* h0 f2 ]
位置闭环控制,也叫位置式PID控制,就是传统的PID控制,控制的偏差逐渐接近0,从而使控制量趋于目标值。
0 Q* y. p- P4 j1 e# s- I- X4 x, ?

% }# N0 y. L# O) y) W对电机使用位置闭环控制的时候,就是控制电机的转动位置,通过编码器的脉冲累加测量电机的位置信息,与目标位置进行比较,得到偏差值,通过比例、积分、微分的PID算法进行控制,使偏差趋于0。- `* c4 d) c5 W0 p' ]
/ G, B- y' U. Y5 e3 z
电机控制中,输出量就是电机控制模块输出的占空比,作用于电机转速,此时离散PID的公式如下:5 q5 U( w8 j; N, C* o, c6 y: y

/ s7 E" F) ^/ n$ v
20200428231914180.png 7 g% h/ |) Q: g& P- @
8 H' j7 r( ?* |7 E
其控制框图如下:, g* C) W8 x; L9 T' o
7 K; j/ d8 |  K6 m  y
2020042823193183.png   g7 i/ M. U! v# P& e# s  y
0 K# j8 g/ i( c- p8 j$ g# t  Q  y0 m
控制实现代码如下:
/ F, O( `: R" h3 z0 m, f
  1. /* 返回输出
    5 U2 X& Q9 n( Y. t" ^
  2. *  Encoder为输入(编码器测量的信号,也就是电机转速)# ], K; l3 K( C; ~2 o
  3. *  Target为目标值
    6 l* n' _. C+ O
  4. */. m7 f& B7 F( R6 q
  5. //KP、KI、KD为PID的系数
    2 J% N9 }3 q& f' `6 V$ y7 H. E
  6. int Postition_PID( int Encoder, int Target )
    : M8 L' a2 {4 t, r: v
  7. {        //依次的变量代表:偏差、输出、偏差积分、偏差微分
    9 P0 w( h+ P1 e
  8.         static float Bias,Pwm,Integral_bias,Last_bias;  $ V$ v4 C: C% W2 n' P; r8 X
  9.     Bias = Encoder-Target;//计算偏差
    8 I5 P5 R% Q; o3 t
  10.     Integral_bias += Bias;//计算偏差积分,累加. J1 j$ S4 q; z) u
  11.     Pwm = KP*Bias+KI*Integral_bias+KD*(Bias-Last_bias);//计算输出,根据PID
    / T/ E+ a/ \3 |! w  V5 s+ p' Q
  12.     Last_bias = Bias;//保存为上一次偏差/ }0 ]7 P& q5 T8 y
  13.     return Pwm;//返回输出5 z7 u3 @2 {3 l, C$ B$ z
  14. }
    0 W% k0 B/ Y/ v% Z6 R0 ^6 E* F9 g1 D8 r
  15. 6 \/ |$ o. w4 O" Z
复制代码
- Y' P# f6 T$ E% k& k
在定时中断里实现PID控制,定时中断相当于离散的采样点,中断服务函数中可调用控制函数:
' `& W1 b9 o3 y0 `/ G* @' |
  1. //中断中如下调用
    , z5 d7 w3 {# y  s4 S1 ~" ]
  2. Moto = Postition_PID( Encoder, Target );) Y0 K5 D9 ^( Q1 H
  3. //最终的控制落回到控制电机转速上0 @! o( P/ @# f; V' [
  4. Set_Pwm( Moto );4 \: V) |2 U. H6 O3 C: F
复制代码

; O  ?! W9 U1 Q: A4 M  P最终的控制要落回到电机的控制上,也就是电机的转速控制——PWM控制。3 B; ^% u& s6 j/ w7 o6 O" w

9 v& [  s( v: ]4 `- `' ]6 `/ J位置控制的调节经验:先只使用P控制,逐渐增大P,系统震荡后加入微分控制D来抑制震荡,调整KD直至消除震荡,之后再根据系统对响应和静差的要求,调节P、I参数。
0 N" D0 y8 E7 Y, C4 S8 B
) X0 X8 x9 d% H$ X( d' S; `
8 b9 H$ A* L! T# s, z
三.速度闭环控制

) O! b3 ?6 ~( b  Q速度闭环控制也可叫增量式PID控制,与位置式PID控制不同,位置式PID输出的是控制量新的状态,而增量式PID输出的是控制量的增值,增量式PID的离散公式如下:! R8 u0 e& B: p. Q$ b
, w7 c& i% D$ q  ]9 R8 ]" L( [
20200428232012760.png
  g5 I% ?! P! O# Z' E
- P2 v' W; h1 z' [# p5 n0 C
& }" F1 m3 E2 T4 z, t0 Q: q7 y0 o
位置闭环控制是使电机准确转到某一位置,速度闭环控制是使电机以某一速度转动,在速度闭环控制里,我们只需要使用PI控制即可,所以简化后的公式如下:9 x6 A2 {- O- _# n
7 r9 D5 c! ?. I5 R  U
20200428232038432.png
% I+ G! p/ Z3 U7 S+ l注意:公式直接将控制量的增量加在上一次控制量的状态上了!!!  r/ P& |6 f, T9 R) f( d

6 T$ x8 ~# n/ f- a' @: |0 E3 x
2 E1 A: H. e5 v" k7 z. T0 ^
控制框图如下:
% C% Y3 @: ^5 `7 S1 H" T9 [2 t
2 Y6 F. t5 N9 C# C
20200428232053460.png
9 w& N3 s# r: b
) t1 b* ~4 }! u3 O
$ c. Q' F* @7 h8 O' i' K
控制代码如下:
2 V% i# W, N/ i( Z$ e
  1. /* 返回输出
    6 ~' g$ Z: U) I; o
  2. *  Encoder为输入(编码器测量的信号,也就是电机转速)
    9 L9 N2 N- x* g  |& w
  3. *  Target为目标值" a% U# J1 N( d/ f$ w; e/ P  b
  4. */
    % b+ _: @3 d7 \5 E$ }
  5. //KP、KI为PID的系数* U2 v. o% l! b+ V, o
  6. int Incremental_PI( int Encoder, int Target )! W. _6 P) F$ q  w5 c5 z# L
  7. {        //依次的变量代表:偏差、输出、偏差微分9 X4 |* C/ c6 Y2 W
  8.         static float Bias,Pwm,Last_bias;  
    5 R% `4 _  h- A8 F* x2 s6 p
  9.     Bias = Encoder-Target;//计算偏差
    0 L* V0 r1 J% w, {! {
  10.     Pwm += KP*(Bias-Last_bias)+KI*Bias;//增量式PI3 B0 y$ t& m0 s* K% _  Y  n) l
  11.     Last_bias = Bias;//保存为上一次偏差0 B- p( n1 C7 b  V0 E
  12.     return Pwm;//返回输出
    2 u  o% H6 o2 D9 ?
  13. }: u* \9 F" b! n8 [, L
复制代码

: T6 v( Y) ~/ J% e在定时中断里实现PID控制,定时中断相当于离散的采样点,中断服务函数中可调用控制函数:
$ Z5 l' L  A$ c4 M
  1. //中断中如下调用
    " I! E2 u4 U' f- P8 t  X" P
  2. Moto = Incremental_PI( Encoder, Target );/ n7 A6 A7 h/ \, r7 a" F# P1 n
  3. //最终的控制落回到控制电机转速上
    1 ?# Q- b& @3 D5 z! O$ d' [
  4. Set_Pwm( Moto );
    & |& R2 O. m; c7 f' k6 g: W7 t
复制代码

' {% S6 f2 Z; ], |8 c  t要注意速度闭环控制采用PI控制,公式与PID有所不同,输出的也是控制量的增量,这里将增量直接加在了上一次的状态量上,所以输出的还是控制量的新状态。
4 B; Z8 h: R5 n& a: J/ @( Y
. A4 R. k4 `4 }+ Y. F$ [
最后附上我找到的PID参数调整口诀:+ j; l7 \& F' q! H
& c4 w7 L3 P- o2 j& o, E
常用口诀:
, I/ `+ G0 s# X; @' C6 X- K参数整定找最佳,从小到大顺序查' u3 _) Z  `( X3 R" F, y# x  K
先是比例后积分,最后再把微分加
, G# d1 b( V: q+ T. I# @曲线振荡很频繁,比例度盘要放大
( ^: ~+ R. Q, V0 Q/ t曲线漂浮绕大湾,比例度盘往小扳0 r- O3 t: S7 }$ @3 C
曲线偏离回复慢,积分时间往下降
/ a- K3 ^$ F9 t曲线波动周期长,积分时间再加长/ y! B  ~0 z/ V$ t7 {& J
曲线振荡频率快,先把微分降下来
  R5 M2 G' C4 h! Z! }2 t) F% W% N动差大来波动慢。微分时间应加长6 t" e+ n- t; T, e  p
理想曲线两个波,前高后低4比1, L5 Y/ s% h- c* i3 N9 I% L3 g# S
一看二调多分析,调节质量不会低
1 _  T0 _9 O2 g, |; u1 l4 a————————————————2 _# i" d) j4 F+ T) i0 I8 g
版权声明:Aspirant-GQ# \- [+ M, q3 T. \2 `
如有侵权请联系删除% v( ?- ]) \5 x5 R- d

( ^; b* Q1 G' f7 V4 y+ o. T  }# V4 W2 p" Q, f
/ N: i( @. O5 v+ N+ H. \/ `" \, z
赞 收藏 评论1 发布时间:2023-3-18 11:59

举报

1个回答
Panto 回答时间:2023-4-13 05:44:42

"PID control is implemented in the timing interrupt"

How often ?

Is it related with motor speed ?

Thanks

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版