您现在的位置是:首页 >技术交流 >第四期 STM32F407IGT6电机开发板Simulink自动生成代码MBD教程:三路PWM输出网站首页技术交流
第四期 STM32F407IGT6电机开发板Simulink自动生成代码MBD教程:三路PWM输出
第四期 STM32F407IGT6电机开发板Simulink自动生成代码MBD教程
三路PWM输出
本期为TIM1高级定时器三路PWM输出,为后续电机的驱动打下基础。
1.CubeMX配置芯片底层驱动
1.在STM32CubeMX中新建一个名为LED的工程,芯片选择STM32F407IGT6,配置LED对应的GPIO管脚PE0和PE1为推挽输出模式;
2.配置按键输入对应的GPIO管脚PE2和PE3和PE4为输入模式,由于按键没有外部上拉,使能芯片内部上拉。
3.配置串口USART1为异步模式,选择板子上的PB6和PB7作为TX和RX,波特率为115200
3.板载8M高精度高速时钟,此处使能外部高速时钟HSE输入,并配置时钟树:
4.配置Debug模式和时间基准源,这里选择TimebaseSource为系统定时器之外的定时器TIM2这是由于系统定时器被用于Simulink的时间基准
5.需要一个高级定时器产生三路PWM波,选择TIM1的前三个通道,由于TIM1挂在APB2总线上,定时器 base频率为168M,为了产生10KHZ的PWM,设置预分频寄存器PSC为(2-1),自动重装寄存器ARR为(4200-1),计数模式为中央对齐,则PWM频率 = 168M/(PSC+1)/(ARR+1) /2= 10k,CH Polarity设置为High ,这样可以使得比较寄存器的值越大,PWM占空比越大。该板子的TIM1前三个通道引脚分别为PA8 PA9 和PA10;
点击 “Pinout&Configuration” 菜单按钮,在左侧 Categories 中选择 Timers – TIM1,在 Configuration 中选择 Parameter Settings,
在 “Counter Settings” 下,设置 Prescaler(PSC)为 (2-1);
设置 Counter Mode 为 Up;
设置 Counter Period(ARR)为 4200-1;
在 “PWM Generation Channel 1” 下,设置 Pulse 为 5000。
则可以得到频率为10KHz的PWM;
6.在 Project Manager 视图进行工程配置,如下图所示。
(1)在 Project 中勾选 “Do not generate the main()”,在生成代码时不生成 main.c 文件中的 main() 函数。
(2)在 Project 中取消选中 “Generate Under Root”。
6.在 Code Generator 中,勾选 “Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral”,让每个外设生成独立的’.c/.h’文件。
7.在 Advanced Settings 中,将 “Driver Selector” 全部设置为 “LL”(默认为 “HAL”),为外设选择低级 (LL) 驱动–非常重要!否则编译会报错。将 “Generated Function Calls” 的 “Visibility(Static)” 勾选项全部取消,对所有外设初始化函数调用取消选择可见性(静态)。
8.完成以上配置后,使用快捷键 “CTL+S” 或点击 File–Save Project,保存 CubeMX 项目文件。
注意:在 STM32CubeMX 中配置完成后,不要点击 “GENERATE CODE” 生成代码,而是保存 .ioc 项目文件。
2.Simulink的MBD模型建立
2.1模型配置
-
运行 MATLAB 软件,将当前路径切换到 CubeMX 项目 .ioc 的保存路径。
-
打开 Simulink,点击 “空白模型” 创建新的 Simulink 模型,注意仿真模型 .slx 与 CubeMX 项目 .ioc 要保存在相同的路径下。
-
打开模型设置,配置求解器参数:定步长+离散+固定步长10KHz
4.在硬件实现中选择Hardware board为 STM32F4xx Based,选择操作系统为裸机,并选择刚刚写好的ioc文件,simulink会从ioc文件中自动识别Device id和Device family。
2.2MBD模型建模
LED闪烁配置为1S闪烁一次(参考第一期);
PWM输出配置:
在仿真模型中添加 “PWM out” 模块并进行配置 。
(1)在仿真模型中添加 “PWM out” 模块参数。
点击菜单栏的 “库浏览器” 打开库浏览器,展开 “Embedded Coder Support Package for STMicroelectronics STM32 Processors – STM32G4xx Based Boards”。选择 “PWM out” 模块,将其拖动到右侧的模型。
(2)设置 “PWM out” 模块参数。如图所示,按照 CubeMX 项目中的 GPIO 管脚配置。
1)将 Timer module 设为 “TIM1”,
2)将 “Duty Cycle unit” 设为 “Percentage”,
3)勾选 “Enable channel 1 2 3” 以使能 Ch1 Ch2 CH3;输出占空比分别为25% 50% 75%的10KPWM波;
2.2烧录下载验证
点击HARDWARE选项卡中的编译,等待编译完成生成固件。
编译过程已成功完成
编译摘要
编译的顶层模型目标:
模型 操作 重新编译原因
================================
代码已生成并完成编译。 代码生成信息文件不存在。
编译了 1 个模型,共 1 个模型(0 个模型已经是最新的)
编译持续时间: 0h 0m 44.677s
将文件夹中生成的HEX固件烧录到电机开发板中:
板子上电后LED0和LED1闪烁,使用示波器测量PA8 PA9 PA10的波形,此处以PA8为例,可以看到周期为10K占空比为50%的PWM波;
三路互补PWM输出:
只需复制PWM.ioc为PWM_HB.ioc,在CubeMX配置TIM1为互补输出,并且使能对应GPIO PB13 14 15即可
模型不用改动,只需复制一个PWM_HB并配置PWM_HB.ioc,
编译烧录查看效果;