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

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

[复制链接]
攻城狮Melo 发布时间:2022-11-8 12:28
一、原理说明7 h) x2 K1 c0 |* b6 p
1.1、电流采样

' n- Q  w' H; k7 x4 @: v$ G5 F3 W1.1.1、为什么要采样电流1 Z+ W  ^5 k$ e: _- Q
  FOC(Field-Oriented Control),即磁场定向控制,磁场大小与绕组中的电流成正比,所以对磁场的控制在程序上就是对电流的控制。前几节的程序并没有使用电流环,而是直接使用电压值,确实可以达到还行的效果。但是这样做有两个问题:
/ [* \, L. M( k0 @" P& I& j
* Y" Q' l* l7 }1、不能保证i_d为零,i_q等于目标值,因此电机并不能工作在效率最高的状态,力矩控制也是不准确的。/ K: L! b% `& i8 M: ]8 |
/ d: {( `. d7 T
2、相电压施加在电感上产生相电流,电压和电流有相位差且并不恒定,低速运行时相位差对电机的影响不明显,但是当速度快了或者速度变化率高了以后,相位差的影响就会非常明显。' Q# K8 S, c3 [2 U" M

3 T1 u" H) p2 k+ h$ o5 O% U8 ?5 q1.1.2、电流采样方式
+ K( w3 N7 m; }: c. |( G7 n& y% M- `电流采样主要有三种方式:8 p& D/ P8 s' }& k! r! a. M
低侧电流采样7 g1 z2 C/ ~/ y* [
高侧电流采样. q; m% J" y$ r( h8 {
内置电流采样$ T) J$ ^6 W# t  G2 V# m- k& a  T

- Z% s) m* h# [2 p' W1.1.2.1、低侧电流采样
) D' d/ q/ S$ y' P, S4 j 28572bfcb96b45c2984df19b500701dd.png
5 f# c, T0 v' O+ M& P# _5 w/ y1 F/ p) c5 P% K7 M
低侧电流检测可能是最常见的电流检测技术,主要是因为它既不需要高性能的PWM抑制运放(如内置),也不需要支持高压的运放(如高侧),采样电阻在低侧MOS和GND之间,确保了运放输入端的电压非常低。这种方法的缺点是,必须在下桥臂MOS打开时检测电流,PWM频率通常为20k~50khz,这意味着低侧MOS的开关频率为每秒20k~50k次,因此PWM设置与ADC采集之间的同步非常重要。
' M* D$ Y5 o( o7 _
2 v5 g/ d5 n; k+ @3 @1.1.2.2、高侧电流采样6 v. q: J0 L! K8 ]) |
. i& c$ A  q- }( @# @: N
  高侧电流检测可能是最不常见的电流检测技术,因为它需要支持高压的运放,采样电阻在高侧MOS和直流电源电压之间,使放大器的输入端始终有高电压。 这种方法的另一个缺点和低侧电流采样一样,需要同步PWM和ADC。
' _- G# a8 B! O, {& i; Y# P4 w% Y. h* h/ h  D- e, _. j
cb77a5f318034aec9847e202eb221479.png # ]4 }( d9 g% V  U  J+ M
, P$ z; H8 a4 Z+ o3 e
1.1.2.3、内置电流采样
; o" U) s" @) Y% w* K( A* e+ o3 V6 ~7 c1 c% ^/ e6 @
69251485a55d4e20b92bceb7f12764d3.png # k$ b+ w% P3 F& F

3 Z. w8 J6 V  \* D8 E  内置电流检测(InlineCurrentSense)是使用起来最简单但是最精准的技术。 采样电阻串联在电机相线上,检测的电流始终都是电机相电流,因为电感中的电流不会突变,所以无论PWM占空比的状态如何,采样到的电流都是连续稳定的。2 |, Z) @7 H2 t5 u

# p1 x+ R9 n) y0 U8 Q, _/ T9 x9 X  这种方法非常适合Arduino,采样程序变得简单了,这应该是考虑到了MEGA328P微弱的性能以及跨平台时程序的适配。内置电流检测的缺点主要在于芯片,需要比常规放大器更好的PWM抑制功能的高精度双向运放,简单的说就是硬件成本高。
1 u: [, f% t/ J! C  Q; v' l! W6 }) w; \& \
1.2、电流变换- J8 l" l, [/ {& B* c  |7 Z
本节增加电流环,主要增加了以下功能,0 g  d. j* y( e2 L7 ]
1、AD转换获取电流值Ia和Ib,, o+ l" E& Q" N$ l9 a
2、通过Clark变换得到Iα和Iβ ,
& f. ?7 `3 @8 D5 U2 ~3、获取电机角度,通过Park变换得到Id和Iq,
+ S, f, v- Y9 g7 e+ o( `4、Id、Iq不能突变,同时为减少干扰,做平滑滤波,/ B+ C# q8 N. a5 R/ A
5、Id、Iq与设定值比较,通过PID运算得到Vd 和Vq,& n; g) Y. ?, O2 o' `% S: I
, u3 J9 i, ^6 x7 G5 D& X
1.2.1、AD转换( K2 M( u2 F" X" `
  为了与官方代码保持一致,AD转换采用简单的单通道转换模式,主程序循环一次获取一次A/B相的电流。5 Y* f( w0 u/ Q2 y
8 T( R5 z  v/ T7 y0 I
9477595f19ce4d3681f1f23e727b9afa.png ! W( z. ~* X3 [$ V; Q) g2 c; o
. y1 N( t6 {7 C, m
1.2.2、clark变换% }5 f3 A5 d: D
# i9 d. r; J1 d
8865a37662c948078a5cccfb58a93590.png 0 m. _/ `" e/ \' G: l7 c$ A

0 d) N* r; P3 T. K2 E; V1.2.3、Park变换; `5 e& R+ k& o) W* ~- d+ ^

% I: r4 z- Y1 B aa2f6f006f604bb294517f29ad5452b9.png
5 j0 d: X5 A+ F. N
/ P* ?- |& N2 v7 Y  Park变换中的“θ”是电角度,由读出的编码器角度转变而来
0 H) q1 F9 P1 h3 I. e: l
2 e1 `1 w- S6 S7 o 50e7824efbc245da926b6f6e176da79b.png
! U- d) ?5 E- _  ]6 g# S8 g
5 S2 |! v! W2 H2 ~& ]* o0 j( V1.2.4、LPF运算
7 t4 E2 e$ e! m/ j+ jdc_current模式只有 Iq 的LPF运算
# m' }. z& R/ a  o1 ?9 V3 pfoc_current模式有 Iq 和 Id 的LPF运算. Z8 k3 ?8 k. I+ B% F. r, R/ D
" N9 q7 ?' o: P6 ^
4afa484c12e6404b981ca9c179ddaa62.png % b3 G' a! ~% [) H5 ]
* ?( r4 e% ~/ z6 a
1.2.5、PID运算
) J# c7 `( R/ X" f& s) R3 Zdc_current模式只有q轴电流的PID运算/ s' m3 [- d' v. K9 |2 h  c8 o6 l
foc_current模式有q轴电流和d轴电流两个变量的PID运算
, \# y" Q- ^$ z# i电流环使用 P、I 两个参数。5 O) |8 f% X: q( E- P
0 \, F4 k1 w* w$ ~6 L+ l0 k
5a0c0bd141a44815b9b5c5665bd0733b.png / v) S! |) ~+ S0 d- k
* ?$ E4 h- L. J- ?6 B9 P
二、电流采样参数设置
3 v1 R9 U) L+ G- V$ V- y2.1、INA240介绍
2 o$ o" c: s. W% c# ^/ l' Q: s
INA240有四个型号,INA240A1是20倍放大倍数,INA240A2是50倍放大倍数。/ x( q; Z& u. A* Q. O  G9 m
% r" `* s& E( I5 C; ^0 p
7c2a0758497741a4816ddf5ba609849b.png
7 H9 e: z3 q" I! h3 V- c* i- F; O5 z8 Z2 w5 c/ V' j3 c
电机的电流是正弦波,对于采样的差分信号来说,负半周期为负值,为方便处理,需要叠加上偏置电压以保证全周期的输出为正值。
, f4 ^* a) I4 o" v' s% r/ Q# Y" F5 a' X" R
e2351b20d1204722b66af8c560ab8088.png ; r4 }. C4 p2 f2 k8 A) P" H7 j1 {

" j2 T( V3 ^' Y8 x! V9 ~2.2、电流实际波形' o! }& e! b' J+ d
下图为电机静止时A/B相运放输出端波形,VCC=3.3V,所以此时电压=1.65V,
& Q$ r. E6 }; Y, V( r# Q
' x* p7 s9 |, c 4641e2eafd514cf5b6940e9d6b7cea5c.png
  y# k; |) M" ~$ x
) k% x- _! ^* X- i8 O7 t3 m下图为电机转动时运放输出端波形0 i3 Y2 f3 g- M, I( A' F, Z: B

# y3 L( R- t- k4 T% B- c eb42dd33ac3a4fe39927e0ca19e91ce4.png & ]) m) D( L1 b  O/ }/ G

) z) @* z; S4 L2.3、SimpleFOC V2.0.3 的参数
4 i! A1 t2 K! p* [9 x
  X6 d6 I7 n! s. [ 3c0f9a09eccf46d894aa62a0c63821d9.png
+ {; X6 Y8 p( w0 p7 f# C- Z3 Q9 Y# w
采样电阻0.01 Ω
1 A) Y% I) z( `6 r, o( S: Q运放为INA240A2,放大倍数50
6 K" x5 z4 [$ o$ b/ s6 O背面需分别短接A0/A2至输出
" f7 H& q; x. u0 F# m# XC1_OUT=INA_VCC/2 + 0.01 * I * 50
7 X8 c8 A0 v* A2 ]; j$ B; ]如果INA_VCC=3.3V,C1_OUT=1.65 + 0.01 * I * 50,电流范围(-3.3A,3.3A)
; Q) {: n/ X& D0 r& _* C如果INA_VCC=5.0V,C1_OUT=2.50 + 0.01 * I * 50,电流范围(-5A,5A)9 d  D$ l' r( k
B相采样输入在PCB上为走线方便做了反向输入,所以放大倍数需乘以 -1(移植后的代码已经做了处理)。
9 f% z; |% i& U. [# b8 W. W! g6 W( R) ?( K
2.4、PowerShield V0.2 的参数" M! H5 T4 v& X& O( N7 b

2 P% B+ X7 d* {, k& W, ~ 22a47f57737e463d82cef936685bff1e.png
+ R& {: M! ~4 r) `; G) o$ P% [  b( i+ E8 z& ^5 H6 ^
采样电阻0.001 Ω
8 l% G( Z- J3 u运放为INA240A2,放大倍数50' P  U" R8 y# C# L9 D
C1_OUT=1.65 + 0.001 * I * 50,电流范围(-33A,33A). V7 L6 o/ n$ T* G  \1 j! W! G
7 n4 P/ j; K  O2 i3 V
2.5、SimpleMotor 的参数( Q5 _( x1 Y6 J

; V9 k9 r; q( O5 t; l 6427183b04e04200b550652f3adbe3cb.png
, p% _6 |6 t- _: {- X. `* L/ B5 r, a3 B
采样电阻0.001 Ω9 V: p4 m  U1 M+ H# e
运放为INA240A1,放大倍数207 Z% z  [4 c* b' o/ P$ k3 e
C1_OUT=1.65 + 0.001 * I * 20,电流范围(-82.5A,82.5A)
1 T  A& G% Z3 v5 e4 G6 O
' B; w$ ]# C5 ^. P* e/ L0 v6 a' Z三、扭矩模式
6 v: X- ?! @5 z% B4 c  SimpleFOC中有三种扭矩模式:" I- c; S+ j' j  W9 U7 K
Voltage mode - the simplest one
- ], O% @  `7 z! W8 B1 yDC current mode - 1xPID controller + 1xLPF7 w8 o* M) E7 o. ?* u
FOC current mode - 2xPID controller + 2xLPF filters2 _6 y! d; A- }0 M  M+ h7 L

9 R( f" q9 I) ~2 Z! F" |3.2.1、电压模式(Voltage mode)
5 A2 p& t; ]8 [2 z电压模式是之前示例中一直使用的模式,
7 }# ]. h: p0 K( Y* t因为不用采样电流,所以硬件简洁,程序简单,执行速度快,
9 ?2 ~* f6 f5 f! N) X* p- r适合低速电机控制
! z0 _' r1 Q1 Q( D5 f: F+ ]2 S& _* W' P3 N
92aade3789484d7a8defcea071ebd76e.png - e7 V5 n3 y7 \( b0 P7 F6 r5 Z

3 u2 H9 W& d' a0 U8 Q3.2.2、直流模式(DC current mode)
* H) n+ E  X) U检测电流大小,实现电流环控制& r9 }4 J/ y( ^) h. m3 Y# `
只控制Iq,设置Vd=0,  p8 [& m7 D0 I
像控制直流电机一样控制无刷直流电机的电流
/ ~$ B) ]7 j' T: C' |' b+ i, O8 f% q6 h3 G0 A. T4 ~5 q: B4 v
8f3fb597a3c645819551f67d7bd55ae0.png
+ |9 R9 ~+ R9 f- L; _
8 Z: e9 B! t% S2 }( \0 W- V3.2.3、FOC模式(FOC current mode)8 Y1 Z' e) ]- I; ]5 {2 `
控制Iq和Id,使转子中的磁力与永磁场精确偏移90度,从而确保最大转矩,2 Y: q; g' E2 l' T5 r" z2 J
唯一真正的转矩控制方法,
. l  F! u% N5 j, l! @, T  K9 O保证电机始终工作在高效状态
7 ~6 ?( ^# c% n6 m# `- E; k1 ^( Z, @, D5 M  `( Z/ c; l" O
c6c735ca71674316bb9c562e819682bc.png , ?+ u: J$ T7 _% v6 \

) u3 Z2 F1 A/ ?. \* p" u3.2.4、三种模式对比
/ v. s, w# Q$ d% u- O  n' j4 Z+ x/ s  D0 J4 D# e
362b9b5df3454c50871e8d18067e22a8.png
+ @7 _" K. v. J# H( B0 c
4 \. o( a- G4 \3 ~- t& |0 J* h5 U
四、硬件介绍  g9 O+ p2 g0 M9 E* t
4.1、原理图
$ j: V& ^+ H0 y( R' [4 O2 Z' Y5 C& V6 N( y* ?, o
70978941acce42c2bd01ef67d0959f2d.png
+ T  R" N9 F5 V0 p3 `! ]4 @9 H" j  n4 z
4.2、SimpleMotor方案

" g7 _# w; j  @5 \4.2.1、准备清单
; }3 d0 X! D: _9 L& S2 x8 I# ^% x+ ~  y( ]* z! T. K7 \
7VO7W9Q7EBDWLSMKZ9X]9SS.png
3 v! g/ k% u' R5 z% b, F6 Q, U# h+ K
5e2dac5822a2459c9a1b9ac59aaff761.png
; \  |# d0 A  r/ c% ^, D! [, q
0 j% n, b3 B4 C) l" S- a! ~带编码器云台电机可以是AS5600,也可以是TLE5012B。9 T8 l6 Z* T: G

7 D8 l5 m4 ^4 X, M  b" J4.2.2、接线% l9 g' Y7 L. t/ R& `4 j

+ w+ x9 |9 ^) \, \% v5 Y  r) g& M' S 7be471a380d741d49716c722da03ef16.png 7 A% X$ r3 M) ?5 U# M9 e+ N, C" u
! `% ^/ @' H" j, ]4 r
只展示M1的接线,M2的接线根据原理图自行连接。6 L; D( _$ [4 @- J/ }

0 ]  Y1 N# i: @, I( D$ a- k2 F6 @4.3、STM32方案
/ d3 z; K/ K9 T6 A; W$ S" |4.3.1、准备清单" S' q+ @+ p+ X

; C  K2 Z- q5 w( _- C VLLZ8{J{6J8$(YL0@$(D$N5.png
, v' _" ~1 f( E0 e# r& A5 A" I: k' [8 D3 h' t5 O3 C
2954761e36094696935166131493f49e.png ! h9 ]6 g( z- q) |# l/ M& {

" A. v/ b" K0 q( \! r# |
* m6 e& u$ c, H% q! h/ a带编码器云台电机可以是AS5600,也可以是TLE5012B。
& X1 }# L; w9 ^. B5 \9 b+ a4 F! o8 n' O
4.3.2、接线
% J  z7 F5 P' P7 A
  z% u/ m$ ]( T% y6 Q. n8 i c235674f6d1f4b91a77cf064b373c9bd.png
/ Z! E  Y3 ]( {
3 {7 H5 t0 z/ u1 tShield V2.0.3的背面按照上图短接
0 c5 D1 j0 P: [: g0 b
! T5 A- }1 l8 ` 254aaa925a594db18e1348c1ed0ad163.png " j  V3 T5 i/ T9 I& }
- Q2 k% b8 s9 M& B: Q2 K' Z
对照 Shield V2.0.3 的原理图:
% W# |& P3 M2 ~6 N% o" r
6 k- \% O% e. }2 \ D[~S_1WL][5}(KC(G]6~G]I.png 8 H7 v0 x$ z7 _, y

6 F! V3 R" U( `1 ~5 x0 ]" ?( H1 @" K2 l) X! P3 \8 S' j
如果是AS5600编码器,如下
) q2 L. u3 b* x3 F* r
" |* |' N' d( p" [8 o# M }[[{@AU}X)]0@L]H9G4T{EV.png
8 T; O) @  e) s7 N# q/ t. J- ~' s  |. |2 V, M5 k2 w7 H
如果是TLE5012B编码器,如下
& u. A: E& A4 v+ c4 ]' N+ B6 n' \  C  @

. `3 O! d3 v5 P' J  u% f/ _3 {9 y  F8 V/ Q3 ^
a4a5bdf708fd4f529df22092bddfdc11.png : n# p+ i" h/ s, n; @! I+ [

: [+ \7 d, [* w# J- E7 B& k, j: P只展示M1的接线,M2的接线根据原理图自行连接。/ }0 J* m/ _  N# `: G0 E) S# l

; T! L1 D$ p$ O" B6 t
$ y7 e" i9 k. B. V0 e  K  i  v五、程序演示
  N8 S5 P5 X$ ?" B8 |( l& Q1 E; v; _2 J/ x) x" \
d8e972818fc54d8e9d96067c9650e155.png
/ N. U% a2 \) d* m4 P# |( P/ Y- W. q2 W2 Q; j# @, d# H
40a32d11cc99450a8c4ca7c142f317ee.png 3 c6 d7 c  R' |% l4 L

0 {, ~7 ?# s5 X; T) D注意:
. j8 ~, x, a, ~# \! D" n1、voltage_limit最大只能设置为供电电压的 1/√3(12V限制为6.9,24V限制为13.8),) H/ z0 r. K3 O
2、如果检测到的极对数与实际不符,停止继续操作,否则电机会堵转。
4 k/ m, W& K% ]: p
# B. T+ P* Z5 Z$ y4 c* [
5 q0 R1 _" J0 ]  R& h: B3 {六、代码升级说明
; E9 a" l: @" ?7 A9 U! x" _( l, Z
9 c; V- v* k* i( k3 P1、优化PID子程序。之前代码把位置PID、速度PID和电流PID_q_d 各自做为独立的函数调用,本次升级只写一个函数,把PID相关参数定义为结构体,与官方代码保持一致。
& e  x, p6 \- `: y/ v8 M; w5 y9 r; c: s5 ^% _; J
2、优化LPF子程序。与PID的做法相同,只写一个函数,把相关参数定义为结构体,与官方代码保持一致。
. ^0 p& \6 ^8 Q: Z: O7 t9 V. J
: u. p$ \* ?, O' i* F" }3、增加了对AS5047P、MA730编码器的支持(目前共支持AS5600、TLE5012B、AS5047P、MA730四种磁编),使用代码时只需在 MyProject.h 中把使用的型号设置为1即可。
5 a1 @) v, F1 g$ l: ^7 H; A; a% i1 `7 k# c; `
4、官方最新的SimpleFOC库V2.2.0(2021年12月14日)版本新增加了sensor->update()函数,并因此对角度处理做了大改。
( ^  j% a% L' }5 b之前调试代码的时候,就发现官方代码中角度读取处理的不太好,特别是速度模式上电的时候电机会突然转一下然后停止,当时按照我的理解改进了这部分代码,最新版本中官方修补了这个问题,我本来是打算把这个部分升级到官方一致,但是修改了一天后发现官方的代码仍然很混乱(相信这部分代码官方以后还会再升级),所以此次放弃了这部分的升级,仍保持之前的设计思路,只做简单优化。7 V) [  E) e' F5 M& Z. P( H

6 y: C% B- u$ t5、升级零点检测,在已知电机参数的情况下,通过设置 零点偏移角度和方向,可以跳过检测。与官方代码保持一致。
1 x% L# @0 ]5 @; u4 B) ^5 m: @" U; m0 C0 T
6、优化了while主循环中的计时方式,由原来的timer4中断累加修改为systick查询。当前代码中只有一个串口接收中断。与官方代码保持一致。
3 G( n2 Y+ [( w& S5 ~( u1 k$ S" q1 X3 K9 g/ F6 i; ]
7、电流采样修改为三相采样。之前只写了两相采样,觉得两相就可以三相似乎浪费,调试ESP32drive的时候仔细看了下代码,发现三相多了一个平均处理,应该会比两相更可靠一点点,所以这次升级为第三相可选择,与官方代码保持一致。
2 X) o6 s0 k) D& n' \8 T: A. Y: Z6 T8 M4 N
8、升级后的代码可以很好的实现电流闭环,解决了之前发现的所有问题,所有功能都经过了本人的实际测试,当前代码在本人看来已无懈可击,虽为开源但也要认真负责。  d  f' k3 x  P: `' H
6 o9 f( }3 A, z/ d$ d
————————————————$ s+ o: M( ]* i2 i' p& C4 y
版权声明:loop2229 Q- _5 v* Y6 S. Y. \) Y
+ J1 c) r7 S  i1 W, L( ]( U- [

0 r* M( z9 O9 c: Z1 {" o  r- ^
赞 收藏 评论0 发布时间:2022-11-8 12:28

举报

0个回答

所属标签

相似技术帖

官网相关资源

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