
一、说明 双电机控制,主要是在上一章代码的基础上(SimpleFOC移植STM32(五)—— 电流采样及其变换),把一个电机的控制修改了对两个电机的控制。你的第一感觉会怎么做,把代码复制一遍,一个电机变两个电机,这样代码量就太大了。SimpleFOC的官方代码采用C++编写,定义了类,C语言中的结构体与类相似,通过结构体及其指针的应用,代码同样可以达到高效强悍的效果。% a- O8 L8 L J% O; p1 i & K3 n% m2 \/ @' C& J 新建头文件 user.h ,定义电机的结构体,并声明M1,M2。下图 ![]() 在 main.c 中调用头文件,下图& r9 U* l) Q5 T! `4 K ![]() 代码结构与单个电机控制没有变化,下图 4 T7 k" s6 g' a5 Z; | ![]() ' {! |7 P& X. v5 C2 w3 p. m/ e" A2 y ![]() 9 @. E1 p) d' H9 w# U 编译后的代码稍微比单个电机控制大一点,下图 Y- }) F3 d. D( O* h# ~- T ; h% L& M8 h" i" } ![]() 4 s; n) N ?" a# R+ b/ s9 d4 u( E 本章的工作,主要是从上到下从里到外,逐一修改函数,增加结构体指针,下图 ( a7 O0 s3 m$ |9 D. t ![]() 二、硬件介绍0 E# @( e; `- z9 X 2.1、原理图) Q$ L5 T( o/ F ![]() - ~8 e: T% ?2 P. {2 b 2.2、准备清单5 N/ d q# I+ b* H5 H* l) y2 S( n1 @' n5 w 6 o6 b9 b, a8 Z& `: z ![]() 当前代码支持AS5600、AS5047P、TLE5012B和MA730编码器。& F, h8 ]$ k2 |- x % q( b! z8 w d( _9 w2 K5 p , l9 c7 Z. Y$ `4 @9 ^7 M% M+ | 2.3、接线' u7 C7 A/ N! e& ]$ ]. A, P ![]() ) a: {8 u% U/ D 三、程序演示 3.1、设置参数6 ]7 K' r8 K/ S& P2 f2 y8 T ![]() 3 I7 H5 w3 n, E' {# n4 S ![]() ! C" @6 B c( h+ a7 N6 a 部分PID参数设置放在了main函数中,设置其它PID参数请进入PID_init()函数。( F& c# G$ X2 }, Y3 O8 n4 x. y; Q " l9 v& i4 F/ C! ? * z9 A/ q4 n. C 3.2、编译下载 可以串口下载或者SWDIO下载;0 P( ]+ y+ R( t/ ]3 v/ ? 如果是串口下载,Boot加上跳线帽,下载完毕后拿掉跳线帽,按复位键重启或者断电重启。% a. l" Y2 n0 C$ X' y. s% B# K5 N( U" @ 注意:复位重启只能重启单片机,编码器没有重启,如果I2C接口编码器不能正确读出,请断电重启。SPI接口编码器不受此影响。# c+ ?! ]) o, [& N" T- ? 3.3、根据设置的控制模式操作 两个电机的参数和控制完全独立,可设置为不同的控制模式,具体操作请看之前的教程,此处不再赘述。6 H4 h% \5 ~ x$ b" a" ` 5 }9 N# F1 K; X* v8 M: t0 r 四、双电机控制总结 双电机控制在操作和控制技术上与之前保持一致,主要是结构体及其指针的应用; 当前代码理论上很容易扩展为三个电机、四个电机或者更多电机的控制,只要单片机有足够资源;/ l* l! {* F3 P$ j# B4 {$ S" {2 W 结构体(structure)再往前一步就是类(class),C和C++的区别主要是编程思维的区别,结构体已经是C语言在单片机编程中的极限了。" K" u# J0 I: a1 f6 k" }" ` 4 E- O* F6 O4 w/ u) `6 ~! |8 @+ l 7 @, [ K. D @+ l 五、力矩反馈- \8 q! {1 ?1 N1 u, E 5.1、原理! F, a F) r, Q4 P5 D4 _ 把两个电机的角度差做为力矩模式的目标值,使角度差趋向于0。当一个电机转动时,另一个电机因为角度差而产生力矩跟随转动;同样当一个电机堵转时,另一个电机也会因为角度差趋向于堵转电机的角度。, ^$ p) W0 m. W+ q; l$ i$ T' Y 代码是比较简单的,在双电机控制调试通过的情况下,只需要加入角度差计算就可以。 2 o) l' F* Z9 {( F ![]() 力矩反馈要实现以下目标:2 O5 C" Z+ n! j& j! t 1、两个电机一个转动,另一个跟随,停止转动,另一个也停止,能够自稳。 2、拆掉一个电机,只接入任一个电机能够自稳。( M$ K# o; c7 L/ {7 f# E' t) R : u( U0 B% ~0 ?! x' l! ]. v 5.2、硬件连接+ E, N7 E& s1 o 先以相同的两个电机为例 ![]() 4 P6 M3 V# e1 X 5.3、代码调试; L* }4 M S Z8 C2 X 代码简单,但是调试颇费功夫,让我想起了空调行业的一句谚语“三分设备,七分安装”,具体过程原因就不多说了,直接说结果。 如上图相同的两个电机,首先三相线不能接的一样,要让一个电机为CW另一个CCW,然后根据检测到的方向,调整代码中减数和被减数的位置。; n c9 e0 ]2 N8 P$ y5 t ![]() ![]() 同样,不同型号的电机也可以按照上面的方法调试, ! }7 e( h& }6 U. b; i ![]() / j" ?7 Y1 u$ E$ }% J% f ![]() ' Y$ C% ]- w5 D/ m8 b% g 调试的结果一定要符合以下两个目标: 1、两个电机一个转动,另一个跟随,停止转动,另一个也停止,能够自稳。0 x$ t/ e% G% s! ?7 E. |5 q7 s 2、拆掉一个电机,只接入任一个电机能够自稳。 1 z* I4 h$ f1 v 5.4、实战 9 s' {6 F4 @) c' H ![]() ' b; q; \* N( U% z. B) H ![]() # ^2 b! l' ], U' s+ o2 }5 W ————————————————8 F; D- @* i8 O& E: ?; o 版权声明:loop222 |
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南
ST 微控制器电磁兼容性 (EMC) 设计指南
适用于STM32微控制器的ΣΔ数字接口入门