
一、电机的三种控制模式) g: d# a- U9 Q (为保证本文可读性,把之前写过的搬运到此。) 1.1、力矩控制模式 ◎电机在运行过程的电流,始终等于给定的值。 ◎比如使用电机来拉伸弹簧,设定电流值越大,弹簧被拉伸的长度越长。设定电流越小,弹簧被拉伸的长度越短。设定电流为零,弹簧不被拉伸。 ◎在SimpleFOC项目中,受限于Arduino UNO的运行速度,大部分例程没有使用电流采样,所以设定电压值代替设定电流值。1 @# H+ X( T; T( F 1.2、速度控制模式4 x4 A3 ^7 r) r* q5 f ◎让电机始终按照设定的速度运转,不因负载的变化而变化。 ◎速度控制一般会采用内环电流环,外环速度环的方式,所以可以限制转动过程中的电流不超过设定值。 ◎比如传送带传送物品,给定的速度不会因为传送带上是空载或者带载发生变化,但是当负载过大,电流超过设定值的时候会报警或自动停止。 & d( d1 k# W/ @9 r: \+ f 1.3、位置控制模式 ◎精确控制电机转动到指定角度, ◎位置控制一般会采用内环电流环,外环速度环,最外环位置环的方式,所以可以限制转动过程中的最大速度,和最大电流。% f- u {0 o8 N ◎比如机械臂从A点运动到B点,并限制挥舞过程中的最大速度和最大力矩。 3 B2 T& i. [- O+ E9 W! y0 A! } 二、硬件介绍/ M/ H0 B8 t5 e9 ~* {: Z 本节实验适合运行在SimpleMotor和STM32最小系统板上(Bluepill)。 3 E/ i7 n1 w9 r( Q' J* J 2.1、原理图 ![]() 2.2、SimpleMotor方案 2.2.1、准备清单6 n1 Z( f: Z' M5 S* d ![]() 0 U5 x3 u+ ~- L- k ![]() 带编码器云台电机可以是AS5600,也可以是TLE5012B。 2.2.2、接线8 m/ ~+ b: F$ J, X3 | x ![]() 4 {" v5 B& \5 _% `6 j, A8 V 只展示M1的接线,M2的接线根据原理图自行连接。 ! d/ C, j" C6 @1 y$ n 2.3、STM32方案 2.3.1、准备清单9 ^/ U$ E* z/ b4 x ![]() * z( Z8 f) m& ~! h ![]() 带编码器云台电机可以是AS5600,也可以是TLE5012B。, G: X* Y3 h7 I- l/ K3 U $ y2 c4 s3 M F 2.3.2、接线% q! z% Q" G7 e+ i$ Q ![]() 6 Y2 R$ W0 ]% [( Q- T 对照 Shield V2.0.3 的原理图:9 n H: Y$ U' |; q$ y ![]() ![]() : ` Y6 y0 F8 z ![]() ( P( V4 j+ j9 S6 }! f5 x* I 只展示M1的接线,M2的接线根据原理图自行连接。 ' w$ p3 T$ O( K6 E, s+ ?" f+ K 三、控制原理* H5 Q( N. ~' ]) B4 Q0 e$ [ o 3.1、闭环控制原理9 H4 q8 s' x- H4 M v4 I 1、力矩模式 ![]() % g& o- C4 [9 c; ]! n9 p. x. Z6 v ◎串口设定值为Uq,Ud固定为0; ◎控制原理与开环控制很像,核心代码是SVPWM; ◎开环的θ是人为设定的,而闭环的θ来自编码器。 5 c$ h* ^8 t/ ]. P7 j7 L) Z 2、速度模式 ![]() |# @( E7 C! L" {6 A0 x ◎力矩闭环外增加了速度环;0 C# x$ O9 D: H# ]7 u/ }1 j ◎串口设定值为期望速度(Vd);4 f3 v( f( M) D, h" P2 v( k% ~ ◎实际速度和期望速度的差作为PID输入,输出值为SVPWM的输入(Uq),Ud固定为0;) s7 L# ^) @5 p5 M% Y ◎编码器读到的角度为机械角度,先转为电角度供SVPWM使用(θ); ◎根据最近两次的角度差和时间差计算出当前速度(v),速度做滤波处理(Vf),因为速度要保持平滑不能突变; 0 `, i8 p6 q. I# n7 `% S5 u 3、位置模式* g, _) u9 t0 N5 S" l' L0 _1 N! y $ L0 I) m5 N9 G7 h$ J ![]() ( p& v# e+ F& W3 |: Q ◎与速度环相比多了一个位置环,相应的要调试位置环PID,创作者的代码中只使用了P参数,实际应用中一般会用PD参数。 ; Z8 s U- J- r' a 3.2、零点检测! W8 _9 O" z* G 一般的无刷电机驱动器会有个学习模式,用拨码开关切换,第一次使用先拨到学习模式,检测电机参数后保存到内部flash。然后切换到工作模式,驱动器每次上电都会导入存储的参数,执行控制。" `6 p+ B3 a8 v) I8 I7 h( B SimpleFOC上电后也会检测电机参数,但是没有保存的动作,所以每次上电都要检测,对于带磁编码器的电机,需要检测机械角度和电角度的偏差(zero_electric_angle),和电机极对数(pole_pairs)。 机械角度零点和电角度的零点,在实际操作中基本是不可能对齐的,所以同学们不要有通过调整编码器角度,把零点对齐的这个想法。 ![]() 4 U/ [3 T- [2 r3 E4 u8 C2 d% W ![]() . q) e' D; M8 t5 ^8 {! ^ 代码位置在:BLDCMotor.c,9 H5 n1 g1 {0 i. Y6 [/ p0 a- d% a 0 V, E2 H" q1 L s4 y$ U2 N ![]() ![]() 3.3、零点检测代码简单说明) E7 {) }6 s+ W$ i - X$ |$ c$ F: J& j, p/ b+ ^7 _ 关于代码中为什么要加 _3PI_2 的原因: ![]() ; d& l/ }! M1 s3 ? 磁场方向为d轴,垂直于转子磁场方向为q轴,d轴建立磁场,q轴做功, 因为q轴是垂直磁场的,假如设置 θ=0°,电机最终停留在90°位置,所以要想让电机停留在0°,需设置 θ=270°。 而d轴是磁场方向,设置θ=0°,电机就停留在0°。 所以设置Uq=x,θ=270°,其效果等同于Ud=x,θ=0°。# j8 F5 j( d1 o6 b& m ![]() 以开环的方式实际测试,证明了确实是这样。& q: B) \6 A1 q$ S; a0 C( S- x! A 四、程序演示 4 @, P2 z5 |8 [) F ![]() ![]() ![]() 注意:如果检测到的极对数与实际不符,停止继续操作,否则电机会堵转 7 ~* F" h/ u" U3 h! _/ Q7 y0 Z 4.1、力矩模式 1、选择力矩模式,其它参数根据实际情况设置 : ]* c; y3 J `: K7 e: J$ q ![]() 2、编译下载; T8 {. t4 F& B& o P 可以串口下载或者SWDIO下载;7 ?3 U u. F" N: L+ [ 如果是串口下载,Boot加上跳线帽,下载完毕后拿掉跳线帽,按复位键重启或者断电重启。8 u4 }4 I' R4 N3 Z( c 注意:复位重启只能重启单片机,编码器没有重启,这可能会导致重启后的I2C接口编码器不能正确读出,SPI接口编码器不受影响。 3、等待初始化完成2 h, `/ c. Y/ {5 t q" d9 Y2 I 4、串口发送指令,此时发送的数据表示电压值Uq 注意:设置的电压值不能超过voltage_power_supply/√3,比如电源电压12V,设置不能超过6.92V。1 K# d, d( G- h% S ![]() ! C8 A" i( O9 x/ B 5、给电机施加阻力,感受不同电压对应不同的力矩+ h# o: y# A# x 注意:力矩模式不涉及PID,所以比较简单,大功率电机设置电压值不能太大。1 `* A" L7 @. q3 o) {$ D 4 ^) z \; i' B4 S $ f9 J* D2 b Z1 q0 I" s 4.2、速度模式. x8 x/ o/ D. h) ], }& W 1、选择速度模式 ![]() + {8 p0 T! p) k8 N1 j 注意:PID参数根据电机实际情况自行设置。( [% P+ P# A5 ?8 H' E, {; P. O : ^7 n3 m$ ~( G3 Z% h( H k' W 2、编译下载 3、重新上电,等待电机初始化完成5 o% w: H. {: W$ A% E5 Y 4、串口发送指令T6.28,观察电机是否以1圈/秒的速度转动。1 F0 ~: f+ _ [ O5 Q + r% ?; x( o# w& P2 V' x ![]() 5、设置不同速度,观察电机转动变化。给电机施加阻力,观察电机转动 4.3、位置模式 1、选择位置模式 " v/ {% c) w# z5 [2 M ![]() 注意:本例中,位置模式包含了位置PID和速度PID,根据电机实际情况自行设置,不了解PID的请百度。 2、编译下载- h# c5 ?' S0 ]$ a, `' o3 i& ~9 m 3、重新上电,等待电机初始化完成 4、串口发送指令T6.28,观察电机是否转动一圈 上电后为了保证电机为静止状态,设置初始化后的目标角度为当前角度,所以第一次设置角度6.28,电机不会转一圈。第一次可以设置目标角度为0。5 n: T! {" u+ Y' x1 P2 ~8 Z2 ?' N4 u ![]() / v9 b7 |6 ~3 s) S G4 R' b& R ————————————————. k# O/ e( q6 P" ] 版权声明:loop2220 f, R# c/ K1 D% b/ ^2 N* b4 j4 m9 z2 K 7 \1 l" Y/ `5 D! b |
【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) 设计指南