1099767_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

1099767_zh-CN

1099767_zh-CN

基于模型的 S32K144 电机控制设计方法 - 第一部分<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

简介

该应用程序基于 S32K144(gpio_s32k14_mbd_rtw)的基本 GPIO 示例。该应用程序经过扩展,可以满足运行无传感器 PMSM 磁场定向控制算法的电机控制应用的需求。因此,实现了某些模式(状态)和转换(事件)。

注意:有限状态机理论定义了状态和事件(转换)。以下设计使用的方法在某些时候似乎混合了状态和转换。有些状态仅运行一次,因此它们可能仅被视为转换。然而,该设计被视为一个示例,并且可以在对外部事件的额外检查方面进行扩展,从而使这些“一次性”状态成为实际状态。该设计因恩智浦汽车电机控制开发套件而广为人知,并得到了大多数客户的认可。因此,MATLAB Simulink 也提出了相同的概念。

有限状态机设计

应用程序结构应该引入一个系统工具来处理电机控制的所有任务以及发生故障时的硬件保护。因此,设计了一个有限状态机来使用 MATLAB Simulink Stateflow Chart(Stateflow 库/图表)来控制应用程序状态。

电机控制应用至少需要两种状态——“就绪”状态表示的“停止”和“运行”状态表示的“运行”。然而,需要实施一些额外的状态来覆盖例如上电情况,程序等待各种辅助系统(系统基础芯片、直流母线充满电、内存检查等)。此外,电机控制应用,特别是无传感器磁场定向控制需要额外的状态来校准传感器并启动具有已知位置的电机。因此,从 READY 状态到 RUN 状态的转换是通过 CALIB(传感器校准)和 ALIGN(初始转子位置对准或检测)状态的初始化序列完成的。要停止电机,应用程序通过 INIT(状态变量初始化)返回到 READY 状态。

INIT 状态旨在清除所有内部累加器和其他变量(但参数可以在运行时更改,并且不会重置为默认设置),而 RESET 状态则用于在使用 FreeMASTER 或其他用户界面更改电机控制参数的情况下启用上电或“默认配置”或“软复位”初始化。

所有状态都与状态机图表块中追踪的输出事件相链接。这些事件可用作调用处理程序(状态函数)的触发点。转换由状态机的输入值驱动,通过简单的比较将其视为事件(例如[u==e_start])。要改变状态,就应该改变事件/输入值。如果事件发生了变化,则状态机仅在存在与当前状态和事件相关联的现有动作的情况下才改变状态。

FiniteStateMachine.png

状态机设计用于应用程序中,使用事件输入(发出事件信号)、状态输出(指示当前状态)和事件触发器输出(调用状态函数/处理程序)。已构建以下应用程序来展示状态机使用的示例。

FiniteStateMachineUsage.png

下表显示了状态和事件的命名:

状态目的Value
重置开机/默认设置/软复位状态。可能包括一些硬件检查序列或故障检测。1
Init控制状态变量(积分器、斜坡、累加器、变量等)的初始化。可能包括故障检测2
一切就绪待机状态,准备开启。包括故障检测,例如直流母线过压或高温3
CALIB校准状态用于校准 ADC 通道(消除偏移)。包括故障检测4
Align对准状态,找到转子位置并准备启动。包括故障检测5
运行电机以开环或无传感器模式运行。包括故障检测6
故障故障状态关闭电源转换器和所有外围设备,进入安全状态。7

输入事件是引发当前状态改变的触发器。

输入事件目的Value
e_init_done当 Init 状态成功完成任务时断言1
e_start当用户发送开启命令时断言2
e_calib_done当所有必需的 ADC 通道都校准后置位3
e_align_done当初始转子对准/位置检测完成时断言4
紧急停止当用户发送关闭命令时断言5
e_fault发生故障情况时断言6
错误清除当用户发送“清除故障”命令或情况允许时,7
e_reset当用户发送“重置”命令以使用默认设置重新开始时,断言8

输出事件用于触发电机控制状态处理程序并与实际状态相对应。每次状态机调用都会触发这些事件。因此,状态机应该与控制算法保持一致。例如,它应放置在 ADC“转换完成”中断程序或 PWM 重新加载中断程序内。

有限状态机的使用

状态机应与控制算法很好地配合使用。控制电机的常用方法是将周期性中断与 ADC 转换完成或 PWM 重新加载事件(中断)联系起来。在收集所有外部信息(电压、电流、二进制输入等)之后,应在此事件处理程序中调用状态机,以让状态机决定下一步应调用哪个状态。

状态机内部的内部事件/状态处理由状态机块定义清楚地描述。输出事件触发器配置为向状态机提供清晰的基于功能的代码接口。这意味着,输出事件应连接到用于处理状态任务的函数。例如,在运行状态下,每次状态机调用都会触发 run() 输出事件,而在运行状态函数中则会调用整个电机控制算法。如果要通过输入信息来切换状态,则需要编写一个简单的条件来改变事件变量(定义为全局变量)。例如,如果用户发送“停止”命令,则事件设置为“e_stop”,状态机将切换到初始状态。

为了更复杂地触发输出功能,可以在状态机定义中编程额外的输出事件。

模板状态处理程序函数基于函数调用者块。一般来说,功能块可以与全局变量一起工作,因此不需要输入或输出。由于全局事件变量,事件驱动状态机可以对状态处理程序函数内部或状态机外部抛出的事件做出反应(例如基于其他异步中断)。下面显示了一个简单模板的示例。

ResetState.png

ResetStateDetail.png

在这个例子中,该函数代表重置状态,它应该在上电重置后运行,或者将所有变量设置为其默认设置。因此,第一部分专门介绍与硬件相关的设置,第二部分介绍与应用程序相关的设置。第三部分检查所有任务是否完成。如果是,则抛出 e_reset_done 事件(存储到 Event 变量中)。在这种情况下,ResetStatus 变量显然总是从零变为二,而不受其他影响。因此,最终条件可能会被删除(甚至通过编译期间的 MATLAB 优化过程)。如果存在外部条件,例如等待设置外部引脚,那么使用这样的“状态”变量作为完成状态任务的绿灯并抛出“完成”事件是有意义的。

嵌入式C代码实现

在默认设置中,MATLAB Embedded Coder 以 switch-case 结构的方式生成状态机代码。这对于进一步的代码调试或手动编辑可能不是很有用。因此,函数调用子系统块参数应按如下所示进行更改。函数打包选项设置为“不可重复使用函数”,其他设置可以保留默认值。这将使状态机代码结构保持在 switch-case 中,但是状态处理程序函数调用将生成为静态函数(而不是将代码放在 switch-case 中)。

StateFunctionBlockParameters.PNG

以下代码示例是 stateMachineTest.c 中生成的状态机代码的一部分示例代码。状态机根据 State 变量进行决策,该变量内部存储在 stateMachineTest_DW.is_c1_stateMachineTest 中。根据 stateMachineTest_DW.Event,启动转换。最后,调用状态处理函数,在本例中为 stateMachineTest_Resetstate()。

void stateMachineTest_step(void)
{
/* ...  */
      switch (stateMachineTest_DW.is_c1_stateMachineTest) {
/* ... */
      case stateMachineTest_IN_Reset:
            rtb_y = 1U;

            /* During 'Reset': ':35' */
            if (stateMachineTest_DW.Event == stateMachineTest_e_reset_done) {
              /* Transition: ':37' */
              stateMachineTest_DW.is_c1_stateMachineTest = stateMachineTest_IN_Init;

              /* Entry 'Init': ':1' */
              rtb_y = 2U;
            } else if (stateMachineTest_DW.Event == stateMachineTest_e_fault) {
              /* Transition: ':46' */
              stateMachineTest_DW.is_c1_stateMachineTest = stateMachineTest_IN_Fault;

              /* Entry 'Fault': ':18' */
              rtb_y = 7U;
            } else {
              /* Outputs for Function Call SubSystem: '/Reset state' */

              /* Event: ':49' */
              stateMachineTest_Resetstate();

              /* End of Outputs for SubSystem: '/Reset state' */
            }
            break;
/* ... */
      }‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍
/* ... */
}‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

重置状态函数是根据 Simulink 模型中每个块中设置的优先级进行编译的。如果没有设置优先级,则默认优先级基于将它们添加到模型的顺序。因此,按照逻辑顺序的要求验证并最终改变优先级非常重要。此设置可以在块属性中更改,如下所示。模型更新(Ctrl+D)后,优先级设置显示为每个块右上角的数字。

PrioritySettings.PNG

状态机测试应用程序

测试应用程序旨在测试状态机的所有功能,针对 S32K144EVB。为了指示活动状态,RGB LED 二极管与闪烁频率结合使用。板载按钮 SW2 和 SW3 用于控制应用程序。该应用程序在 10 毫秒中断例程中运行(由采样时间给出)。有一个独立的 LPIT 中断控制 LED 闪烁。

上电复位后,设备被配置并进入复位状态,在此执行额外的硬件和应用程序设置。然后,应用程序进入 INIT 状态,模拟延迟约 2 秒,由蓝色 LED 二极管快速闪烁表示。延迟后,自动进入READY状态。

两个按钮均由另一个状态机处理,该状态机可检测短按和长按按钮。虽然短按没有直接指示,但长按由打开的红色 LED 二极管指示。

短按SW2,应用程序启动,首先进入CALIB状态,然后进入ALIGN状态,最后进入RUN状态。CALIB 和 ALIGN 状态由蓝色 LED 的较高频率闪烁指示,而 RUN 状态由绿色 LED 亮起指示。

该应用程序引入了速度命令的模拟,可以通过长按 SW2(向上)或 SW3(向下)在 0 到 10,000 的范围内进行更改。此外,为了模拟故障情况,一旦速度命令达到 5,000 的值,就会抛出 e_fault 事件。进入故障状态,红色 LED 闪烁表示进入故障状态。要清除故障,应同时按下 SW2 和 SW3。进入 INIT 状态,蓝色 LED 二极管快速闪烁表示进入 INIT 状态。

下表显示了功能和 LED 指示。

按钮Press lenght功能
SW2短按启动应用程序
SW2long press增加速度命令(红色LED二极管亮起指示)
SW3短按停止应用程序
SW3long press降低速度命令(红色LED二极管亮起指示)
SW2 + SW3短按清除故障

状态LED闪烁
重置-
Init蓝色第 50 期
一切就绪蓝色第 500 期
CALIB蓝色第250期
Align蓝色周期 100
运行绿色始终开启
故障周期 100
any当检测到长按 SW2 或 SW3 时始终亮起

运行示例

该示例可以与 S32K14x、v3.0.0 的基于模型的设计工具箱一起构建和运行。此版本是使用 MATLAB R2017a 创建的。在运行此示例之前,请遵循 NXP 社区页面上的说明和课程。建议使用未连接扩展板的 S32K144EVB,但此示例不使用任何硬件接口,但以下情况除外(请参阅 S32K144EVB 文档):

S32K144引脚S32K144EVB连接器用法
PTD15J2.2GPIO 输出/强度:高/红色 LED
PTD0J2.6GPIO 输出/强度:高/蓝色 LED
PTD16J2.4GPIO 输出/强度:高/绿色 LED
PTC12J2.10GPIO 输入/按钮 SW2
PTC13J2.12GPIO 输入/按钮 SW3
PTC6J4.4UART1/RxD/FreeMASTER
PTC7J4.2UART1/TxD/FreeMASTER

该应用程序还可与 FreeMASTER 应用程序配合使用。用户可以连接到目标并观看或控制应用程序。FreeMASTER 项目也已附加,但是,在构建和运行应用程序后,需要在 FreeMASTER 项目设置中更新 ELF 文件位置。

FreeMASTEROptions.PNG

FreeMASTER.PNG

示例模型
Tags (1)
No ratings
Version history
Last update:
‎01-05-2026 09:59 AM
Updated by: