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

SimpleFOC移植STM32(五)—— 电流采样及其变换

[复制链接]
攻城狮Melo 发布时间:2022-11-8 12:28
一、原理说明
# G- G. ?; M* _7 b% M4 e1.1、电流采样
0 ^9 {7 i: @1 N1 r+ S8 I
1.1.1、为什么要采样电流2 M/ V1 T+ O! R9 J
  FOC(Field-Oriented Control),即磁场定向控制,磁场大小与绕组中的电流成正比,所以对磁场的控制在程序上就是对电流的控制。前几节的程序并没有使用电流环,而是直接使用电压值,确实可以达到还行的效果。但是这样做有两个问题:8 Z8 ~  X. |1 ^" d
* j/ s$ S% f* [
1、不能保证i_d为零,i_q等于目标值,因此电机并不能工作在效率最高的状态,力矩控制也是不准确的。
2 {5 z9 X9 z5 z. Q. E4 v+ u' x6 q$ U! j' R% ]" ^
2、相电压施加在电感上产生相电流,电压和电流有相位差且并不恒定,低速运行时相位差对电机的影响不明显,但是当速度快了或者速度变化率高了以后,相位差的影响就会非常明显。) d# {" `5 I& z  E" C' R

* @* [) M6 k# W* \2 ]1.1.2、电流采样方式9 x9 }9 l) Y. ?* _0 z; W
电流采样主要有三种方式:
' S* O& ?( a  x/ k  B+ s低侧电流采样% t! X  I7 a0 X8 [  k0 i1 V* F
高侧电流采样
7 u! l6 T1 ?- R内置电流采样) i) X- {+ X9 t% }2 p+ f2 `- _
& L8 L. ]# N7 A' ?
1.1.2.1、低侧电流采样
6 i3 y9 \- n* I1 x% G4 u( x 28572bfcb96b45c2984df19b500701dd.png ; ]% G& |7 C( A- o) u) T; }
' [0 I5 M% @9 a' b$ x
低侧电流检测可能是最常见的电流检测技术,主要是因为它既不需要高性能的PWM抑制运放(如内置),也不需要支持高压的运放(如高侧),采样电阻在低侧MOS和GND之间,确保了运放输入端的电压非常低。这种方法的缺点是,必须在下桥臂MOS打开时检测电流,PWM频率通常为20k~50khz,这意味着低侧MOS的开关频率为每秒20k~50k次,因此PWM设置与ADC采集之间的同步非常重要。
# Y; S5 k7 u" n$ x
9 e8 q- a4 ~$ @/ N1.1.2.2、高侧电流采样8 f1 v- t& p9 m- u4 e  |- D! k

1 S( }: z1 r  u( ?, v/ m  高侧电流检测可能是最不常见的电流检测技术,因为它需要支持高压的运放,采样电阻在高侧MOS和直流电源电压之间,使放大器的输入端始终有高电压。 这种方法的另一个缺点和低侧电流采样一样,需要同步PWM和ADC。* b* F) x' f3 g. ^" e; ^* Y; M

) Y: H3 p& c  b- }% ^6 U! R cb77a5f318034aec9847e202eb221479.png 1 F! V# s* G  k. c

  i+ [1 w. g2 W1.1.2.3、内置电流采样( W% Y" f/ O3 K9 ?

. p7 w- b3 N; m4 b9 \ 69251485a55d4e20b92bceb7f12764d3.png 9 C' F: R; ]" r6 A

! G) N' x+ ^2 M. J/ A0 W  内置电流检测(InlineCurrentSense)是使用起来最简单但是最精准的技术。 采样电阻串联在电机相线上,检测的电流始终都是电机相电流,因为电感中的电流不会突变,所以无论PWM占空比的状态如何,采样到的电流都是连续稳定的。
: Z$ Z( n( o( a3 O: Y0 b% S$ v4 ~, H4 j% T0 k, Q8 i. S
  这种方法非常适合Arduino,采样程序变得简单了,这应该是考虑到了MEGA328P微弱的性能以及跨平台时程序的适配。内置电流检测的缺点主要在于芯片,需要比常规放大器更好的PWM抑制功能的高精度双向运放,简单的说就是硬件成本高。
5 T4 U; t1 j+ t) u9 D9 [( t
/ S& H8 z9 @0 g1.2、电流变换
& q$ G  m$ A& Y- y本节增加电流环,主要增加了以下功能,
: M* @, R' q4 H! X1、AD转换获取电流值Ia和Ib,( k: {0 L) u8 o; F( I
2、通过Clark变换得到Iα和Iβ ,
1 j8 D4 t. u: j: ~2 i  j3、获取电机角度,通过Park变换得到Id和Iq,9 d4 X( d4 T; P# G
4、Id、Iq不能突变,同时为减少干扰,做平滑滤波,
* D" u+ V7 O: O2 J* R$ W  m5、Id、Iq与设定值比较,通过PID运算得到Vd 和Vq,- a# z. R8 M; C9 l
# v  x% k. V2 [) P& P  J7 u0 L
1.2.1、AD转换
( z# _  f+ V7 S8 G0 Q  为了与官方代码保持一致,AD转换采用简单的单通道转换模式,主程序循环一次获取一次A/B相的电流。
2 y' s/ D4 `8 K2 H6 }6 ^' C
3 T8 ]( M& O, U* N0 J- O* D& V# g 9477595f19ce4d3681f1f23e727b9afa.png 6 w( h2 @2 m1 `. `  C, {" F
4 ]5 G8 V' W( D4 q( D# ?* I
1.2.2、clark变换# T- t  `8 g( t, Y5 ], m" ?- _
. f4 f2 P3 Y9 @6 L' b
8865a37662c948078a5cccfb58a93590.png ' f/ f1 N/ I- d1 @  x6 Z

; t) h- k7 J8 N1.2.3、Park变换& q* Z! j$ Y0 o& g$ r5 A

& }; T2 V  b+ R aa2f6f006f604bb294517f29ad5452b9.png
. t9 c6 ^+ B, M3 a1 A" j
# o, Q# e- u! ]: I  Park变换中的“θ”是电角度,由读出的编码器角度转变而来
3 T5 L4 s& B- e) c  s
3 R4 V& h; M: Z8 ?, @" C( | 50e7824efbc245da926b6f6e176da79b.png ) l% \# I; W0 I/ [" ^6 \# i
% V$ o+ R' a/ P- g! Z4 v- G
1.2.4、LPF运算/ s  A4 ~4 j8 L  p
dc_current模式只有 Iq 的LPF运算
# R" {- @8 e4 Kfoc_current模式有 Iq 和 Id 的LPF运算) J7 M) N6 _1 P* W
' k) Y# }0 R" C7 e1 l* C
4afa484c12e6404b981ca9c179ddaa62.png
; N' X9 u; t+ X; ~5 R- u) V' _: o0 L5 @) h$ X% p3 q; @
1.2.5、PID运算9 C3 E( }8 k/ |* t3 ^
dc_current模式只有q轴电流的PID运算$ z- ^. o/ ?- K$ h$ P7 y9 I5 V
foc_current模式有q轴电流和d轴电流两个变量的PID运算
) `7 }, F$ K1 a电流环使用 P、I 两个参数。
0 E! `( E. M6 u& ]% P# r
. E' D( ]# T3 i$ z7 B7 ^ 5a0c0bd141a44815b9b5c5665bd0733b.png
9 |" U6 w1 E& j# ?6 s( f: c7 ~( a' Z& `0 X
二、电流采样参数设置" @* S8 @: N. a  M  Q4 r. h
2.1、INA240介绍
- ?9 B/ {, ~2 o( D' a  u' s
INA240有四个型号,INA240A1是20倍放大倍数,INA240A2是50倍放大倍数。
$ b; P6 b( j3 {5 x6 N6 a$ J) m2 \  e3 i& b. P8 G, P9 Q
7c2a0758497741a4816ddf5ba609849b.png / E1 U9 J* @# W* h2 D

: P9 X) |4 c4 b, V$ h电机的电流是正弦波,对于采样的差分信号来说,负半周期为负值,为方便处理,需要叠加上偏置电压以保证全周期的输出为正值。
3 e9 h) u. d2 D' v( h0 N2 P: q( M* T1 Y
e2351b20d1204722b66af8c560ab8088.png   e: Y, o  b: L* c* `3 i! L' D
; M4 j$ g7 E7 X  n0 P
2.2、电流实际波形9 t9 Y* x% Y0 s9 u$ {
下图为电机静止时A/B相运放输出端波形,VCC=3.3V,所以此时电压=1.65V,* c5 B4 _0 R" @

* x) z5 h7 l. u0 J 4641e2eafd514cf5b6940e9d6b7cea5c.png ; }: N+ J3 B0 ^

1 r7 ^% C9 U$ _: P( B# P下图为电机转动时运放输出端波形
9 S8 r9 _& z; {9 x, N+ j; r/ f5 }. N! q  F
eb42dd33ac3a4fe39927e0ca19e91ce4.png 8 z8 }2 a( z  F: ]
- }7 M; z$ `) b
2.3、SimpleFOC V2.0.3 的参数( `; j  @6 u: j0 \# d+ v! f0 U
; F& b5 Q* m6 T9 X
3c0f9a09eccf46d894aa62a0c63821d9.png   k0 X% y! r* t! w
9 i  S/ o4 }+ V, |9 I8 }0 w
采样电阻0.01 Ω
; s+ ^- C7 [" w9 y  {# D$ j运放为INA240A2,放大倍数50- q' l" b; m/ q* Q
背面需分别短接A0/A2至输出, p& N1 g' g" M' G2 O
C1_OUT=INA_VCC/2 + 0.01 * I * 50; l2 f0 @, j+ [6 I; R' n' q
如果INA_VCC=3.3V,C1_OUT=1.65 + 0.01 * I * 50,电流范围(-3.3A,3.3A)1 K$ S2 d  I! Z$ E; f( ]7 H
如果INA_VCC=5.0V,C1_OUT=2.50 + 0.01 * I * 50,电流范围(-5A,5A)
# x' L- o5 i4 q9 `6 L% C; }4 [: sB相采样输入在PCB上为走线方便做了反向输入,所以放大倍数需乘以 -1(移植后的代码已经做了处理)。6 S( ^/ U$ n9 ~! [3 H6 F5 N
5 v2 x) [% z9 a# E
2.4、PowerShield V0.2 的参数6 v8 A. S: A' ]) B% z

+ O( o) o( o- |/ T* y& D 22a47f57737e463d82cef936685bff1e.png
' u( b7 {# e$ ]" R2 R4 P) w; e( |0 C4 z& [, {1 [  c- R
采样电阻0.001 Ω& `; M9 Z3 D7 O1 O
运放为INA240A2,放大倍数50
+ a- D5 S* `& w+ ]C1_OUT=1.65 + 0.001 * I * 50,电流范围(-33A,33A)3 _" Z+ p" Y; l* }4 L1 e! h6 k
- n0 `" }  y8 Z/ h7 @4 h
2.5、SimpleMotor 的参数# Z8 C  ~" H8 s+ L
/ q+ a' R8 A8 O+ H- D  Q& H
6427183b04e04200b550652f3adbe3cb.png : F6 L! l, p! O$ \* j

3 O) ]7 u( o% W4 l8 z采样电阻0.001 Ω# g0 n6 \( D& T
运放为INA240A1,放大倍数20# O4 e2 I$ s5 Y& N- X. F
C1_OUT=1.65 + 0.001 * I * 20,电流范围(-82.5A,82.5A); I' S3 e: ?" L: |- d

$ x3 p5 q; P: L$ ]三、扭矩模式+ @9 V/ z# ], t& g' A" l1 }
  SimpleFOC中有三种扭矩模式:
* c2 G3 O$ e$ m# G7 Z, l6 sVoltage mode - the simplest one
; m( k4 c) a6 H: I9 EDC current mode - 1xPID controller + 1xLPF3 m9 z1 w9 d; N, \/ Y! ^) j# ^
FOC current mode - 2xPID controller + 2xLPF filters
' N4 z% @" p5 q, [6 u2 b# d. {. v+ H* ^: R
3.2.1、电压模式(Voltage mode)5 p3 _2 K5 j# Y0 h2 @  R
电压模式是之前示例中一直使用的模式,
0 c4 l/ I, L( B* N  X0 Y8 r2 Y因为不用采样电流,所以硬件简洁,程序简单,执行速度快,  R/ l5 j6 _" i) y% n
适合低速电机控制' f6 A1 Y4 A# D1 a
# P/ A' g! u: C% \2 K5 X
92aade3789484d7a8defcea071ebd76e.png 3 W: R+ \" A! I4 o$ T, ^

% y8 m) U) i+ u$ T( S  g  d3 Y1 M3.2.2、直流模式(DC current mode)2 l1 D4 _  H4 R" K+ O; e
检测电流大小,实现电流环控制9 a8 B% ^, D( r  |
只控制Iq,设置Vd=0,9 u( z3 W2 w. L' D" M& B1 Q
像控制直流电机一样控制无刷直流电机的电流7 I& I' f, V/ k& U. @. j- Q
* I/ i: Q: D( A: v0 v: Q/ C
8f3fb597a3c645819551f67d7bd55ae0.png - I  H/ s; t6 C" ]; s
) I+ N1 p: n  T% M3 D: v! p/ b& d
3.2.3、FOC模式(FOC current mode)) w5 o, c: b; f" W' T
控制Iq和Id,使转子中的磁力与永磁场精确偏移90度,从而确保最大转矩," ^4 A  h4 R! R- ^
唯一真正的转矩控制方法,& W! r# I. N6 G1 G, ]) s+ _4 @. x
保证电机始终工作在高效状态* _' N6 m( E  I0 u9 q* k. }

. I* K  o8 F4 P# s! ]( Y c6c735ca71674316bb9c562e819682bc.png
$ ^8 W* [* i, k7 M- A4 {# g$ O* B# {, K) g1 k' l; l
3.2.4、三种模式对比4 G$ Z: D' }. c, d6 \* z1 h+ T2 p) T

% X5 l) l! A2 i! y) Q 362b9b5df3454c50871e8d18067e22a8.png ) |, Q! A3 n8 x, i' |9 L

: K' }' b6 W; l- l4 a/ I
四、硬件介绍
4 }8 z: j9 H& ~4.1、原理图
4 s; J' r7 b! [  q6 m% h; Q: K* m7 n
, l( N+ @9 W) I. L4 W) a6 o9 a
70978941acce42c2bd01ef67d0959f2d.png ' P6 o, H* b' a( k* a3 `  \

6 ]0 T4 M3 ?7 K! u4.2、SimpleMotor方案
. \/ \$ @$ p6 f2 V3 y! H+ _
4.2.1、准备清单( j4 a0 l& L8 t5 J- J
; t$ C. R3 C! E  I: Y: P
7VO7W9Q7EBDWLSMKZ9X]9SS.png # Q) j2 P) u9 o4 D$ B: p0 Q9 T

9 M5 W3 Z: Z+ Y& `2 b9 n 5e2dac5822a2459c9a1b9ac59aaff761.png
4 C+ F  Y& P5 `
2 T  G6 ?5 ?! {4 D# {" h0 \带编码器云台电机可以是AS5600,也可以是TLE5012B。0 V/ L4 ^* w# U4 l6 _
3 q- [' R# Q2 r# p0 N( |2 w% s" r
4.2.2、接线
# v4 F3 I% z6 h8 o
: E" t# E+ y& a; r. ^ 7be471a380d741d49716c722da03ef16.png 7 K! C( k3 n- Q; H/ I

& S1 C+ Q8 k/ d4 B, b3 w6 d只展示M1的接线,M2的接线根据原理图自行连接。
- l) I& f* Q7 f$ `. o1 b& k/ `& E! y" S
4.3、STM32方案# P' U/ t* m% H! h( v% l1 a
4.3.1、准备清单
3 c- R6 S! S& R3 F
) L. m6 C5 v0 q% s- h/ W( i VLLZ8{J{6J8$(YL0@$(D$N5.png
  n& v9 w0 D+ ~% a  W1 U" ~7 x
9 @- o; l) a7 Z, s% p3 w 2954761e36094696935166131493f49e.png   z8 }! n# P$ c/ V, B

" Z* s  V) b* c: e- Q! L7 @1 i
3 h' ^$ c; x4 p( M0 y" P+ |带编码器云台电机可以是AS5600,也可以是TLE5012B。
& D& P- t0 Y  M2 y9 k. E, b% @/ h5 K# ?6 ?: ~& @: p3 s
4.3.2、接线
/ F7 t% {3 \" S# g/ _4 N# C1 W/ o. b- W- g/ e7 |* @
c235674f6d1f4b91a77cf064b373c9bd.png " ]3 b) u( P/ k5 W6 m, p+ [
' Q0 N. c! P; `* Q5 D* W. \
Shield V2.0.3的背面按照上图短接
8 F3 x( f# _& u6 i& I( W" w- U# b1 B
254aaa925a594db18e1348c1ed0ad163.png   t, K3 d% E9 A  I2 z# n4 a' ^

, l- z, `% D7 Y1 ]对照 Shield V2.0.3 的原理图:! }9 @; b4 _* N2 j. d# h
  U1 L; F! }$ K$ U0 N
D[~S_1WL][5}(KC(G]6~G]I.png 6 t. i1 i- e8 [" u5 T; I$ I+ K

2 q; p/ i: ]5 O; u& d8 z
, A5 g5 d8 W- T/ |& b如果是AS5600编码器,如下' U7 k( ?$ t/ F" ^  Y

0 l/ g1 E" _: U1 S0 ]3 n }[[{@AU}X)]0@L]H9G4T{EV.png
1 Z7 @0 ]0 ^* ~: h, }' ~7 ~9 p
" C3 u( ]/ h) V# R; U. V如果是TLE5012B编码器,如下
, ^) E% i, X5 a+ u  {5 E0 E3 j& d
/ H$ s0 N7 O, @  \2 H
& l! g8 C; P3 n6 k
a4a5bdf708fd4f529df22092bddfdc11.png / [: h: h$ k, t7 F

! ~' O5 {5 \0 B; q只展示M1的接线,M2的接线根据原理图自行连接。, d$ \- t- q$ ^6 y: `

  J% @) l, a" v7 ?9 K, a5 o- S. Z2 B( Y  d4 Z1 l" V
五、程序演示( R- V  ^( k' v! V4 V! n& Y
( j# F; v  z0 H3 Y+ k+ `/ Y
d8e972818fc54d8e9d96067c9650e155.png 3 o3 s7 _; I' C
( Q0 L( Z7 c% j* x; u# P0 a
40a32d11cc99450a8c4ca7c142f317ee.png
3 T0 v- i: w% _" D' w+ w- H
5 j( h# X: m+ `* |; u. `- G" ~注意:
- x& F/ p% U! H* Q1、voltage_limit最大只能设置为供电电压的 1/√3(12V限制为6.9,24V限制为13.8),. b' o( l; Y8 i/ a: |$ d2 A
2、如果检测到的极对数与实际不符,停止继续操作,否则电机会堵转。
# A% c8 O* w  E1 s" h$ E/ I; }
& r2 H- D) N$ G* L- p3 o% G& g- s5 V/ m  B* f' w. ^. l* w3 u
六、代码升级说明
8 e9 B3 \; K) P& L+ R8 n. _. c7 P$ M( R! K. {+ i6 p/ {
1、优化PID子程序。之前代码把位置PID、速度PID和电流PID_q_d 各自做为独立的函数调用,本次升级只写一个函数,把PID相关参数定义为结构体,与官方代码保持一致。
' v4 N- E2 ~. B- \# _+ O9 k& E& y9 s. p( y/ H3 R2 A0 j
2、优化LPF子程序。与PID的做法相同,只写一个函数,把相关参数定义为结构体,与官方代码保持一致。
) |* {2 k- i" Y* Q1 I0 O$ r$ c/ }* r
0 O$ E; r3 z  Z0 `/ Y8 q" L" S6 ~; S3、增加了对AS5047P、MA730编码器的支持(目前共支持AS5600、TLE5012B、AS5047P、MA730四种磁编),使用代码时只需在 MyProject.h 中把使用的型号设置为1即可。
; {( D. C( ?% B! U- s# S9 G0 m' ~0 j9 |$ _, P6 y  M
4、官方最新的SimpleFOC库V2.2.0(2021年12月14日)版本新增加了sensor->update()函数,并因此对角度处理做了大改。' f: b- p. g* K# S7 ^+ P* v* M
之前调试代码的时候,就发现官方代码中角度读取处理的不太好,特别是速度模式上电的时候电机会突然转一下然后停止,当时按照我的理解改进了这部分代码,最新版本中官方修补了这个问题,我本来是打算把这个部分升级到官方一致,但是修改了一天后发现官方的代码仍然很混乱(相信这部分代码官方以后还会再升级),所以此次放弃了这部分的升级,仍保持之前的设计思路,只做简单优化。$ K) G- F! U% N4 p" R. ]5 c

# |. B& ~# I# U8 ^5、升级零点检测,在已知电机参数的情况下,通过设置 零点偏移角度和方向,可以跳过检测。与官方代码保持一致。2 i6 ~. c% [" y0 q2 S! ?6 }
3 D, v5 l: w2 O, l3 W& H  a
6、优化了while主循环中的计时方式,由原来的timer4中断累加修改为systick查询。当前代码中只有一个串口接收中断。与官方代码保持一致。* ~3 p  ]* d0 o6 s  H" v; M5 p
! a7 C. ]0 ^" v
7、电流采样修改为三相采样。之前只写了两相采样,觉得两相就可以三相似乎浪费,调试ESP32drive的时候仔细看了下代码,发现三相多了一个平均处理,应该会比两相更可靠一点点,所以这次升级为第三相可选择,与官方代码保持一致。! T1 O8 |4 \! R  m9 A( m9 h
2 z/ E& q* w# X
8、升级后的代码可以很好的实现电流闭环,解决了之前发现的所有问题,所有功能都经过了本人的实际测试,当前代码在本人看来已无懈可击,虽为开源但也要认真负责。
1 c1 k3 [7 m" K7 |3 ^4 B1 H: _4 y' y2 N& I2 D
————————————————/ n4 y. @8 T# M' N- h- k* v
版权声明:loop222
4 H; p7 r; w+ G; m
, J9 J# a" Y0 B8 v) z8 A2 p5 F$ U" _+ |4 e$ K2 g% t5 w' q% _1 s. M+ v
收藏 评论0 发布时间:2022-11-8 12:28

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版