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

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

[复制链接]
攻城狮Melo 发布时间:2023-3-18 11:59
一.PID控制算法
/ n& v# W, n. d3 R/ [1.什么是PID

6 I% `6 p2 N+ R) E0 t' ^9 R+ M' dPID:Proportion-Integral-Differential
  t) A/ O1 h, |. ?. |! K  s0 ^3 h
( B+ F4 p) q" z在过程控制中,我们经常使用的一种算法就是PID算法了,所谓PID控制算法就是对偏差进行比例、积分、微分控制,来使偏差趋于某一固定的值,PID核心由三个单元组成:比例单元(P)、积分单元(I)、微分单元(D),PID实际上就是误差控制。6 u& k0 e: F/ e; A- Q- j

1 p- A4 j& [$ ]0 lPID控制系统(模拟)的框图如下:: ^( x# h! A2 M, U4 _
: H% E7 f. v5 M3 h8 G
20200428231808887.png 0 X' X: w5 r3 A1 }& S7 Q2 a
, {$ }% ]) ]0 s6 S$ i
# B: f+ v' {5 g- a5 e+ E6 X
2.PID系数的理解

/ p! ]# Q5 N5 Z: m理解PID的三个系数,可以结合PID调节时候的响应曲线,要使实际中的响应曲线趋近于理想状态下的响应曲线,无非就是三点灵魂:快速(P)、准确(I)、稳定(D),要想控制的变量保持在完美的状态,这三个灵魂就必须调整好。' D; @# D, h' ~" g( h8 I; {
0 }+ O  t! W1 Q8 j* Y  v
以下分析中的:P、I、D都指的是PID的三个系数7 J, T3 y! |" P6 G6 Q, ~. h0 E3 b/ _
2 [+ r( I0 X, D6 H# \
下面从三个系数对整体控制的影响做出分析
' B( F) Y6 d+ ~4 Z3 E3 u9 K, `
& Z) ?6 m1 u" |/ w6 j! z! @
Ⅰ.比例(P)部分
0 ^8 G: n9 W* v6 I$ F% L& w/ b输入值一旦与目标值产生偏差e,就需要缩小偏差,P就是用来缩小偏差的,使控制量向减少偏差的方向改变,而且P越大,偏差缩小的速度就越快,所以P的作用就是使控制量更快地接近目标值。2 L9 J: `. f2 y( Q3 |' a
' D5 W3 v' R! I- F* W
但是!十肇九快!!!P过大的时候,就容易刹不住,很容易超出目标值,当超出目标值时,又会反向朝目标值飞奔,然后又太快了,再次偏离目标值,然后又朝目标值…这样反反复复的在目标值附近震荡,这就是P太大的弊端:不够稳定。
5 N5 K! v( Q# Q; X! a$ U: U/ \! w; `$ r
所以,P大了虽然可以快速响应,但也容易产生震荡,破坏系统的稳定性,可以适当增大D来提高稳定性。' f" |8 s" b( m7 m7 d" A9 U3 E6 o

3 I3 m  N! K6 J) v+ Q' `, X8 ^
* ?; E6 D& @6 X8 @6 C
Ⅱ.积分(I)部分
, c+ x1 W" q- N' {. b积分的表达式如下:
# K! g+ ?; O) `8 f* x6 K* ^9 C! O5 b# [8 P
20200428231837441.png
, y  W( B) z9 G$ B* o; [* ]" \0 d/ [; O8 F: M6 ]2 v: c6 V4 q
从其表达式中可以看出,只要存在偏差,积分结果就会不断增加,也就是控制作用会不断增加;当偏差为0时,积分结果是一个常数,此时控制作用才可能是一个稳定的值。' ]. c6 V: d/ P1 a. m
  e! j1 b% T4 I0 I
所以直观的来看,积分可以消除系统的静态偏差,因为一旦有误差,积分就会增加,系统就会做出反应,直到偏差为0,也就是积分保证了控制的准确性。
* m, Y6 l6 Y6 Y3 h( C& q6 R( M& A; O6 H% D$ j1 D
积分的作用虽然会消除静态偏差,但是也会拉低系统的响应速度,就是说I对P有抑制作用。
( @8 {+ q' t& v* ~" C0 o( p7 |. t

" n8 y& |& v% aⅢ.微分(D)部分
4 `# {+ ^" j9 d6 F! H& K4 x' O上面说了,P过大会引起震荡,降低系统稳定性,可以通过提高D来减小震荡。
5 K; ^( d* I. @0 J. H
5 {) H- e( s+ X% q' k7 p
微分的作用就是根据偏差的变化趋势预先给出纠正!怎么个预先法呢?因为微分可以看作是求导,上过高中同鞋都知道:求导可以反映函数的变化趋势。所以,通过微分,可以对偏差的变化进行预判地抑制,防止 矫枉过。
+ ]# c$ ]$ N9 I! ^/ x& [, R" x$ q' Z5 s4 q- U" N$ F. B: L
微分的引入,有助于减小震荡,使系统趋于稳定,D越大,抑制P的效果就越强。, t( a% U- d/ `) e; {! a
, l+ f' w& k8 C& |3 X9 ?
' D* D0 s2 C/ z& P2 ]
3.PID的数字化处理
& ?/ L5 P6 p& |3 h! P/ C) E由于计算机控制是一种采样控制,只能根据采样时刻的偏差值计算控制量,所以我们是通过软件实现控制算法的,要对PID进行离散化处理(也就是数字化处理),就是根据离散采样点的偏差值进行控制,在离散化处理后,相比于模拟控制由如下改变:
4 ]0 e* X- x" H" |8 `6 e4 n. w由差分代替微分
  K3 w, X# u+ v1 Q( }& L由累加代替积分
/ {2 e9 ~* ^4 N; \/ Z4 B) u0 n
数字化处理后的PID系统如下:1 x7 C! I5 X9 p" ~' \
3 ^9 i) M5 j+ ]* ]7 I* K( H
20200428231857511.png 0 d: ~! Y; {- s9 y

1 v, }* o- b9 G1 k' R采样的周期越小,就越接近模拟控制,控制的效果也就越好。$ x5 C7 D/ p0 n/ L8 d9 L) X

( @+ ~8 v$ V& L
8 F4 P7 I) C& H! d. i
二.位置闭环控制" o& w2 p5 ?) u/ k/ O
位置闭环控制,也叫位置式PID控制,就是传统的PID控制,控制的偏差逐渐接近0,从而使控制量趋于目标值。, v2 d8 N# J) e- _

8 ^! j+ |  t0 ]. h8 X对电机使用位置闭环控制的时候,就是控制电机的转动位置,通过编码器的脉冲累加测量电机的位置信息,与目标位置进行比较,得到偏差值,通过比例、积分、微分的PID算法进行控制,使偏差趋于0。
$ L  a- I6 d8 T; e; C' P: i. l, U; _2 D2 B/ p* g
电机控制中,输出量就是电机控制模块输出的占空比,作用于电机转速,此时离散PID的公式如下:3 g5 {: w1 ^: S, Z3 d0 b
; l6 @7 M& \4 N1 ^0 t1 L' [8 f, y
20200428231914180.png
' a" B$ d* V) X& F# p/ w
1 U. z3 E/ B& [* E; s5 _% |& _其控制框图如下:
& X# {& O6 D0 J- y9 p7 W* D/ P4 t. S6 _( _6 k" G
2020042823193183.png
" n5 u8 L( x* m7 I8 j4 t0 ~  Z  k/ y
$ B4 Q# Y" l) s! p8 q' h5 v) s控制实现代码如下:0 Z3 m; e% }6 u* v0 x
  1. /* 返回输出
    3 S! e% s4 s8 N6 w5 X% v6 Z$ \
  2. *  Encoder为输入(编码器测量的信号,也就是电机转速)1 V! [, Z& K& X8 v( w5 |
  3. *  Target为目标值, t/ D  p7 e; a5 E4 }
  4. */
    2 w5 B' u* o1 Q. ~3 G
  5. //KP、KI、KD为PID的系数
    / y* x, }- k3 Y0 A& u- _
  6. int Postition_PID( int Encoder, int Target )" t- g! d( Y' ^. @
  7. {        //依次的变量代表:偏差、输出、偏差积分、偏差微分
    6 r3 t5 I9 D* j0 M8 F
  8.         static float Bias,Pwm,Integral_bias,Last_bias;  " H+ i5 x0 U9 {) j+ [/ z
  9.     Bias = Encoder-Target;//计算偏差3 [- E% s& h' Z4 X, V
  10.     Integral_bias += Bias;//计算偏差积分,累加0 z9 C! b- ?4 q& q- R- b# J* g$ x
  11.     Pwm = KP*Bias+KI*Integral_bias+KD*(Bias-Last_bias);//计算输出,根据PID
    * @" R7 u! `0 R/ g6 f
  12.     Last_bias = Bias;//保存为上一次偏差
    4 t0 M+ C1 t+ }& f7 e( O) Y
  13.     return Pwm;//返回输出
    $ y6 W+ g) D! x" e) y' R+ ^5 P
  14. }+ C5 o, Y  I. g. o# G$ k) q- ]/ b+ ~5 ?' e
  15. # P7 l/ u7 Q" b3 t3 x
复制代码
* s- G9 u' E/ q& U0 n' O
在定时中断里实现PID控制,定时中断相当于离散的采样点,中断服务函数中可调用控制函数:
, s( {& n3 L; O( t+ ~2 z4 K
  1. //中断中如下调用
    $ i. ~+ n$ i7 F& @) p2 ]
  2. Moto = Postition_PID( Encoder, Target );4 L/ l# B% Q! B' }& F. q% L2 a9 I
  3. //最终的控制落回到控制电机转速上
    0 x8 p% m3 P& S6 J$ C" M: m' t
  4. Set_Pwm( Moto );# I( P% r! v, a/ G
复制代码
/ K* ?+ T* q2 d6 r, g+ x0 z
最终的控制要落回到电机的控制上,也就是电机的转速控制——PWM控制。
8 E5 \& [* `. R
  J! S( K* v/ M1 z# K% Y位置控制的调节经验:先只使用P控制,逐渐增大P,系统震荡后加入微分控制D来抑制震荡,调整KD直至消除震荡,之后再根据系统对响应和静差的要求,调节P、I参数。
% t! _. s. @4 j: V2 F/ e$ O- L( c+ O) c. [- A6 g$ ^
$ r; G: l/ `; x2 O  Y" h
三.速度闭环控制
2 Q/ m. z; x' T& f
速度闭环控制也可叫增量式PID控制,与位置式PID控制不同,位置式PID输出的是控制量新的状态,而增量式PID输出的是控制量的增值,增量式PID的离散公式如下:
+ [. H. n, u: G% L: C& F  {  V; u9 }
20200428232012760.png
/ P! y! n6 o* B9 p7 t0 U2 l: |8 O8 i2 D& M$ n. ]2 ^- k( K
$ T" X, c" w" Y! O" u# f2 K2 \
位置闭环控制是使电机准确转到某一位置,速度闭环控制是使电机以某一速度转动,在速度闭环控制里,我们只需要使用PI控制即可,所以简化后的公式如下:- y7 d# h, [2 \8 r
2 a% f! _- G9 h) V% @! v
20200428232038432.png 4 q" Y* P& X  E  Q5 r& q, `
注意:公式直接将控制量的增量加在上一次控制量的状态上了!!!6 ]9 E9 {2 f, E- W: v2 h3 t7 V
0 y3 L5 ~( I2 M
4 Q$ v. a0 x- H* ^; s
控制框图如下:, N5 d- V2 S3 u, D0 S3 C+ G
# o9 ?# }. P" F' u, x
20200428232053460.png
0 O& B! @, ]" e; u9 u
: G' ]3 n; a" `+ G

% O* u; m) n+ Z+ v控制代码如下:
/ z. Z1 p  g- s9 U$ y
  1. /* 返回输出) V/ s; ?* \& S+ u, l! O1 U
  2. *  Encoder为输入(编码器测量的信号,也就是电机转速)$ _) {. f: M" a( s
  3. *  Target为目标值' \1 i1 D6 C9 u, R6 u
  4. */1 _% y4 F5 ^1 \) v" [
  5. //KP、KI为PID的系数- u: M! q& t! k) u$ T2 @
  6. int Incremental_PI( int Encoder, int Target )
    ; D7 Y- A6 x" B5 z% o( Y( A: a
  7. {        //依次的变量代表:偏差、输出、偏差微分
    9 j' N& I8 y, P6 _$ y8 A5 c
  8.         static float Bias,Pwm,Last_bias;  . P6 _$ n- s+ L. R+ z
  9.     Bias = Encoder-Target;//计算偏差7 j/ d' G' \4 U) w. b( C/ |+ w
  10.     Pwm += KP*(Bias-Last_bias)+KI*Bias;//增量式PI
    $ C9 D( K+ L& A# I* k! h- _0 Q. v
  11.     Last_bias = Bias;//保存为上一次偏差  K, s8 M0 K9 Y% F
  12.     return Pwm;//返回输出
    1 ?. H% i9 x" J  w% {* x# B2 P
  13. }& ?) L* |- B# O% k$ O, D; h8 T1 m" i
复制代码

4 _  C0 Y8 l4 D  m0 I- _5 I5 l在定时中断里实现PID控制,定时中断相当于离散的采样点,中断服务函数中可调用控制函数:
2 U+ x" [# [1 d7 ?, v( Q, I
  1. //中断中如下调用- ?' C% C! N6 K. i
  2. Moto = Incremental_PI( Encoder, Target );
    7 W4 A1 }& \# c* ]$ K
  3. //最终的控制落回到控制电机转速上' b+ A' K1 r  m. M# E
  4. Set_Pwm( Moto );
    + [$ U# c' d: k. r! R6 [) U
复制代码

. I6 J: A9 W4 E要注意速度闭环控制采用PI控制,公式与PID有所不同,输出的也是控制量的增量,这里将增量直接加在了上一次的状态量上,所以输出的还是控制量的新状态。
) S7 C+ c" U* S# D+ x* {! P
/ {* m6 ]% E$ B4 D
最后附上我找到的PID参数调整口诀:
. `4 j$ _+ \! j2 V) i6 J& v! w3 ~$ m* v0 {! k6 k4 z$ M7 l
常用口诀:
0 B. ?$ i& \, l* y& Z2 i参数整定找最佳,从小到大顺序查. u+ K! i# X, l0 R6 P
先是比例后积分,最后再把微分加
( J) Z6 P# k) O4 J3 n" i曲线振荡很频繁,比例度盘要放大. |) _6 n. E" F0 w" {  }
曲线漂浮绕大湾,比例度盘往小扳
& V  Z% D. ?( r" E, O4 h曲线偏离回复慢,积分时间往下降
; P1 p$ A, C) y* G5 u曲线波动周期长,积分时间再加长& L' D( I8 y& O: Z2 f9 f  E) V
曲线振荡频率快,先把微分降下来. Z! [: P+ x0 q1 j+ ?
动差大来波动慢。微分时间应加长. B, w( a3 D0 J
理想曲线两个波,前高后低4比1
! O0 ?3 r3 A- ?' M1 Z  ~1 Z# y一看二调多分析,调节质量不会低) X$ l  c1 C) U5 s& L/ a! t7 [, N
————————————————
! g+ a( i$ S4 B3 p2 \& `版权声明:Aspirant-GQ
( x, k1 ^( ^$ R' E7 C4 N! i如有侵权请联系删除2 U- m0 B0 b& e* O! |" s
0 _; M, O/ I1 s: Z" P

& i3 h4 e+ q; }! C! v4 y) w
- O& _2 o6 V& w
收藏 评论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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版