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

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

[复制链接]
攻城狮Melo 发布时间:2023-3-18 11:59
一.PID控制算法
2 Z( L9 F) _  `5 ~1.什么是PID
/ e0 u, s8 w- g+ Y2 t
PID:Proportion-Integral-Differential, t  X) m6 S2 @' W
3 ^0 b( A& G7 X% A
在过程控制中,我们经常使用的一种算法就是PID算法了,所谓PID控制算法就是对偏差进行比例、积分、微分控制,来使偏差趋于某一固定的值,PID核心由三个单元组成:比例单元(P)、积分单元(I)、微分单元(D),PID实际上就是误差控制。& S' K. s1 _9 p- w8 C! m% Y. q
; \9 c; {3 [- d7 |9 A% \, T7 v( C1 f
PID控制系统(模拟)的框图如下:; }7 p9 W" h/ {7 ?. F2 N

* n; M7 p3 u& r6 M
20200428231808887.png * P' H% r% e! D) d6 D: w

6 ?; @8 x! F% ?7 b$ B+ z" ^7 C
% F% X  W  k: W) D" d
2.PID系数的理解
; r# i, q9 a# t4 d9 Z# h* j
理解PID的三个系数,可以结合PID调节时候的响应曲线,要使实际中的响应曲线趋近于理想状态下的响应曲线,无非就是三点灵魂:快速(P)、准确(I)、稳定(D),要想控制的变量保持在完美的状态,这三个灵魂就必须调整好。
6 V( f" L- t1 q
2 v5 X* x& M- W3 }, O3 a* U以下分析中的:P、I、D都指的是PID的三个系数" F$ w. p! J% M( j, ]/ e
3 S& W+ }, w0 }2 Z7 f+ G7 E* F
下面从三个系数对整体控制的影响做出分析
: y' [* h# M8 R1 F& q+ b  i' I) E9 L0 Z) r$ `  n- Q
Ⅰ.比例(P)部分
1 Y( R6 t! ~- |- ?9 T& }& }4 I7 }9 d输入值一旦与目标值产生偏差e,就需要缩小偏差,P就是用来缩小偏差的,使控制量向减少偏差的方向改变,而且P越大,偏差缩小的速度就越快,所以P的作用就是使控制量更快地接近目标值。8 a6 Y  ^  [5 t( H( Q
5 W! j9 C' o1 F0 |
但是!十肇九快!!!P过大的时候,就容易刹不住,很容易超出目标值,当超出目标值时,又会反向朝目标值飞奔,然后又太快了,再次偏离目标值,然后又朝目标值…这样反反复复的在目标值附近震荡,这就是P太大的弊端:不够稳定。# t3 g  L2 `5 N- s4 ]- D
  X' j5 W( t+ M  U0 r! I, D
所以,P大了虽然可以快速响应,但也容易产生震荡,破坏系统的稳定性,可以适当增大D来提高稳定性。
! B( n* N3 u1 T
" ?1 M2 e6 F+ J* c
" }& a3 N7 l7 I9 L4 K
Ⅱ.积分(I)部分  l. G0 u8 D3 y1 R
积分的表达式如下:/ A5 ]# O; D" Y! k9 p. K- A5 E

% |, g; w+ b3 x
20200428231837441.png 7 _- z: ]  e6 k9 v
: h2 t; F; S- p) |: R& C0 t
从其表达式中可以看出,只要存在偏差,积分结果就会不断增加,也就是控制作用会不断增加;当偏差为0时,积分结果是一个常数,此时控制作用才可能是一个稳定的值。% i' a! w$ ^( P! n: {

& ~. ]0 \- f6 p% V+ `/ y' y
所以直观的来看,积分可以消除系统的静态偏差,因为一旦有误差,积分就会增加,系统就会做出反应,直到偏差为0,也就是积分保证了控制的准确性。
/ L+ E1 l" ~  C# j! S2 a' T  C0 V6 K/ t; w0 Z! Y4 Z2 |" ~" m
积分的作用虽然会消除静态偏差,但是也会拉低系统的响应速度,就是说I对P有抑制作用。
4 Z. C! s* t( q6 v% ^
1 X, ~9 K6 Q# s8 Q
; k2 X& `  P( z9 k1 X2 U
Ⅲ.微分(D)部分
- u  e  P& L7 [1 N: d; Y' f0 I上面说了,P过大会引起震荡,降低系统稳定性,可以通过提高D来减小震荡。) `) s& z# A+ M8 z5 i" _$ r

; _* |2 F9 ^2 d( W5 j
微分的作用就是根据偏差的变化趋势预先给出纠正!怎么个预先法呢?因为微分可以看作是求导,上过高中同鞋都知道:求导可以反映函数的变化趋势。所以,通过微分,可以对偏差的变化进行预判地抑制,防止 矫枉过。
! B( B) g7 [6 V
+ z+ P) {- H2 j1 m8 I& M, W* V) W+ N8 @
微分的引入,有助于减小震荡,使系统趋于稳定,D越大,抑制P的效果就越强。
! t  b) B9 K! D" k. i& g  T
: [0 \) R! c9 t8 }/ h' k

  i8 M: D; @+ F3.PID的数字化处理. V* [+ i( `, I6 Z2 X& W" p
由于计算机控制是一种采样控制,只能根据采样时刻的偏差值计算控制量,所以我们是通过软件实现控制算法的,要对PID进行离散化处理(也就是数字化处理),就是根据离散采样点的偏差值进行控制,在离散化处理后,相比于模拟控制由如下改变:
  T1 s; D( ~( F; M3 [( ]由差分代替微分
* X2 c( G0 A2 `4 \& ~+ x由累加代替积分
) U! \, s& k  _  S( \2 h
数字化处理后的PID系统如下:
" i4 M( C$ R4 f) q& \
4 c; W9 P. T$ z: I: _% D# r+ K0 a
20200428231857511.png 4 t, q9 l0 Q' n4 C* X' B% y

, e/ D* I% Z( j采样的周期越小,就越接近模拟控制,控制的效果也就越好。
& w2 j# M  Y- j2 I7 t. N) f( t. i

6 ?; \1 E* a8 [8 V0 M二.位置闭环控制/ V" N1 `5 d9 Y
位置闭环控制,也叫位置式PID控制,就是传统的PID控制,控制的偏差逐渐接近0,从而使控制量趋于目标值。
& V* w' a* |) w5 s; s, E

2 B+ Q' ], f1 S  K# ~. m2 ?) n对电机使用位置闭环控制的时候,就是控制电机的转动位置,通过编码器的脉冲累加测量电机的位置信息,与目标位置进行比较,得到偏差值,通过比例、积分、微分的PID算法进行控制,使偏差趋于0。
* q8 f( Y- u8 A/ v+ R) ^
6 B/ T* F- @6 }+ |% K: |( A  {电机控制中,输出量就是电机控制模块输出的占空比,作用于电机转速,此时离散PID的公式如下:
8 u6 Y, X  M" h" k& T$ f: [' G6 w& K7 A
20200428231914180.png
8 O* l6 r1 S+ d9 I
2 A: v9 K1 J: Y# z其控制框图如下:. v# Z$ n. K% L5 @" r

6 f. t6 G+ @1 P# F& {( d
2020042823193183.png ) {6 \9 n0 O! T  J0 `9 T0 h8 L8 b
' D# K: Q$ g/ }' T
控制实现代码如下:' h3 C8 m$ p* D6 y, A# S
  1. /* 返回输出
    " C( J! V+ M) N  }% \8 S) U
  2. *  Encoder为输入(编码器测量的信号,也就是电机转速)  [8 R$ i" E6 x* d1 k7 h, E
  3. *  Target为目标值4 m7 _* I. s6 r& m
  4. */: x+ c* [3 R7 D7 ?- u; h# G
  5. //KP、KI、KD为PID的系数0 r! a, L. Q: V: R' {+ C
  6. int Postition_PID( int Encoder, int Target )
    & D# H5 ]5 X# {* M
  7. {        //依次的变量代表:偏差、输出、偏差积分、偏差微分
    1 p. _4 M# X$ d) u) ^
  8.         static float Bias,Pwm,Integral_bias,Last_bias;  . L$ t) h' F( d
  9.     Bias = Encoder-Target;//计算偏差$ r  M" V) L% N+ Z: _0 b3 G" U% n
  10.     Integral_bias += Bias;//计算偏差积分,累加
      D# @1 Y  `+ e/ g2 j
  11.     Pwm = KP*Bias+KI*Integral_bias+KD*(Bias-Last_bias);//计算输出,根据PID
    2 X7 U4 i3 ?" Y+ {
  12.     Last_bias = Bias;//保存为上一次偏差% A0 o0 F2 m" K, W
  13.     return Pwm;//返回输出* z% \, f; P# H1 E
  14. }  b# j2 o4 @3 T8 H9 r2 h9 w* @; ]

  15. # Z) |8 M/ m' x! R# Z/ D
复制代码

5 J' v$ Q1 v/ V: M8 b# U在定时中断里实现PID控制,定时中断相当于离散的采样点,中断服务函数中可调用控制函数:
  d& c" N4 ?, B. c, ^/ n2 n; \- V
  1. //中断中如下调用
    " p! l* v9 L0 ?! p* c0 ^6 l- `, x
  2. Moto = Postition_PID( Encoder, Target );* a  z9 F5 P5 X. U! K  \8 |
  3. //最终的控制落回到控制电机转速上' C8 v6 t( x( d" ~) q
  4. Set_Pwm( Moto );0 Y/ R: V7 S7 D' D! ?7 o$ U
复制代码

) ~& L& r4 }7 R9 \5 E8 z" U6 M最终的控制要落回到电机的控制上,也就是电机的转速控制——PWM控制。; F. K3 M4 X: `' k

" Z# |! Z# z# {* a7 \位置控制的调节经验:先只使用P控制,逐渐增大P,系统震荡后加入微分控制D来抑制震荡,调整KD直至消除震荡,之后再根据系统对响应和静差的要求,调节P、I参数。
. a  _  l% x1 o. A* B* [4 i. C4 r) K2 i( K( d
; U" h1 Y- }3 Q; n1 [: E
三.速度闭环控制

7 A) i* X& N- E2 }8 U. F& H7 P速度闭环控制也可叫增量式PID控制,与位置式PID控制不同,位置式PID输出的是控制量新的状态,而增量式PID输出的是控制量的增值,增量式PID的离散公式如下:
: R  Z9 v5 }1 O0 h8 Q8 u" J# y8 A; M6 a9 ?
20200428232012760.png
, N: m  `' F9 \$ a; F8 W& [7 Y; e: B& R3 b( i$ m# d0 r

$ q9 @( h4 Q- V$ f: T位置闭环控制是使电机准确转到某一位置,速度闭环控制是使电机以某一速度转动,在速度闭环控制里,我们只需要使用PI控制即可,所以简化后的公式如下:
9 C$ F1 I+ g1 E" ^+ a/ L2 ^$ f1 A- M' ^7 W- r$ p9 ~
20200428232038432.png 5 T; Y0 A" g8 `
注意:公式直接将控制量的增量加在上一次控制量的状态上了!!!* Y( _& p  q6 ]
* q9 y) ^; P7 ^5 b
  U5 m. o) q, j' W6 V
控制框图如下:! n: }& ?8 o2 D( l4 k3 o

) h2 e5 B# ^& [4 s
20200428232053460.png
' ], P( M( W: t+ J
9 D4 U1 c5 h. R5 w. |
* }; D/ q. L1 f  s% v3 h: C+ D; V
控制代码如下:7 u# T* u0 p8 Z& w
  1. /* 返回输出3 R9 ~; I2 k0 J6 \. `( H
  2. *  Encoder为输入(编码器测量的信号,也就是电机转速)& f, X. [" Q8 j: v
  3. *  Target为目标值
    & |; D4 E: c, r0 ?& s# \
  4. */4 i8 }# M5 X" i, G5 U, @
  5. //KP、KI为PID的系数
    2 K! a# S' N  P) F* y; s
  6. int Incremental_PI( int Encoder, int Target )
    % M0 }& w$ s. }; M3 R- ]! F) d1 B6 o
  7. {        //依次的变量代表:偏差、输出、偏差微分- _. E) T/ g7 Q: n; M- F
  8.         static float Bias,Pwm,Last_bias;  4 u- A  p2 k& ^
  9.     Bias = Encoder-Target;//计算偏差
    # y( z" W: l' ]' |) l
  10.     Pwm += KP*(Bias-Last_bias)+KI*Bias;//增量式PI1 P4 i2 f" l- ]
  11.     Last_bias = Bias;//保存为上一次偏差
    # V6 P) b0 F5 Y( H
  12.     return Pwm;//返回输出
    ! z7 {" l. [  i' K* D
  13. }$ F; u; X; }. ~3 S+ j0 @0 Y
复制代码
4 G8 V% |# V( Z" U2 U. h
在定时中断里实现PID控制,定时中断相当于离散的采样点,中断服务函数中可调用控制函数:
6 |: b/ o, d6 r4 t1 x
  1. //中断中如下调用
    - Y. j' e+ q0 p# N
  2. Moto = Incremental_PI( Encoder, Target );: R9 p6 c$ o+ F. s6 `
  3. //最终的控制落回到控制电机转速上" P5 `) V# p2 t# O3 e7 L/ ]
  4. Set_Pwm( Moto );
    : k; k7 y1 h1 Q) L7 D
复制代码

3 e/ ~1 ~% R6 c* t  ~要注意速度闭环控制采用PI控制,公式与PID有所不同,输出的也是控制量的增量,这里将增量直接加在了上一次的状态量上,所以输出的还是控制量的新状态。
0 g) B/ z' ^; [  |* Z. A3 \: a

4 l) M; y' a$ O4 N& L- X最后附上我找到的PID参数调整口诀:
- U( e7 P! ?6 n* ^
# Y6 b1 X& M1 a9 q2 |常用口诀:1 S& Z" C, {/ h' i' l4 u
参数整定找最佳,从小到大顺序查: z3 t3 D: F7 L
先是比例后积分,最后再把微分加) G$ f6 d; ?2 [+ z7 @
曲线振荡很频繁,比例度盘要放大
* T/ r! \% h. H+ w2 k- P  A  a3 U曲线漂浮绕大湾,比例度盘往小扳: g' F3 ~# G- D( X# L" K
曲线偏离回复慢,积分时间往下降
4 o) \: e+ J2 ^* h$ q9 Q曲线波动周期长,积分时间再加长
5 R' y0 c9 S5 ?: H3 b7 U曲线振荡频率快,先把微分降下来! n/ I7 K: w% C9 f( n
动差大来波动慢。微分时间应加长- o2 ?5 I3 ~: a; w
理想曲线两个波,前高后低4比1
" }! t4 E# C+ ?2 [* ]4 l% e一看二调多分析,调节质量不会低
# }1 z1 Q) c: b5 R————————————————5 e1 i$ b, v8 @7 B
版权声明:Aspirant-GQ; ~1 p; q+ V7 d
如有侵权请联系删除8 C) }. o5 Q. ?( [+ [
% G2 o) o' M* O  j3 v, N
' @  g" h+ U8 B0 d' q2 i9 q
9 D4 x# x# o  h, Y5 I% b5 a
收藏 评论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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版