目录
前言
X-CUBE-MCSDK 是 ST(意法半导体)推出的 STM32 电机控制软件开发套件(MCSDK),使用该软件对电机进行配置后,可以直接生成 FOC 控制电机源码工程,简化了开发过程。其中包括永磁同步电机(PMSM)固件库(FOC 控制)以及 STM32 电机控制工作台(用于配置 FOC 固件库参数)。如下:
其中 FOC 驱动库就是 FOC 的核心算法实现,MCWorkbench 为一款 PC 软件,用于配置FOC 固件库参数。它可以大大减少 STM32 PMSM FOC 固件配置所需的设计工作量和时间。用户通过 GUI 生成项目文件,并根据应用程序的需要,初始化对应的库。而且可以对所使用算法的某些变量实时监控和更改。
一、开发环境搭建
1.1 X-CUBE-MCSDK软件的安装
可以直接去ST官网下载,软件共有两种版本:X-CUBE-MCSDK 和 X-CUBE-MCSDK-FUL,其中 X-CUBE-MCSDK 在一些核心的算法使用 lib 的形式提供给用户,X-CUBE-MCSDK-FUL 则是完整的源码,如下图所示,不过其中 X-CUBE-MCSDK-FUL 在注册并获得批准后方可下载,X-CUBE-MCSDK 则不需要批准可以直接下载。也可以在附件资源中下载。
官网:https://www.st.com/content/st_com/zh.html
下载后可以得到名为:X-CUBE-MCSDK-FUL_5.4.4.exe 的安装包,双击安装即可,安装过程很简单这里就不在截图说明,注意,安装路径中不能有中文。安装完成后会在桌面生成 MotorControlWorkbench 5.4.4 和 Motor Profiler 5.4.4 两个软件,Motor Profiler 5.4.4 是用于自动测量电机参数的软件,不过使用该软件需要使用 ST 相关的主板和电机驱动板才可以,这里就不介绍该软件的时候方法。MotorControl Workbench 5.4.4 才是我们需要的软件,可以使用该软件配置电机驱动板等参数后就可以生成源代码。
打开MotorControlWorkbench 5.4.4可能会提示以下,直接点下载即可
1.2 STM32CubeMX软件安装
完成了 X-CUBE-MCSDK-FUL 的安装,接着我们还需要安装 STM32CubeMX,因为使用 X-CUBE-MCSDK-FUL 配置完之后,在生成代码时需要使用到 STM32CubeMX。
安装详见https://blog.csdn.net/weixin_44567668/article/details/133170724
二、FOC原理介绍
FOC原理见下链:https://blog.csdn.net/weixin_44567668/article/details/142583837
三、FOC例程创建
在使用 ST Motor Control Workbench (以下简称:Workbench) 前我们需要知道电机的一些参数,在我们知道电机参数后我们就可以使用 Workbench 来配置生成代码来控制电机了,以下我们使用 BLDC 速度控制使用霍尔传感器(HALL)为例来说一下 Workbench 的使用方法,以下只是简单介绍 Workbench 的使用,这里的目的是使用 Workbench 配置后生成的代码让电机跑起来,不过生成的代码并不能直接使用,还需要做简单的修改。电机参数参考如下:
电机参数 | BLDC | PMSM |
---|---|---|
极对数 | 2 对极 | 4 对极 |
额定转速 | 3000RPM | 3000RPM |
额定电流 | 5.90A | 4.00A |
额定电压 | 24V | 24V |
相电阻 | 0.42±10%Ω | 1.02±10%Ω |
相电感 | 1.12±20%0mH | 0.590±20%mH |
反电动势系数 | 4.3Vrms/krpm | 4.3Vrms/krpm |
编码器 | - | 1000 线 |
3.1 新建项目
双击 MotorControl Workbench 5.4.4 打开界面,整个界面可以分为 3 个部分:
①新建项目、加载项目、启动 Motor Profiler 5.4.4
②最近打开过的项目列表
③示例项目
这里我们点击 New Project 来创建我们的第一个项目,选择应用类型、控制板、驱动板和电机个数,这里我们都选择默认模式,选择完成后点击 OK 即可。
工程建立好了后,弹出参数配置界面整个界面可以大概分为 4 个部分:
①用户图标按钮,可以通过点击图标来新建、加载、保存项目、生成代码和上位机控制电机等;
②用于设置所选硬件的功能,如电机参数或传感器的使用;
③显示一些主要的参数;
④用于提示一些用户的操作反馈,或者错误等。
3.2 参数配置
3.2.1 芯片相关参数选择
-
选择MCU型号
点击下图中的芯片型号可以选择对应我们控制板的 MCU 型号,注意时钟源的选择
注意:
①如果没有对应芯片型号,所以选择型号较接近的即可
②外部晶振这里只能选择 24M,但是板载的外部高速晶振为8M,后续需要在CubeMX中修改 -
数字输出输入 I/O 配置
点击 Digital I/O 配置数字输出输入相关引脚,在这里需要配置驱动定时器和相关的引脚,以及霍尔传感器的配置,还可以配置串口和启动停止按键的 IO 配置,这里我们只需要根据原理图来配置就可以了,我们选择电机驱动接口 1 来接电机驱动板。
-
电流采集模拟接口
点击 Analog Input and Protection 可以配置模拟量输出相关的引脚和保护功能。如下图所示,这里可以配置采样电流相关的 ADC 和引脚,已经采样率等参数,只需要根据原理图中对应的引脚配置就可以了,这里的过流保护选择没有保护。
电源电压采集模拟接口设置如下:
温度采集模拟接口设置如下:
-
DAC功能
点击 DAC Functionality 可以配置DAC功能,这里主要是调试使用,DAC 设置用于调试时候观测 FOC 数据,例如将电机的电角度、交轴电流通过 DAC 方式输出,这样就可以使用示波器实时观测数据的变化,一般无需使用时直接选择不用即可。不过这里的输出引脚是固定的,只能是 PA4 和 PA5 并不能更改,而这里的 PA4 我们已经使用了,所以这里只能选择不使用。
-
引脚分配与检查
点击 Pin assignment 可以查看引脚的分配,Check 可以检查引脚是否有冲突,在检查 OK 后配置工作就完成了。
3.2.2 电压参数设置
- 设置母线电压
选择Rated Bus Voltage根据无刷驱动板输入电源范围设置母线电压
- 母线电压检测设置
点击 Bus Volatage Sensing 可以设置电压传感器相关参数,如下图所示。由于我们使用了电压隔离芯片,还使用加法电路,所以这里不能配置出适合我们驱动板的参数,需要我们重新实现电压的转换函数,所以这里对于我们的驱动板来只配置了前面的分压电路。
交流输入配置
在下图中,红框部分是关于交流输入的相关配置,不过我们驱动板使用的是直流输入,所以这部分我们可以不用管。
3.2.3 电机配置
-
电机基本参数
如下图所示,电机 Motor Parameters 可以配置电机相关的参数和传感器,以下内容需要根据实际使用的电机准确填写,否则可能导致电机无法启动或者抖动。在下图填写电机相关参数,如极对数、最大速度、额定电流电压等参数。
-
传感器设置
在下图中可以选择传感器,可以选择 HALL(霍尔) 和 Encoder(编码器),如果都不选则使用无传感器模式。此处要注意下“placement electrical angle”一栏,要根据情况设置霍尔传感器的放置电角度,使用 BLDC的话这里填的是 120,如果使用 PMSM是 240 deg,填写不正确可能导致电机鸣叫或不转等问题。
点击 Speed Sensing 可以打开速度反馈配置界面,如下图所示,这里可以选择使用什么传感器来反馈速度,可以配置主传感器和辅助传感器,这里配置主传感器为 HALL,不使用辅助传感器。
-
编码器模式
下面介绍使用编码器模式获取速度,关于电机和驱动板的参数配置与使用霍尔传感器模式基本一样,如下图所示,点击 Speed Sensing 后主传感器选择 Quadrature encoder 。
在 Motor-Parameters 感器勾选 Quadrature encoder ,编码器为 1000 线,
编码器模式同样需要配置启动参数,点击 Fimware Drive Management 后,选择 Start-up parameters,配置界面如下图所示。可以配置对齐时间、对齐角度和电流。
点击 Digital I/O 配置数字输出输入相关引脚,在这里需要选择编码器使用的定时器和引脚。
-
无感模式
上面我们介绍了霍尔感器获取速度的配置方法,现在我们介绍不使用传感器的配置方法,关于电机和驱动板的参数配置与使用霍尔传感器模式一样,如下图所示,点击 Speed Sensing 后主传感器选择 Sensor-less (Observer+PLL)
无感模式还需要配置启动参数,点击 Fimware Drive Management 后,选择 Start-up parameters,配置界面如下图所示。无感模式需要开环跑来后在切换到 FOC 模式控制,在下面参数中可以配置开环跑的相关参数,例如,开环对齐时持续时间,对齐电角度,速度上升时间,最终速度值等。
3.2.4 驱动板参数设置
-
MOS管驱动设置
点击 Phase U 可以配置 MOS 管的驱动极性,高电平有效,三相驱动配置完全一致
-
MOS管最大开关频率和死区时间设置
点击下图中的 Power Switches 就可以设置 MOS 管的相关参数。如下图所示在这里可以设置死区时间和 MOS 管的最大开关频率,从数据手册中可以知道我们使用的 MOS 管死区时间设置为 100ns 就可以。
-
温度传感器
点击 Temperature Sensing 可以设置温度传感器相关参数,如下图所示。不过该配置只支持 ST 的温度传感器,所以直接默认设置即可。
-
电流采样电路
点击 Current Sensing 可以配置电流采集相关的参数,如下图所示,这里根据我们的驱动板选择 3电阻采样,采样电阻的阻值为 0.02Ω,电压放大倍数配置为6倍。
然后勾选 Amplification on board ,点击 Calculate 来计算放大倍数。Calculate 选框可以不设置,默认参数如下:
接着设置过流保护功能,如下图设置:
3.2.5 固件驱动管理
- 驱动设置
点击 Fimware Drive Management 后,选择 Drive Settings,配置界面如下图所示。这里可以配置 PWM输出频率,通常配置为 10KHz~20KHz,这里我们配置为 16KHz。把高端和低端 MOS 管的空闲状态都设置为关,执行时间为 1ms。控制模式选择速度控制模式,默认目标速度设置为 1500RPM。左下侧PI 可以根据电机的运行效果来调整,转矩和磁通控制的 PI 这里使用默认参数,当然如果觉得控制效果不好也可以自己调整。
- 附加功能和 PFC 配置
点击 Fimware Drive Management 后,选择 Additional Features,在这里可以选择一些控制算法,不过我们这里都不选择。
- 传感器使能和固件保护配置
点击 Fimware Drive Management 后,选择 Sensing and FW protections,如下图所示,这里可以使能电压传感器和使能过压、欠压保护功能,并且配置有效的电压工作范围,超过电压范围后禁用PWM 输出。
- FreeRTOS
点击 Fimware Drive Management 后,选择 FreeRTOS,如下图所示,这里可以选择是否启用 FreeRTOS操作系统,这里我们不需要就不启用了。
- 用户界面
点击 User Interface 可以配置用户界面,在 SDK 5.x 中 LCD 相关的固件已经没有了,这里参数都被禁用,Start/Stop Button 选择使能,Serial Communication 中使能串口,使用 Bidirectional。
3.3 生成工程代码
在配置完所有参数后我们可以保存我们的项目了,点击 Save Project 就可以保存项目了(注意,保存路径中不能有中文)。
我们可以点击 Generation 来生成代码,如下图所示,左侧可以选STM32CubeMX,可以选择开发环境,这里我们选择 Keil MDK-ARM V5 ,固件版本可以选择最新或者已经下载好的版本,驱动类型选择 HAL 库。配置好后就可以点击 Generation 生成代码了。如果之后还需要修改配置,那么我们可以点击 UPDATE 来更新代码。
生成结束后可以打开 CubeMX 添加自己的设置,点击 RUNSTM32Cube…打开 CubeMX
3.4 修改工程代码
3.4.1 修改系统时钟配置
根据具体时钟配置
3.4.2 初始化 SD 控制脚
通过 STM32CubeMX 来初始化 SD 引脚,如下图所示,将 PG12 配置为 GPIO_Output,并且将默认的电平输出设置为高电平,User Labe 项填写 SD 。修改完成后保存关闭窗口,这里不使用STM32CubeMX 来生成代码,需要回到 Workbench,使用 Workbench 来更新代码(注意,不是生成)。
3.4.3 修改电压传感器
3.4.4 修改温度传感器
3.5 编译下载测试
修改完之后,编译下载后可以按 KEY2 来启动和停止电机。还可以使用 Workbench 里面的监视器来控制电机。如下图所示,点击 Monitor 图标就可以打开监视器了。
连接到开发板后,可以通过 Start Motor 和 Stop Motor 来启动和停止电机,可以通过速度旋钮来调节目标速度,或者通过旋钮下方的编辑框来调节目标速度,编辑好后回车就可以发送目标速度。可以通过速度表盘来观察速度值,也可以通过 plotting 来观察实际速度与目标速度的关系,如下图所示。
状态指示灯有 3 种颜色:
- 绿色:正常状态
- 红色:故障产生,并且没有被排除
- 黄色:故障产生,但是已经被排除
当故障故障产生时,对应的故障灯也会亮起,此时电机不能启动,需我们排除故障后才能启动电机。如下图所示,电机驱动板电压过低发生欠压故障,此时欠压故障灯和状态指示灯都为红色。当故障故障产生时,对应的故障灯也会亮起,此时电机不能启动,需我们排除故障后才能启动电
机。如下图所示,电机驱动板电压过低发生欠压故障,此时欠压故障灯和状态指示灯都为红色。
如果需要进一步调节 PID,可以点击 Advanced 按钮切换到参数调整,如下:
修改好 PID 之后可以点击 按钮把参数上传到开发板,观测运行效果。如果使能了DAC 输出,还可以选择 DAC 设置,默认是输出 a 和 b 电流。
四、ST MCSDK库源码介绍
以 5.4 版本的 MCSDK 库为例,Any 文件夹中包含 Src和Inc 文件夹,分别存放核心算法的源文件和头文件,源码目录如下:
学习 SDK 最好的方式便是阅读帮助文档,通过 ST MC Workbench 打开帮助文档的方法如下:
4.1 总体软件架构
MC SDK5.x 包含有芯片外设库、电机库和电机应用层三个主要部分,其中芯片外设库使用 STHAL/LL 库,可被各个层级调用;电机库则是主要的电机 FOC 控制层;最上层为电机应用层,供用户直接使用电机库,而不去关心底层如何实现的,加快用户程序开发;另外 MC SDK5.x 还提供 UI 库,用于界面调试通讯使用,比如和 Workbench 之间的交互就是通过 UI 库实现;这边强调的一点是电机库是综合体,包含 FOC 算法,单片机外设配置,中断机制等各个环节,简单控制可能只需要关心电机应用层即可,如果复杂控制将涉及到整体操作
在 SDK 使用过程中,电机本体,电机控制硬件板,控制管脚,控制策略在 MC workbench 中配置完成,顺序为 MC Workbench→CubeMx 工程 → 电机库代码(芯片外设库 + 电机控制库 + 电机驾驶舱 + 用户界面库 + 系统初始化),该生成代码加入简单 API 后(比如 MC_StartMotor1)可以直接运行对应电机,当需要细化控制或者复杂控制时才有可能涉及到修改电机控制库中的代码。
电机控制流程图如下图所示,其中电机的控制都在中断中执行:
4.2 电机控制库文件
在简单的电机控制应用中通常不需要修改这部分代码,如果在 Application MC API 层不能满足应用需求时才会需要修改这部分代码,在修改前需要对电机运行框架非常熟悉的情况下再来修改。
源文件 | 说明 |
---|---|
bus_voltage_sensor.c | 总线电压 |
circle_limitation.c | 电压极限限制 |
enc_align_ctrl.c | 编码器初始定位控制 |
encoder_speed_pos_fdbk.c | 编码器传感器相关 |
fast_div.c | 快速软件除法 |
hall_speed_pos_fdbk.c Hall | 传感器相关 |
inrush_current_limiter.c | 浪涌电流限制 |
mc_math.c | 数学计算 |
mc_interface.c | 马达控制底层接口 |
motor_power_measurement.c | 平均功率计算 |
ntc_temperature_sensor.c | NTC温度传感 |
open_loop.c | 开环控制 |
pid_regulator.c | PID 环路控制 |
pqd_motor_power_measurement.c | 功率计算 |
pwm_common.c | TIMER 同步使能 |
pwm_curr_fdbk.c | SVPWM,ADC 设定相关接口 |
r_divider_bus_voltage_sensor.c | 实际总线电压采集 |
virtual_bus_voltage_sensor.c | 虚拟总线电压 |
ramp_ext_mngr.c | 无传感开环转闭环控制 |
speed_pos_fdbk.c | 速度传感接口 |
speed_torq_ctrl.c | 速度力矩控制 |
state_machine.c | 电机状态相关 |
virtual_speed_sensor.c | 无传感开环运行相关 |
以下部分在工程中只会存在其中一个文件 | - |
ics_f4xx_pwm_curr_fdbk.c | STM32F4 的 ICS 采样 |
r1_f4xx_pwm_curr_fdbk.c | STM32F4 的单电阻采样 |
r3_1_f4xx_pwm_curr_fdbk.c | STM32F4 的三电阻采样(1 个 ADC) |
r3_2_f4xx_pwm_curr_fdbk.c | STM32F4 的三电阻采样(2 个 ADC) |
4.3 电机控制API
在 mc_api.c 中有各种可以供用户使用的 API 接口,对于普通的电机控制用户可以不用关心底层的实现,只需要使用这些 API 就可完成电机控制,电机库可以支持两个电机,在函数中使用后缀Motor1 和 Motor2 来区分是电机 1 还是电机 2。这里以控制电机 1 为例来说明个 API 接口的含义,电机 2 的控制类似。
函数名称 | 函数形参 | 函数返回值 | 函数功能 |
---|---|---|---|
MC_StartMotor1 | void | bool | 启动电机 |
MC_StopMotor1 | void | bool | 停止电机 |
MC_ProgramSpeedRampMotor1 | hFinalSpeed、hDurationms | void | 设定目标速度以及持续时间 |
MC_ProgramTorqueRampMotor1 | hFinalTorque、hDurationms | void | 设定目标力矩以及持续时间 |
MC_SetCurrentReferenceMotor1 | Iqdref | void | 设定 Iq,Id 参考 |
MC_GetCommandStateMotor1 | void | MCI_Command State_t | 返回指令执行状态 |
MC_StopSpeedRampMotor1 | void | bool | 停止速度指令执行,速度指令保存为执行停止前速度指令 |
MC_StopRampMotor1 | void | void | 停止执行电机正在运行的斜坡 |
MC_HasRampCompletedMotor1 | void | bool | 指令是否执行完成 |
MC_GetMecSpeedReferenceMotor1 | void | int16_t | 返回机械参考速度 |
MC_GetMecSpeedAverageMotor1 | void | int16_t | 返回平均机械速度 |
MC_GetLastRampFinalSpeedMotor1 | void | int16_t | 返回上次指令速度 |
MC_GetControlModeMotor1 | void | STC_Modality_t | 返回控制模式 |
MC_GetImposedDirectionMotor1 | void | int16_t | 返回电机转动方向 |
MC_GetSpeedSensorReliabilityMotor1 | void | bool | 返回当前速度传感器可信度 |
MC_GetPhaseCurrentAmplitudeMotor1 | void | int16_t | 返回电流值 |
MC_GetPhaseVoltageAmplitudeMotor1 | void | int16_t | 返回电压值 |
MC_GetIabMotor1 | void | ab_t | 返回 a,b 相电流 |
MC_GetIalphabetaMotor1 | void | alphabeta_t | 返回 clark 变换后的Iα,Iβ |
MC_GetIqdMotor1 | void | qd_t | 返回 park 变换后的 Id,Iq |
MC_GetIqdrefMotor1 | void | qd_t | 返回 Id,Iq 参考 |
MC_GetVqdMotor1 | void | qd_t | 返回变换电压量 Vd,Vq |
MC_GetValphabetaMotor1 | void | alphabeta_t | 返回变换电压量 Vα,Vβ |
MC_GetElAngledppMotor1 | void | int16_t | 返回电角度 DPP 数据 |
MC_GetTerefMotor1 | void | int16_t | 返回电流参考 |
MC_SetIdrefMotor1 | hNewIdref | void | 设定电流 Id 参考 |
MC_Clear_IqdrefMotor1 | void | void | Iq,Id 数据回到默认值 |
MC_AcknowledgeFaultMotor1 | void | bool | 清除异常状态 |
MC_GetOccurredFaultsMotor1 | void | uint16_t | 得到发生了的故障状态 |
MC_GetCurrentFaultsMotor1 | void | uint16_t | 得到当前的故障状态 |
MC_GetSTMStateMotor1 | void | State_t | 得到电机状态 |
上面表格中只是简单的函数功能说明,更加详细的说明请参考函数源码或函数源码前的注释。
补充
使用MotorControl Workbench 5.4.4生成工程代码可能会出现以下报错
此时直接删除红色目录下对应文件,即可成功生成代码