本文内容与 AN13902:《基于 S32K344 的三相无传感器 PMSM 电机控制套件(使用 MBDT 模块)》完全一致
基于模型的设计工具箱 (Model-Based Design Toolbox,MBDT) 支持通过 MATLAB® 和 Simulink® 环境实现面向 NXP 处理器的基于模型的设计流程。
该工具箱旨在助力开发日益复杂的应用,它是一组工具和库的集合,可帮助客户在 MCU 和处理器上进行原型设计并加速算法开发。
MBDT 整合了 NXP 工具(实时驱动程序、配置工具、汽车数学和电机控制库 (AMMCLib)、编译器和工具链),提供完整的开发解决方案,具有以下优势:
S32K3 是基于 Arm® Cortex®-M7 的微控制器系列,提供单核、双核和锁步核配置,支持高达 ASIL(汽车安全完整性等级)D 功能安全的汽车和工业应用,运行频率高达 240MHz,配备浮点单元 (FPU)。S32K3 适用于电机控制、电池管理系统(BMS)或车身控制模块 (BCM) 等应用。
适用于 S32K3 的 MBDT 插件包含一个电机控制示例 (s32k3xx_mc_pmsm.mdl),支持以下功能:
如需安装适用于 S32K3 的 MBDT 插件,请查看 NXP MBDT 页面下的《S32K3xx 基于模型的设计工具箱 - 快速入门指南》。
s32k3xx_mc_pmsm.mdl 示例展示了如何使用 MCSPTE1AK344 无刷直流电机 (BLDC) 和永磁同步电机 (PMSM) 电机控制开发套件,通过两个分流电流传感器实现永磁同步电机 (PMSM) 的磁场定向控制 (FOC) 矢量控制。此 Simulink® 模型配置为与 Sunrise 42BLY3A78-24110 电机配合使用,但用户可加载 “s32k3xx_mc_pmsm_data_linix.m” 脚本以使用 Linix 45ZWN24-40 电机。
应用程序部署到目标设备后,RGBLED0_GREEN 应保持常亮。通过提供的项目选择所需的电机速度,然后在 FreeMASTER 中按下 “On/Off” 按钮。或者,可按下 USER_SW0 按钮(板上的 SW6)以顺时针(CW)模式启动电机,或按下 USER_SW1 按钮(板上的 SW5)以逆时针(CCW)模式启动电机。同时按下两个按钮或复位按钮将停止电机。同时按下两个按钮或复位按钮可停止电机。
若无误,电机应开始旋转,且 RGBLED0_GREEN 将开始闪烁。若出现任何错误,电机将不运行,且 RGBLED0 将从绿色变为红色常亮。
下图展示了包含所有模块的模型概览:
主要模块如下:
生成代码中运行的第一个模块用于配置:
硬件中断处理程序由 ADC(模数转换器)激活,并以 100μs 的周期循环调用以采样 FOC 状态变量,它是该电机控制应用程序的主要驱动程序。
DEVKIT-MOTORGD 上的分流电阻用于测量电机定子相电流。电流流过逆变器的每个桥臂 (R56、R57 和 R58),产生的电压降输入运算放大器进行增益调整和信号滤波,然后由 ADC 外设读取。R60 用作直流母线电流的低侧分流电阻。
尽管 S32K344 包含三个 ADC,且板上有三个分流电阻(R56、R57 和 R58),但本应用中同时仅监控两个电流,以展示 ADC 单触发模式和 BCTU 控制模式的并行使用。第三个定子电流通过以下公式获得:
有关电流测量的特定硬件的更多详细信息,请参见《基于 S32K344 的三相无传感器 PMSM 电机控制套件(使用 RTD 底层 API)》应用笔记 AN13767 的第 3.3 章 “相电流测量”。
硬件中断处理程序调用测量块子系统:
Measurement 模块读取 ADC FIFO(先进先出)缓冲区,并使用多路复用器 (MUX) 创建一个包含 3 个信号的总线,每个信号包含相应 ADC 通道的值:
此子系统还为其他子系统生成函数调用:
该模块提供启动电机顺时针(CW)或逆时针(CCW)方向并停止电机的功能:
当按下 USER_SW0 按钮时,电机沿顺时针方向启动,而当按下 USER_SW1 按钮时,电机沿逆时针方向启动。
同时按下两个按钮将停止电机并重新准备系统以便再次启动。
FreeMASTER 工具可读取两个全局变量(btSpeedUp 和 btSpeedDown),以顺时针或逆时针方向启动或停止电机。
通过连续按下同一按钮来逐步增加/减小速度,这会触发下面的 If Action 子系统:
如果 “cntSpeedUp” 值大于 “MBD_SPEED_UP_CNT”,计数器值将重置为 0;否则,它将随着子系统的每次运行而增加。
这是MATLAB模型中的主电机控制模块,也是最复杂的一个:
主状态机模块控制电机控制应用程序的流程:
应用程序状态机由以下六个状态组成:
INIT状态是第一个执行的状态,在此状态下,PWM输出被禁用,变量被重置为零。
初始化后,RGBLED0_GREEN 设置为 “点亮”,并在设备进入 “READY” 状态之前设置 “MBD_ready”。
系统进入CALIB状态后,测量 A 相和 B 相电流的偏移量。
接着是电机的 ALIGN 阶段,启动斜坡启动,电机进入 RUN 状态,在此状态下电机从开环切换到闭环。
每个状态都会调用模型子系统,接下来我们将详细研究这些构建元素。
该模块基于原始 ADC 读数计算所有定子电流,并计算事件和直流母线电压:
查看 “ Compute Events and ADCs” 模块内部:
仅当电机在 OnOffState 设置为 OFF 且 OnOffSwitch 设置为 TRUE 时启动,或者电机在 OnOffState 设置为开启 ON 且 OnOffSwitch 设置为 FALSE 时停止,才会生成事件。
该子系统检查 OnOffState 是否等于 1,如果为真,它将设置事件的输出为 MBD_e_app_on;否则,输出为关闭。
Calc_iABC获取ADC的原始值并将其转换为实际电流:
它还使用以下公式确定第三个定子电流:
UDC_filt 模块获取原始 ADC 值并计算原始和滤波后的直流母线电压:
原始 ADC 值经过偏移和乘以 MATLAB 脚本 “s32k3xx_mc_pmsm_data.m” 中的常数 MBD_U_DCB_MAX。
AMMCLib 函数 GDFLIB_FilterMA 实现指数移动平均滤波器。滤波器将根据预设值初始化内部状态。
此预设的目的是避免过大的瞬态。在这种情况下,使用常数12是因为额定直流电压为12伏。
UDC_filt 模块的输出更新两个全局变量:
这些变量特别重要,因为它们在故障状态下的电流环路中用于检查过压、在对齐状态中以及用于消除直流母线纹波。
此代码块将所有变量重置为其默认初始状态,并调用一个函数来禁用PWM:
InitLeds 模块将 RGBLED0 设置为零,同时将 OnOffState、OnOffSwitch 和 SwitchFaultClear 也设置为零:
在所有变量设置完成后,MBD_e_init_done 被发送到全局变量 Event。
该模块检查 MBD_State 是否为故障状态,然后检查可能出现的各种错误,例如过流、过压和欠压:
还会检查 A、B 或 C 各相的过流,以及直流母线过压和直流母线过流。
如果达到任何限制,将触发禁用 PWM 输出的函数调用。
该子系统通过为 D 和 Q 参考设置恒定值来对齐电机轴:
SetStates子系统设置变量并重置对齐过程所需的计数器:
逆帕克变换由Calc_uAIBReq用于计算Ud和Uq电压:
Wait_to_align 模块使用计数器等待电机轴机械对齐:
对齐子系统使用计时器等待,直到计数器为负,然后重置所有以下变量:DutyCycleValues (:)、uDQReq1、uDQReq2、iDQReq1、iDQReq2、Rst_FastLoop、Rst_SlowLoop、trackingToSensorless、speedLoopCntr、openLoop_wRotEl、pospeControl_wRotEl、sensorless_wRotEl、sensorless_thRotEl、openLoop_thRotEl:
在所有值设置完成后,MBD_e_align_done将被发送到 Event 全局变量。
最后一个子系统用于消除直流母线纹波并计算 PWM 占空比:
它使用了两个 AMMCLib 函数“GMCLIB_ElimDcBusRip”和“GMCLIB_SvmStd_FLT”。
“GMCLIB_ElimDcBusRip” 函数提供了一种计算方法,用于重新计算所需定子电压矢量的直轴 Uα 和交轴 Uβ 分量,以补偿功率级直流母线上的电压纹波。
“GMCLIB_SvmStd_FLT”函数将两相(α-β)正交坐标系中的值转换为由两组星形连接的三相定子绕组(f32A-f32B-f32C)和(f32D-f32E-f32F)组成的六相系统,使用空间矢量调制(SVM)算法。
为了说明从定子参考电压(α 和 β)到改进型空间矢量调制 (SVM) 的转换,我们可以仔细观察下面的波形:
我们采用改进型空间矢量调制,通过持续上下偏移三相电压系统,实现直流母线电压的充分利用。
这种偏移称为 “三次谐波注入”,能够使基波振幅提高 15.5%,与标准正弦 PWM 调制相比,可使电机达到更高的速度范围或输出更大的扭矩。
此状态包含 2 个块 GreenLedOn 和 ReadyStateSetStates,如下图所示:
GreenLedOn 模块将 RGBLED0 设置为纯绿色常亮,并关闭另外两个颜色的 LED。
“ReadyStateSetStates” 将值“MBD_e_ready”发送到 Event,并将常量“MBD_ready”发送到“MBD_State”全局变量。
就绪状态子系统还会生成一个函数调用来禁用 PWM 输出。
该模块计算 A 相和 B 相电流的偏移量,并使用计数器等待,直至可以重置变量:
“Calculate_I_ABCoffsets”使用 MATLAB 脚本中的“IphaseAB_raw”值和常数“MBD_I_MAX”作为 AMMCLib 模块的输入。
“GDFLIB_FilterMA_FLT” 函数模块实现了一个指数移动平均滤波器,用于计算原始相电流与脚本 “s32k3xx_mc_pmsm_data.m” 文件中设置为常数的最大电流 “MBD_I_MAX” 之间的偏移量。
该函数返回一个单精度浮点值,表示步骤 (k) 中输入信号的滤波值。
计数器的实现很简单,每一步都使用递减并进行比较:
如果 “CalibCnt” 计数器值大于 “CalibTimer” 值,它将触发 “ResetVariables” 子系统:
这将设置所有上述变量,并将值“MBD_e_calib_done”发送到事件全局状态。
这是主要的应用模块,包含重置函数和电机控制环路:
“Rst_FastLoop”变量用于在用户希望停止并重新启动电机时重置电机控制算法。
电机控制算法如下图所示,从电流采集、Clark+Park 变换、反电动势和角度跟踪观测器、电流环路、反 Park 变换加直流母线纹波补偿到 PWM 输出:
上述示意图与应用笔记 AN13767《基于 S32K344 的三相无传感器 PMSM 电机控制套件(使用 RTD 底层 API)》中的电机控制应用类似:
为了简化控制系统,我们可以从模块集的角度 “线性” 审视这种电机控制算法:
第一步是获取电机定子相电流。
分流电阻上的电压降被送入运算放大器进行放大和信号滤波,然后输入到模数转换器(ADC)。
随后,ADC 用于检测两相电流,然后电机控制算法根据基尔霍夫定律计算第三相电流,该定律指出流入节点的电流之和为零:
然后使用正向 Clark 变换将三相系统转换为两相正交系统 (α,β)。
然后使用 Park 变换将静止系统转换为旋转 d-q 参考系,之后将其输入到反电动势和角度跟踪观察器中,以计算下一个 PWM 换向的指令电压。
使用反 Park 变换将 d-q 坐标转换回 α 和 β 静止坐标系。
空间矢量调制 (SVM) 模块使用反 Clark 变换生成电机绕组的三相电压,完成从电流采集到生成电压指令的电机控制环路。
有关方程、静止和旋转参考系的更多信息,请参阅应用笔记 AN13767 的第 3.2 章 “正交相同步参考系中的 PMSM 模型”。
在称为磁场定向控制 (FOC) 的变频驱动控制方法中,电流控制至关重要。将定子相电流转换为正交旋转两相系统后,会得到两个独立的电流分量。
直轴(d 轴)电流分量称为磁通产生分量,与磁通量正交的交轴(q 轴)分量称为转矩产生分量。
电流控制环路用于以高精度、高动态性和高带宽控制三相电机的转矩和磁通量。
回顾 MATLAB 模型,让我们按照从 ADC 信号采集到 PWM 输出电压指令的相同逻辑进行介绍。
首先,我们将 ADC 原始值输入到 “Calc_iABC” 模块中,该模块计算三相电流,然后使用 “CurrentSenseProcessing” 模块将其转换为单精度浮点数。
其次,是正向 Clark 变换子系统:
这使用“GMCLIB_Clark_FLT”单精度浮点函数,用于将三相(A-B-C)坐标系中的值转换为两相(α-β)正交坐标系,遵循以下方程:
接下来是Park变换,使用“GMCLIB_Park_FLT”函数:
这根据以下方程将两相(α-β)静止正交坐标系中的值转换为两相(d-q)旋转正交坐标系中的值:
其中,(theta_e) 表示转子磁通的电气位置。
电流环路模块接收 d-q 电流坐标作为输入,如下所示:
“AMCLIB_CurrentLoop” 函数实现电流控制环路,它是 FOC 的组成部分,代表电机控制结构中最内层的环路。
电流控制环路包含两个递归形式的 PI 控制器,其参数可在 AMMCLib 模块内配置:
这些参数可在模型文件夹的脚本 “s32k3xx_mc_pmsm_data.m” 中修改。
电流环路的输出是所需的 Ud 和 Uq 指令电压,它们被送入反 Park 模块:
“GMCLIB_ParkInv”函数计算逆帕克变换,将两相(d-q)旋转正交坐标系中的量转换为两相(α-β)静止正交坐标系,使用以下方程:
接下来,两个信号馈送到 DC 总线 Ripple Compensation 模块:
接下来,这两个信号送入直流母线纹波补偿模块:
DutyCycleValues值用于更新生成 PWM 信号的 MCU 定时器,这些信号被输入到 GD3000 MOSFET 驱动器中。
“sin-cos” 模块计算转子位置 (theta_e) 的正弦值和余弦值:
这些信号是角度估计所必需的,并被送入 Park 和反 Park 模块。
反电动势和角度跟踪观察器模块的顶部包含以下内容:
“AMCLIB_BemfObsrvDQ”函数返回实际旋转参考系与估计旋转参考系之间的相位误差:
反电动势和角度跟踪观察器模块的底部包含“AMCLIB_TrackObsrv_FLT”函数:
位置跟踪观测器具有一个 PI 控制器,用于计算工作点 Θestim = Θe 附近的线性近似。
该块的参数是:
观察者将“Omega_e”输入到速度回路中,该回路在此模型中被称为慢速回路。
以上所有模块都是电机控制算法“Fast Loop”的一部分,对于当前控制逻辑至关重要。
该函数接收由 “AMCLIB_BemfObsrvDQ” 计算的相位误差 (Θerr),并使用它来估计转子的角速度和位置。
估计的转子位置是通过在锁相环(PLL)中将γ-δ参考框架的相位误差(Θerr)驱动至零来获得的。
PLL 结构如下图所示:
此外,我们将介绍其他所需的模块或子系统。
Speed Loop 子系统的运行速度远低于 Current Loop:
当计数器 “speedLoopCntr” 等于变量 “MBD_SPEED_LOOP_CNTR” 时,慢速环路子系统运行,其执行速度是快速环路的 1/10:
首先,进入该子系统后,计数器 “speedLoopCntr” 重置为零,然后进行检查:
如果 “PosMode” 等于 2,意味着电机处于无传感器模式,它将设置速度:
“PosMode1” 内部有一个小型状态机,用作速度限制器:
这将速度输出限制在两个限值之间:“-HighLimSpeed” 和 “+HighLimSpeed”。
速度环路模块实现 “AMCLIB_FWSpeedLoop” 函数:
“AMCLIB_FWSpeedLoop” 函数在 FOC 外环控制中实现速度 PI 控制器,并为永磁同步电机实现弱磁算法:
上述 diagram 所示的外环中,“AMCLIB FWSpeedLoop” 函数实现了速度 PI 控制器和弱磁控制器。
该模块使用AMMCLib库中的几个函数计算开环“theta_e”:
为了计算 theta,我们知道角速度 (ω) 等于角位置 θ 随时间的变化率:
此外,我们可以根据以下公式对 omega 进行积分:
现在让我们看看 MATLAB 中的实现:
这将 “FwSpeedLoop_pRamp_fltState” 变量值除以常数 “MBD_WEL_MAX”,并将其转换为 32 位分数数据类型。
Open Loop 的第二部分由以下组成:
“GFLIB_IntegratorTR” 函数使用梯形(双线性)变换实现离散积分器。
结果被转换为 32 位分数数据类型,并乘以常数 “pi”。
系统中有四种运行模式:
根据具体场景,每种模式会修改不同的参数。
force mode 施加开环 omega,其他变量为零:
tracking mode 将控制 omega 设置为零,theta 设置为开环值:
当电机在闭环(无传感器)模式下运行时,位置模式为第二种情况。
这将变量 “sensorless_thRotEl” 中的 “theta_e” 除以常数 “pi”,并将其转换为 32 位分数数据类型。
默认模式是:
自动模式由一个状态机组成,该状态机根据开环速度切换“PosMode”:
函数“MLIB_Abs_FLT”返回开环电气欧米茄的绝对值。
“PosMode” 状态机有以下状态:
根据 Open Loop Speed 有 3 种状态:
这确保电机控制算法根据速度自动切换运行模式。
该模块实现一个定时器,用于切换 RGBLED0_GREEN 的状态。
该子系统的第二个功能是关闭另外两个 LED,为 RGBLED0_BLUE 和 RGBLED0_RED 的 NXP 函数模块 Dio_WriteChannel 赋予值 0。
定时器使用变量 “LEDCounter”,该变量在快速环路的每个周期递增,并与值 2500 进行比较。
如果大于 2500,它将把计数器值重新初始化为 0,并触发 If Action 子系统:
在此子系统中,将 LEDState 与逻辑 “1” 进行比较,并进行按位异或屏蔽,将结果值赋予 RGBLED0_GREEN 的变量和函数 Dio_WriteChannel。
该模块根据硬件缩放和每个通道的预先计算值生成相应的PWM占空比值。
占空比以数组形式存储在一个数据变量中,对应三个通道。
它们与常数 “32768” 相乘以实现占空比偏移,然后被输入到每个 PWM 通道。
此外,“DutyCycleValues” 会根据相同 PWM 模块的相位偏移输入进行调整,Sync Update 输入为常数 “1”,这意味着每个通道都是同步的。
该子系统使用 NXP PWM 模块和 “PWM_SetDutyPhaseShift” 函数来对齐三个通道:PWM0、PWM1 和 PWM2。
打开 “S32K_PMSM_Sensorless” 项目,点击 “App Control” 页面,使用速度仪表选择所需速度,然后点击 “On/Off” 按钮:
此外,用户可以查看各种参数,例如下面的 IDQ currents:
我们还可以仔细查看三相电机电流:
三相电流以 RGB 颜色表示,根据电机负载不同,其峰值为 1.4 [A]。
MCSPTE1AK344 开发套件提供了一整套硬件功能,与上述的 s32k3xx_mc_pmsm.mdl 示例配合使用,为使用恩智浦(NXP)适用于 NXP Model-Based Design Toolbox for S32K3 进行电机控制算法建模创造了完整的开箱即用体验。
MBDT 在 Simulink® 环境中集成了 NXP 的各类工具,如汽车数学与电机控制库 (AMMCLib)、编译器、配置工具、实时驱动程序 (RTD) 和工具链。它与 Embedded Coder® 一起,为微控制器生成优化代码,确保最先进的软件循环能够在恩智浦微控制器上以最高性能运行。
要了解更多关于适用于 S32K3 的基于模型的设计工具箱的功能,请访问 MBDT 社区页面。你可以在此处发起话题,与创建 MBDT 工具箱的工程师直接交流。除了专注于电池管理系统、AUTOSAR 或电机控制应用的典型应用演示外,你还可以参加 NXP MBDT 培训和课程,如初学者指南系列。
你也可以访问 NXP.com,获取有关 NXP 所提供的开发生态系统的更多信息。
本文内容与 AN13902:《基于 S32K344 的三相无传感器 PMSM 电机控制套件(使用 MBDT 模块)》完全一致