
一、原理说明 1.1、电流采样 1.1.1、为什么要采样电流/ I& E' Z3 S. h' r FOC(Field-Oriented Control),即磁场定向控制,磁场大小与绕组中的电流成正比,所以对磁场的控制在程序上就是对电流的控制。前几节的程序并没有使用电流环,而是直接使用电压值,确实可以达到还行的效果。但是这样做有两个问题: a) g4 B5 {; n) U7 Y) F9 k4 ^& d; M 1、不能保证i_d为零,i_q等于目标值,因此电机并不能工作在效率最高的状态,力矩控制也是不准确的。 , B& f3 ], e- Y% y* |3 {. V 2、相电压施加在电感上产生相电流,电压和电流有相位差且并不恒定,低速运行时相位差对电机的影响不明显,但是当速度快了或者速度变化率高了以后,相位差的影响就会非常明显。 1.1.2、电流采样方式7 _, C" ]) ^1 `# ]9 B7 b/ B 电流采样主要有三种方式:4 I0 _; E% D+ q2 ^3 K4 O 低侧电流采样. f# @" z: `0 T- K7 M& E$ p 高侧电流采样4 i0 o4 i: {% W5 y 内置电流采样 1.1.2.1、低侧电流采样 ![]() ( K) C2 C1 _9 \' m5 Y) @0 [& x! i 低侧电流检测可能是最常见的电流检测技术,主要是因为它既不需要高性能的PWM抑制运放(如内置),也不需要支持高压的运放(如高侧),采样电阻在低侧MOS和GND之间,确保了运放输入端的电压非常低。这种方法的缺点是,必须在下桥臂MOS打开时检测电流,PWM频率通常为20k~50khz,这意味着低侧MOS的开关频率为每秒20k~50k次,因此PWM设置与ADC采集之间的同步非常重要。2 E& ~4 F3 L( P3 V5 C: ]& u 6 e( u5 J% o; ^" o 1.1.2.2、高侧电流采样$ j1 Q0 i6 [0 h7 N 8 g* o) L5 ?* B 高侧电流检测可能是最不常见的电流检测技术,因为它需要支持高压的运放,采样电阻在高侧MOS和直流电源电压之间,使放大器的输入端始终有高电压。 这种方法的另一个缺点和低侧电流采样一样,需要同步PWM和ADC。" h, n7 E" v) K* F ![]() 1.1.2.3、内置电流采样 & F, Y, k7 {) w+ k) D$ l. } ![]() + o+ P! E3 s0 c0 C- F9 q 内置电流检测(InlineCurrentSense)是使用起来最简单但是最精准的技术。 采样电阻串联在电机相线上,检测的电流始终都是电机相电流,因为电感中的电流不会突变,所以无论PWM占空比的状态如何,采样到的电流都是连续稳定的。 , Y( s3 o1 ?! e! Y8 F" J, | 这种方法非常适合Arduino,采样程序变得简单了,这应该是考虑到了MEGA328P微弱的性能以及跨平台时程序的适配。内置电流检测的缺点主要在于芯片,需要比常规放大器更好的PWM抑制功能的高精度双向运放,简单的说就是硬件成本高。 & m- N: S0 }7 T: F v5 e 1.2、电流变换 本节增加电流环,主要增加了以下功能,- n& t. L* m* F* i 1、AD转换获取电流值Ia和Ib,/ n# @/ d( K: O t9 s 2、通过Clark变换得到Iα和Iβ , 3、获取电机角度,通过Park变换得到Id和Iq, 4、Id、Iq不能突变,同时为减少干扰,做平滑滤波, 5、Id、Iq与设定值比较,通过PID运算得到Vd 和Vq, 1.2.1、AD转换9 r ^1 l( K$ p) P+ V 为了与官方代码保持一致,AD转换采用简单的单通道转换模式,主程序循环一次获取一次A/B相的电流。4 @) {0 q! r, c: I" z. E. W ![]() 1.2.2、clark变换 ![]() 1.2.3、Park变换 ![]() Park变换中的“θ”是电角度,由读出的编码器角度转变而来 " A, M5 z# ?% ?2 C ![]() 7 i: g0 B: J/ i1 [/ o. x- x 1.2.4、LPF运算: }3 f ^. \7 e( @, e, f. R dc_current模式只有 Iq 的LPF运算 foc_current模式有 Iq 和 Id 的LPF运算 . }6 w+ R, Q* M, y ![]() 6 g/ I! s6 g/ Z( M! \- P 1.2.5、PID运算 dc_current模式只有q轴电流的PID运算 foc_current模式有q轴电流和d轴电流两个变量的PID运算 电流环使用 P、I 两个参数。 ![]() 二、电流采样参数设置; `. Y/ n+ T F' M( V2 q 2.1、INA240介绍 INA240有四个型号,INA240A1是20倍放大倍数,INA240A2是50倍放大倍数。: L2 _& A$ ~7 C6 J/ z9 o 2 x: g7 z) Z2 y) |5 _3 D: W ![]() 8 L" b! w& L3 J2 u8 @9 }# V; ]) _ 电机的电流是正弦波,对于采样的差分信号来说,负半周期为负值,为方便处理,需要叠加上偏置电压以保证全周期的输出为正值。 , r9 a, c) m0 j) W7 S" |" g8 _' H ![]() 2.2、电流实际波形1 f: X# |; F7 q' _/ b# Q 下图为电机静止时A/B相运放输出端波形,VCC=3.3V,所以此时电压=1.65V, ![]() . d+ X* C6 Z: `0 W& N9 ^9 A h6 V 下图为电机转动时运放输出端波形) x4 f$ E6 U( @. `9 Y0 C ![]() # X. Y5 ~$ P! C* @! T5 J 2.3、SimpleFOC V2.0.3 的参数% [2 d& o6 _5 y/ D' [' A8 P ![]() 采样电阻0.01 Ω8 s+ d# N8 s7 h. Q5 u( M 运放为INA240A2,放大倍数50# B+ g2 N2 B4 H! n0 j) @# H 背面需分别短接A0/A2至输出; e6 r7 }6 d7 T& A3 }+ K C1_OUT=INA_VCC/2 + 0.01 * I * 50 如果INA_VCC=3.3V,C1_OUT=1.65 + 0.01 * I * 50,电流范围(-3.3A,3.3A)" P# s" k4 ` M9 h) x/ _3 | 如果INA_VCC=5.0V,C1_OUT=2.50 + 0.01 * I * 50,电流范围(-5A,5A) B相采样输入在PCB上为走线方便做了反向输入,所以放大倍数需乘以 -1(移植后的代码已经做了处理)。" l0 x( w, ?* f# L 2.4、PowerShield V0.2 的参数7 Z! t( e& h& x4 k) C 6 b- Z/ ^% |, V) _8 P" f. v8 j" r: D8 u ![]() 4 P: R0 A" h3 e8 M( U# F 采样电阻0.001 Ω 运放为INA240A2,放大倍数50 C1_OUT=1.65 + 0.001 * I * 50,电流范围(-33A,33A) / `0 l3 t& S3 B; d; K2 r 2.5、SimpleMotor 的参数" U% l7 P5 C1 F7 [ ( ~# {- J: J9 } K ![]() 采样电阻0.001 Ω) H& Q2 f* M# f3 Z9 d& M 运放为INA240A1,放大倍数20 C1_OUT=1.65 + 0.001 * I * 20,电流范围(-82.5A,82.5A)* C7 A- o- w% x! k 三、扭矩模式 SimpleFOC中有三种扭矩模式: Voltage mode - the simplest one DC current mode - 1xPID controller + 1xLPF FOC current mode - 2xPID controller + 2xLPF filters " n6 {, z8 z& x0 \& H 3.2.1、电压模式(Voltage mode)% M, X! \3 O: ?6 y- I L8 A4 v. } 电压模式是之前示例中一直使用的模式,3 K6 Y2 m7 ?( a) H/ s 因为不用采样电流,所以硬件简洁,程序简单,执行速度快, 适合低速电机控制 ![]() 3.2.2、直流模式(DC current mode) 检测电流大小,实现电流环控制 只控制Iq,设置Vd=0,/ f' l) ?' {6 B* h 像控制直流电机一样控制无刷直流电机的电流* X; W- D) ~# \4 `, ]$ e, b . H( k' |" C5 l ![]() 6 i" L5 X9 `/ N1 m A 3.2.3、FOC模式(FOC current mode) 控制Iq和Id,使转子中的磁力与永磁场精确偏移90度,从而确保最大转矩,) ^4 c5 d- n* |/ g1 Q 唯一真正的转矩控制方法,4 y6 K5 @0 }# Z- w { 保证电机始终工作在高效状态 4 l# E" }( G2 p ![]() 3.2.4、三种模式对比 * `& ~2 j9 Z2 S ![]() - T. [ G; P# U, G/ m2 X 四、硬件介绍 4.1、原理图$ N6 @3 q0 D: F& X 1 j' X4 g* L7 j0 Q- ` E O ![]() 4.2、SimpleMotor方案 4.2.1、准备清单6 P. L- t" G5 T9 z- Q4 q ![]() % Z6 Y' x. y0 t9 v ![]() 0 N t- f1 G1 G q1 ]9 W- U 带编码器云台电机可以是AS5600,也可以是TLE5012B。. |8 }# B: |' j& N9 R8 T/ R 4.2.2、接线& C+ l, d) C" J) C0 C( D8 E, v7 t ( E2 n' Y8 H7 d( \# t9 J ![]() % ?, z3 B) ?/ \' l 只展示M1的接线,M2的接线根据原理图自行连接。" p3 W1 D+ g5 d3 D( R4 m7 O) s " ~# `! Q4 Q2 R8 j# q& [' M+ F o 4.3、STM32方案 4.3.1、准备清单) [" }4 E" ]" {7 ~# Y+ M$ [( K ![]() 5 W! a3 ]+ n% |3 X ![]() 带编码器云台电机可以是AS5600,也可以是TLE5012B。( b- y# T, d9 p3 D) M5 h + W+ P5 } X2 U* r1 _ 4.3.2、接线- d* D+ Q, w9 e' T! O- u ![]() ' i) z+ b; I8 C Shield V2.0.3的背面按照上图短接 ![]() * I' W/ f# m$ O! O4 t( X- H+ C 对照 Shield V2.0.3 的原理图:, ]& m: T4 ^5 M6 n I5 H; s- s" ? ![]() 如果是AS5600编码器,如下9 f8 k" T7 G) `7 l4 p/ B3 b ; O5 |- g' I Z8 {8 U ![]() 5 k$ ~7 F; P. u- I1 D9 U 如果是TLE5012B编码器,如下 ![]() ![]() 只展示M1的接线,M2的接线根据原理图自行连接。& T# I1 |, F8 C( a1 H / l# c+ h. ]0 l; B 五、程序演示* Q% n! h* ~+ b% |0 L6 p # |0 m( A4 `) { t+ s1 a ![]() % s4 N- |9 A- K6 R ![]() 注意:1 _! W5 ]3 y! ~1 g0 O. Y8 ~ 1、voltage_limit最大只能设置为供电电压的 1/√3(12V限制为6.9,24V限制为13.8), 2、如果检测到的极对数与实际不符,停止继续操作,否则电机会堵转。' R5 @8 f3 W, N ; D0 X" k9 C- ~" R, p* z, i - y$ \* Q0 a5 a! z) t3 ^) Z 六、代码升级说明 1、优化PID子程序。之前代码把位置PID、速度PID和电流PID_q_d 各自做为独立的函数调用,本次升级只写一个函数,把PID相关参数定义为结构体,与官方代码保持一致。 * W/ O* Y+ F6 W A1 O( a 2、优化LPF子程序。与PID的做法相同,只写一个函数,把相关参数定义为结构体,与官方代码保持一致。1 Y7 n+ V) m* M+ } Q0 P 3、增加了对AS5047P、MA730编码器的支持(目前共支持AS5600、TLE5012B、AS5047P、MA730四种磁编),使用代码时只需在 MyProject.h 中把使用的型号设置为1即可。4 k6 O1 Q# T! Z1 g% P 4、官方最新的SimpleFOC库V2.2.0(2021年12月14日)版本新增加了sensor->update()函数,并因此对角度处理做了大改。/ D3 D2 S7 C; ~" Z 之前调试代码的时候,就发现官方代码中角度读取处理的不太好,特别是速度模式上电的时候电机会突然转一下然后停止,当时按照我的理解改进了这部分代码,最新版本中官方修补了这个问题,我本来是打算把这个部分升级到官方一致,但是修改了一天后发现官方的代码仍然很混乱(相信这部分代码官方以后还会再升级),所以此次放弃了这部分的升级,仍保持之前的设计思路,只做简单优化。 ; H! h% y# V8 x9 J- i, t$ C 5、升级零点检测,在已知电机参数的情况下,通过设置 零点偏移角度和方向,可以跳过检测。与官方代码保持一致。- r5 l; I2 ?8 `, |/ i: `3 w + R2 k* Y) U6 e# g7 q 6、优化了while主循环中的计时方式,由原来的timer4中断累加修改为systick查询。当前代码中只有一个串口接收中断。与官方代码保持一致。( q- z6 \; ^2 D! w$ A3 U ) m5 }. ^5 Z7 b% T 7、电流采样修改为三相采样。之前只写了两相采样,觉得两相就可以三相似乎浪费,调试ESP32drive的时候仔细看了下代码,发现三相多了一个平均处理,应该会比两相更可靠一点点,所以这次升级为第三相可选择,与官方代码保持一致。" B8 Q& \5 R; Q& t 8、升级后的代码可以很好的实现电流闭环,解决了之前发现的所有问题,所有功能都经过了本人的实际测试,当前代码在本人看来已无懈可击,虽为开源但也要认真负责。% Y+ p: I7 }5 \5 N ———————————————— 版权声明:loop222& f8 ^4 \9 r7 s; C' t1 o& B ! t) m. M, ]' E k( L# ` # O3 R4 i. Z6 k) y( o8 \- N |
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南
ST 微控制器电磁兼容性 (EMC) 设计指南