可以简单分为六个功能区域:
1、全局变量
全局变量的定义是建模过程中遇到的第一个难点,因为它涉及到我们软件开发中最基础的东西——数据类型定义(Data Types Definition)。
在 Simulink 中可以通过 Bus Editor 构建自定义数据类型。
每次运行模型、生成代码之前都需要将创建好的数据类型加载到MATLAB 的工作空间中,不然会提示报错。
2、初始化模块
初始化任务执行的是对 MCU 外设的初始化配置,比如 Pin 脚、ADC、PDB、SPI、FTM、PIT、中断等。还包括外围 IC 的初始化,如本项目中的 GD3000 预驱芯片的初始化是通过TPP 模块实现的。
SPI
TPP
预驱芯片的初始化,
PDB
延时模块
ADC
ADC触发内部通道
ADC参数配置
FreeMASTER
FreeMASTER进行实时观测时,选择的串口还有波特率等参数
3、用户接口
两个按键(通过 GPI 边沿检测)和一个周期性的中断(通过 PIT实现,处理板上旋钮),这些接口都是通过中断服务程序(ISR)执行相应的任务。
4、状态机任务
完整的状态机在 FTM 的 ISR 中被调用执行,状态机有两个输入:“MotorOnOff”“FaultSetClear”,分别实现启停电机和处理失效情况。状态机简而言之就是实现在不同的状态下调用不同的函数/功能。
新增了两个并行状态:ReadADC 和 UpdateFTM。新增的两个状态,分别负责读取 ADC 采样数据(Input)和 PWM 输出(Output),而原本的状态机是算法部分,位于 Input和 Output 之间,它是作用是根据采集输入数据,及时地计算得到输出的控制信号。
电机控制框架模型中,状态机分为了三个阶段:
1) ReadADC:读取 ADC 采样数据,数据反馈;
2) StateMachine:状态切换、数据处理、控制算法等;
3) UpdateFTM:更新 PWM 占空比,控制算法的执行。
ReadADC
UpdateFTM
StateMachine
5、Hall任务
即采集 Hall 位置信号,还是靠的中断ISR实现。
6、系统任务
系统任务设置了三个部分:
1) LED 点灯;
2) 软件计数,以及将板上的按键信息传递到状态机输入变量中;
3) 自定义初始化,可以在生成的代码中插入自己需要的初始化功能。
7、任务过程
上图中,各个任务的中断优先级由下往上逐次增加。系统任务和状态机任务是周期性触发的,频率分别为 1 kHz 和 20 kHz。用户按键任务和 Hall 任务是随机触发的,只有按下按键或 Hall 信号发生了变化才会进入到相应的任务中。