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

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

[复制链接]
攻城狮Melo 发布时间:2023-3-18 11:59
一.PID控制算法
  T. c( [# ?) P: ^# u1.什么是PID
6 R# m$ ^' T. z( r3 a
PID:Proportion-Integral-Differential% d/ T( e/ R5 \% N% h, `
' K: r' D7 F* e$ ~* H0 U' ^
在过程控制中,我们经常使用的一种算法就是PID算法了,所谓PID控制算法就是对偏差进行比例、积分、微分控制,来使偏差趋于某一固定的值,PID核心由三个单元组成:比例单元(P)、积分单元(I)、微分单元(D),PID实际上就是误差控制。" e: Z" A0 p* E5 L( J- @' Y( }
6 J2 |0 P' a! Q
PID控制系统(模拟)的框图如下:
  d' Z; }, u- @+ p- L3 P
' [$ d2 k- X' {6 F
20200428231808887.png ( D: U4 ]' P; R

' G6 w/ f) W( |$ a$ M

4 z! O3 n+ o7 J6 K2.PID系数的理解

+ ^1 ^3 p  S- V8 x- _! O理解PID的三个系数,可以结合PID调节时候的响应曲线,要使实际中的响应曲线趋近于理想状态下的响应曲线,无非就是三点灵魂:快速(P)、准确(I)、稳定(D),要想控制的变量保持在完美的状态,这三个灵魂就必须调整好。3 u7 f' G9 \, U2 k& ^2 p' Z, y

/ f0 g! {# j+ M以下分析中的:P、I、D都指的是PID的三个系数+ r/ c% U( G6 s+ M" R$ D6 K' Y+ m  S

0 E3 a5 X/ H6 ~2 H% h* U
下面从三个系数对整体控制的影响做出分析
& F; M5 l' {5 ^: F& w* P( _, M9 E) w
Ⅰ.比例(P)部分" i$ x0 h8 r: q- z6 M) A/ h
输入值一旦与目标值产生偏差e,就需要缩小偏差,P就是用来缩小偏差的,使控制量向减少偏差的方向改变,而且P越大,偏差缩小的速度就越快,所以P的作用就是使控制量更快地接近目标值。* u1 M1 ^7 v4 ?0 y2 `
4 R$ G+ T5 N1 x5 N4 v
但是!十肇九快!!!P过大的时候,就容易刹不住,很容易超出目标值,当超出目标值时,又会反向朝目标值飞奔,然后又太快了,再次偏离目标值,然后又朝目标值…这样反反复复的在目标值附近震荡,这就是P太大的弊端:不够稳定。( t3 @# d/ x, I7 k9 m% V
3 _; i, i$ Z5 L7 G0 k$ ]9 w6 g) L8 S
所以,P大了虽然可以快速响应,但也容易产生震荡,破坏系统的稳定性,可以适当增大D来提高稳定性。
% {7 t1 b9 P; |3 {3 e. w3 m* X9 p2 R% f3 F& G
! f9 x/ k; A" ~# j5 N
Ⅱ.积分(I)部分* ?5 V3 Y+ |3 A! W
积分的表达式如下:
$ j8 r( s. d* ^; ?( G4 [! h' o
8 l* [" \: Y/ n$ f7 u+ n: x
20200428231837441.png : S) f2 R: t( a6 R4 V7 |- ~8 n' Z) h

. G1 A0 R2 t- r: d; b
从其表达式中可以看出,只要存在偏差,积分结果就会不断增加,也就是控制作用会不断增加;当偏差为0时,积分结果是一个常数,此时控制作用才可能是一个稳定的值。% E% ], H6 ?5 W' Z* _+ B* E$ `
; t6 B8 l: N8 X) K& F
所以直观的来看,积分可以消除系统的静态偏差,因为一旦有误差,积分就会增加,系统就会做出反应,直到偏差为0,也就是积分保证了控制的准确性。  O8 L  x/ e$ I5 `  m6 D
6 \) U, h* T: p6 R. d6 o; N
积分的作用虽然会消除静态偏差,但是也会拉低系统的响应速度,就是说I对P有抑制作用。
4 e( \1 ]9 Y! J5 h# f& G* G8 m* M1 q4 v* y% H5 r9 S" L
, H8 h% D7 Y, e! c. ~9 l+ z8 ?: ^
Ⅲ.微分(D)部分
1 E: o/ y. a: O: A+ @8 @上面说了,P过大会引起震荡,降低系统稳定性,可以通过提高D来减小震荡。
' L# X! M5 z- @
* H( g) r' |/ D) X3 f  c
微分的作用就是根据偏差的变化趋势预先给出纠正!怎么个预先法呢?因为微分可以看作是求导,上过高中同鞋都知道:求导可以反映函数的变化趋势。所以,通过微分,可以对偏差的变化进行预判地抑制,防止 矫枉过。0 ]/ i7 @5 N  X3 q3 B

, n* J1 M5 t8 A2 J* h7 L' I- G  `
微分的引入,有助于减小震荡,使系统趋于稳定,D越大,抑制P的效果就越强。
: O* a, f7 W5 m8 h9 n7 I, S" D% Y1 o

* ?. r# q  F; P3.PID的数字化处理
$ S, }9 w; t# X由于计算机控制是一种采样控制,只能根据采样时刻的偏差值计算控制量,所以我们是通过软件实现控制算法的,要对PID进行离散化处理(也就是数字化处理),就是根据离散采样点的偏差值进行控制,在离散化处理后,相比于模拟控制由如下改变:- F$ ]. j/ E4 @/ b! i
由差分代替微分
: w7 s+ U  T3 D6 N由累加代替积分
/ ~" U4 c5 w0 m# E. O
数字化处理后的PID系统如下:  Z+ G: [9 z; J
& d  o3 b3 O+ Z8 D( e9 n) c
20200428231857511.png
) K" {& D( f2 Z* u7 Q8 J/ V
9 h9 N) ~' q# G1 ^
采样的周期越小,就越接近模拟控制,控制的效果也就越好。9 e$ N  \6 ^9 A# ]6 N
! \4 u* W2 E% @8 n1 I
. |9 x6 q0 d0 C" }$ t4 R/ g
二.位置闭环控制, ]" E& f, z1 T6 D
位置闭环控制,也叫位置式PID控制,就是传统的PID控制,控制的偏差逐渐接近0,从而使控制量趋于目标值。3 ~" b  ^* D7 ^
) j- k$ {* D1 T* c* i- D
对电机使用位置闭环控制的时候,就是控制电机的转动位置,通过编码器的脉冲累加测量电机的位置信息,与目标位置进行比较,得到偏差值,通过比例、积分、微分的PID算法进行控制,使偏差趋于0。+ z. `$ D) K7 S0 n+ n2 B; q

% I  W+ D+ {3 A$ E  L. K$ @电机控制中,输出量就是电机控制模块输出的占空比,作用于电机转速,此时离散PID的公式如下:; A( X3 d. r! e  ]; Z9 o

* J7 c  q2 H/ n+ F
20200428231914180.png 3 y& ~; |0 ^; f8 n2 P$ k1 t. |

' T' B0 T* e, l7 p$ y其控制框图如下:
! v' W6 ?& ]! C9 Q6 ?0 K4 m. `
0 E/ n, H  }! b( @7 [
2020042823193183.png , F$ G' Z, i$ |5 t& J# x

4 ?. ^5 }  R) D2 |' L! q控制实现代码如下:
+ P6 F1 H. ?$ k8 r2 n
  1. /* 返回输出
    ! K* s6 n4 O# m( s5 |+ C
  2. *  Encoder为输入(编码器测量的信号,也就是电机转速)8 e% |: C# h1 z! M
  3. *  Target为目标值
    + c) }! d* T1 P, I
  4. */1 g/ g5 w8 k# e9 ?" A5 i3 E
  5. //KP、KI、KD为PID的系数
    & s( l. T4 h+ n
  6. int Postition_PID( int Encoder, int Target )9 C$ x2 w8 ~( E( x0 \5 D% T1 K5 P
  7. {        //依次的变量代表:偏差、输出、偏差积分、偏差微分
    $ k9 b  ]: u" j4 r* Y: D
  8.         static float Bias,Pwm,Integral_bias,Last_bias;  # R2 g: x5 j; y) X
  9.     Bias = Encoder-Target;//计算偏差: Q: N5 ^  V& i: e  E' N3 v" t
  10.     Integral_bias += Bias;//计算偏差积分,累加
    6 U  ~% ]# b& i* E& N
  11.     Pwm = KP*Bias+KI*Integral_bias+KD*(Bias-Last_bias);//计算输出,根据PID6 A) R4 W/ p. N5 j
  12.     Last_bias = Bias;//保存为上一次偏差2 X7 [% V6 B) u, q, j! A) j
  13.     return Pwm;//返回输出
    ( D4 C9 ]' y4 g2 ]. U7 O
  14. }  r% s2 z0 s3 s/ s9 y& _. Y

  15. 5 \2 a& F8 `0 ^; C
复制代码

4 X' H- X; l$ F( U, h在定时中断里实现PID控制,定时中断相当于离散的采样点,中断服务函数中可调用控制函数:( z8 a( }$ x/ V  u8 ~
  1. //中断中如下调用! T, f9 R- Y7 ~- @
  2. Moto = Postition_PID( Encoder, Target );
      R' B: D9 p# j
  3. //最终的控制落回到控制电机转速上( T8 _' Q* T3 B" H+ ?3 s) {" I9 {
  4. Set_Pwm( Moto );! U( j2 F4 d; X$ V( L
复制代码
. I( D+ X; |, X0 Z7 g& o
最终的控制要落回到电机的控制上,也就是电机的转速控制——PWM控制。7 D# ^. p7 L3 V7 }  ?* S( K
2 k2 d% `  v3 \  v8 M- u5 P' u5 I) h
位置控制的调节经验:先只使用P控制,逐渐增大P,系统震荡后加入微分控制D来抑制震荡,调整KD直至消除震荡,之后再根据系统对响应和静差的要求,调节P、I参数。
. U- T5 A4 u  B0 |( C
; d; Q# l5 Q- [0 v1 y; W: S
/ ]( v  f( o* f. Z% Q
三.速度闭环控制

$ g  e: D4 W# M% h4 W9 _6 D) _, P速度闭环控制也可叫增量式PID控制,与位置式PID控制不同,位置式PID输出的是控制量新的状态,而增量式PID输出的是控制量的增值,增量式PID的离散公式如下:
; m( v" r8 z/ ^" D' i; u$ j# a+ W& M
20200428232012760.png
3 u: y# v5 S9 g) a- Z# d  D/ d3 C) F3 N) t% q
8 h- @) _. h, l( b
位置闭环控制是使电机准确转到某一位置,速度闭环控制是使电机以某一速度转动,在速度闭环控制里,我们只需要使用PI控制即可,所以简化后的公式如下:7 ]( x; L" g6 M: [/ A! k2 J
$ y1 W3 q' k9 J+ b* g( u; W
20200428232038432.png
3 Z6 M1 g0 |+ L8 B9 {. }2 A注意:公式直接将控制量的增量加在上一次控制量的状态上了!!!1 w1 C) x: E. X4 h9 t
7 b5 b" D% r3 h- [5 P; i1 f

8 N" e5 f  q8 @( j; v: J; |  E5 o控制框图如下:! K& S) s! t+ u+ M# C  a
3 U* v- u2 ~7 O2 N. l- P
20200428232053460.png , E8 Y, l* E( f; v

8 A7 D3 C0 a5 ?; }7 d, D: y
* N. R0 T' P% ?" D
控制代码如下:
: V* i0 W4 ~, v( i- g
  1. /* 返回输出
    & b1 Q9 v3 G- }2 ?4 `
  2. *  Encoder为输入(编码器测量的信号,也就是电机转速)
    1 h7 D+ Q6 {1 Y2 c
  3. *  Target为目标值
    6 R! G3 v3 @- R& z  \  P3 S! _
  4. */
    5 X( ]( Q& I$ q2 i3 e* f, O' ]5 S
  5. //KP、KI为PID的系数
    4 ?* c* g1 x% |2 f7 h. N
  6. int Incremental_PI( int Encoder, int Target )
    # J; c8 w! L. W3 h
  7. {        //依次的变量代表:偏差、输出、偏差微分% R$ R! r# S) J! I3 j
  8.         static float Bias,Pwm,Last_bias;  
    8 d7 D- |0 ~3 p/ Y: e: k/ |- \' W
  9.     Bias = Encoder-Target;//计算偏差
    3 H8 m# r  n& q  `* [  }( X. \3 o
  10.     Pwm += KP*(Bias-Last_bias)+KI*Bias;//增量式PI
    & k. K* y" l& S; F  F1 O
  11.     Last_bias = Bias;//保存为上一次偏差
    8 B  V$ A1 f! w3 H0 o( |1 N
  12.     return Pwm;//返回输出
    . ^% q3 q4 @; l) `
  13. }
    % S! T0 G$ n$ R, z) i6 f$ Y) ]
复制代码
' n* Z$ \8 H/ |: t! w. r
在定时中断里实现PID控制,定时中断相当于离散的采样点,中断服务函数中可调用控制函数:" z" k$ F9 O8 B- K0 G4 {
  1. //中断中如下调用
    ) |+ A0 @& O$ {# H$ i9 `5 o9 P
  2. Moto = Incremental_PI( Encoder, Target );' C, Z/ W! K7 f
  3. //最终的控制落回到控制电机转速上2 @1 \; k' J7 v: B6 N
  4. Set_Pwm( Moto );# Y. {% I5 N8 O, e
复制代码
# m7 I* A+ C+ K( r3 Y
要注意速度闭环控制采用PI控制,公式与PID有所不同,输出的也是控制量的增量,这里将增量直接加在了上一次的状态量上,所以输出的还是控制量的新状态。
  g& _$ \: ^: T3 q( w5 G

  q8 A9 b( \  M3 s最后附上我找到的PID参数调整口诀:
( S5 H/ {/ b1 ?  J* T
) f0 @+ W$ t0 b& i& s7 G常用口诀:
1 g7 N' v8 `2 i) _% d5 i. \; J* K参数整定找最佳,从小到大顺序查$ p' c* i, R: K7 v# ^7 J
先是比例后积分,最后再把微分加/ Q# T, {9 Z7 w& P  g1 a
曲线振荡很频繁,比例度盘要放大1 ?* |; r4 k- ~2 w* O' Z7 G
曲线漂浮绕大湾,比例度盘往小扳  t5 ~* ~) I; N7 |, T
曲线偏离回复慢,积分时间往下降& M* m( q9 v1 @# m4 @- ~; f
曲线波动周期长,积分时间再加长
# d: _8 V& H! }2 t: F曲线振荡频率快,先把微分降下来
+ A3 a0 X4 U2 s( d8 l; t) E; I动差大来波动慢。微分时间应加长
' M8 C" T* j* Y6 E3 Y! f% p理想曲线两个波,前高后低4比1# V0 \  w2 Q: I
一看二调多分析,调节质量不会低
1 l6 H4 I: [' d* |* \8 ~————————————————
; S7 E! |- i; m* t版权声明:Aspirant-GQ
% k2 z. h8 r6 w% c6 W% H+ ]6 L如有侵权请联系删除
2 H5 c5 A9 X6 H- x6 v
  u4 b0 j6 [* m! K" m  ]1 Z) c% ?' [0 o% k: \

. H! h! M7 T2 Y
收藏 评论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 手机版