【动手学电机驱动】STM32-FOC(3)STM32 三路互补 PWM 输出

时间:2024-11-07 11:40:52

STM32-FOC(1)STM32 电机控制的软件开发环境
STM32-FOC(2)STM32 导入和创建项目
STM32-FOC(3)STM32 三路互补 PWM 输出
STM32-FOC(4)IHM03 电机控制套件介绍
STM32-FOC(5)IHM03 套件无感FOC 控制

【动手学电机驱动】STM32-FOC(3)STM32 三路互补 PWM 输出

    • 1. 实验介绍
      • 1.1 STM32G4 的定时器
      • 1.2 脉冲宽度调整(Pulse Width Modulation, PWM)
    • 2. STM32G4 生成 PWM 信号输出
      • 2.1 创建新项目
      • 2.2 配置 TIM2 与引脚
      • 2.3 生成代码
      • 2.4 代码编辑、编译与调试
      • 2.5 修改频率和占空比
    • 3. STM32G4 生成互补 PWM 信号输出
      • 3.1 创建新项目
      • 3.2 配置 TIM1 互补输出
      • 3.3 生成代码
      • 3.4 代码编辑、编译与调试
    • 4. STM32G4 生成带死区的互补 PWM 信号输出
      • 4.1 创建新项目
      • 4.2 配置 TIM1 互补输出
      • 4.3 配置 GPIO
      • 4.4 生成代码
      • 4.5 代码编辑、编译与调试
    • 5. STM32G4 输出 3路互补PWM
      • 5.1 创建新项目
      • 5.2 配置 TIM1 互补输出
      • 5.3 生成代码
      • 5.4 代码编辑、编译与调试

本节内容:
PWM 输出实验既是学习使用 STM32G4,也是电机控制的基础。
本节使用 STM32CubeIDE 开发工具,创建、配置新项目,编写程序代码,编译与调试程序,包括以下实验内容:

  • PWM 输出实验;
  • 互补 PWM 输出实验;
  • 带死区的互补PWM 输出实验;
  • 三路带死区的互补PWM 输出实验。

1. 实验介绍

1.1 STM32G4 的定时器

定时器(Timer )的基本功能是定时 。 把定时器与 GPIO 结合起来,可以实现非常丰富的功能,如测量输入信号的脉冲宽度 、生成输出波形等 。

STM32G4系列共有10个定时器:

  • 2个基本定时器:TIM6,TIM7;
  • 3个全功能通用定时器:TIM2,TIM3,TIM4;
  • 3个通用定时器:TIM15,TIM16,TIM17,只有1个或者2个通道。
  • 2个高级控制定时器:TIM1,TIM8,可以同时产生 7路 PWM输出。

定时器要实现计数必须有时钟源。基本定时器时钟只能来自内部时钟,高级定时器和通用定时器还可以选择外部时钟源或者直接使用来自其他定时器的等待模式 。

对定时器进行编程时,常用的函数如下表所示。

函数名称 函数功能
HAL_TIM_Base_Init Initialize the TIM Time base Unit
HAL_TIM_Base_DeInit De-Initialize the TIM Base peripheral
HAL_TIM_Base_MspInit Initialize the TIM Base MSP
HAL_TIM_Base_MspDeInit De-Initialize the TIM Base MSP
HAL_TIM_Base_Start Starts the TIM Base generation
HAL_TIM_Base_Stop() Stops the TIM Base generation
HAL_TIM_Base_Start_IT Starts the TIM Base generation in interrupt mode
HAL_TIM_Base_Stop_IT() Stops the TIM Base generation in interrupt mode
HAL_TIM_Base_Start_DMA() Starts the TIM Base generation in DMA mode
HAL_TIM_Base_Stop_DMA() Stops the TIM Base generation in DMA mode

1.2 脉冲宽度调整(Pulse Width Modulation, PWM)

脉冲宽度调制(PWM)利用MCU 的数字输出来对模拟电路进行控制,采用一系列形状不同但面积相等的矩形脉冲代替正弦信号,具有与正弦波输入近似的输出响应。

一类 PWM 输出的应用是由 MOS、IGBT 等功率器件组成的 H 桥或三相桥 ,每路桥壁的上半桥和下半桥互补输出。为了防止上下半桥同时导通而导致器件烧毁,需要在半桥关断后延迟一段时间再打开互补半桥,这段延迟时间就是死区 。


2. STM32G4 生成 PWM 信号输出

实验内容:
(1)利用定时器在引脚上输出一定频率和占空比的 PWM 信号。
(2)用 PWM 信号驱动开发板的 LD2 指示灯以 1Hz 50% 占空比闪烁。

实验条件:
① 硬件平台:NUCLEO-G431RB 开发板
② 软件平台:STM32CubeMX, STM32CubeIDE

实现方法

本实验使用 TIM2 定时器,其使能配置如下:

  • Slave Mode: Disable
  • Trigger Source: Disable
  • Clock Source: Disable
  • Channel 1: PWM Generation CH1 CH1N
  • Channel 2: Disable
  • Channel 3: Disable
  • Channel 4: Disable
  • Channel 5: Disable
  • Channel 6: Disable
  • Combined Channels: Disable

2.1 创建新项目

  1. 打开 STM32CubeMX。

  2. 选择 New Project(或Ctrl-N快捷键)新建工程,进入 New Project 界面。

  • 选择MCU为 STM32G431RBT6(参考开发板的 MCU 型号选择)。

在这里插入图片描述

  1. 点击 “Start Project” 建立项目。

2.2 配置 TIM2 与引脚

  1. 例程项目安装完成后,自动转入 CubeMX 的 Pinout Configuration 视图。

在使用定时器时,要先使能(Enable)定时器,并设置定时器的频率。
(1)在左侧 Categories 中选择 Timers – TIM2,配置 TIM2 的 Channel -1为 “PWM Generation CH1”;
(2)在右侧 Pinout View 图中,按住 Ctrl+鼠标左键将 PA0 拖到到 PA5,完成将 TIM2_CH1 重新映射到 PA5 管脚(默认为 PA0)。

在这里插入图片描述

(3)点击 “Clock Configuration” 菜单按钮进入时钟频率设置界面,把 HCLK(MHz) 修改为 64,将 TIM2 的时钟频率设置为 64MHz。
在这里插入图片描述

(4)设置 1Hz,占空比为 50% 的 PWM。
PWM频率与占空比为:
f P W M = f T I M ( P S C + 1 ) ∗ ( A R R + 1 ) d u t y = P u l s e A R R f_{PWM} = \frac{f_{TIM}}{(PSC+1)*(ARR+1)}\\ duty = \frac{Pulse}{ARR} fPWM=(PSC+1)(ARR+1)fTIMduty=ARRPulse

点击 “Pinout&Configuration” 菜单按钮,在左侧 Categories 中选择 Timers – TIM2,在 Configuration 中选择 Parameter Settings,

  • 将 Prescaler(PSC)设为 1023;
  • Counter Period(ARR)设为 62499;
  • Pulse 设为 31250。
    则可以得到频率为1Hz,占空比为 50% 的 PWM。

将 “auto-reload preload” 设为 “enable”。

在这里插入图片描述


2.3 生成代码

  1. 点击 “Project Manager” 菜单按钮,进入工程配置界面。
  • 输入项目名称为 “MyPWM1”,选择项目的保存路径。
  • 将Toolchain / IDE 设为 STM32CubeIDE(根据用户安装和使用的 IDE 选择,也可以选择 EWARM、MDK-ARM、MakeFile、CMake 等IDE工具)
  • 点击右上角 “GENERATE CODE” 生成代码
  • 加载完毕后,弹出代码生成提示窗口,点击“ OPEN PROJECT”,进入 STM32CubeIDE。

在这里插入图片描述


2.4 代码编辑、编译与调试

  1. 代码生成后,(自动)进入 STM32CubeIDE,并打开创建的项目 MyPWM1。从 Scr 目录打开程序文件 main.c。

  2. 编写程序代码。

在 “USER CODE BEGIN 2” 与 "USER CODE END 2"之间,添加启动 PWM 输出的程序代码如下。

  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
  /* USER CODE END 2 */

在这里插入图片描述

将鼠标移动到 HAL_TIM_PWM_Start,按 F3 可以打开 HAL_TIM_PWM_Start() 的程序代码如下。该程序用于启动 PWM 信号发生器。(该步骤非必须,只是介绍查看的方法)

/**
  * @brief  Starts the PWM signal generation.
  * @param  htim TIM handle
  * @param  Channel TIM Channels to be enabled
  *          This parameter can be one of the following values:
  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
  *            @arg TIM_CHANNEL_5: TIM Channel 5 selected
  *            @arg TIM_CHANNEL_6: TIM Channel 6 selected
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
  1. 程序编译与调试
  • 用 USB连接线,连接 PC 与 NUCLEO-G431RB 开发板。
  • 点击工具栏中 “Build Debug” 按键对程序代码进行编译。
  • 点击工具栏中 “Debug” 按键,将程序下载烧录到目标板 NUCLEO-G431RB 。
  • 点击工具栏中 “Resume” 按键 或 F8 快捷键,运行程序。

实验结果如下:

  • NUCLEO-G431RB 开发板上的 LD2 指示灯以 1Hz 50% 占空比开始闪烁( 1 秒闪烁一次)。

在这里插入图片描述

  • 使用示波器观察输出信号如下:

请添加图片描述


2.5 修改频率和占空比

使用函数 __HAL_TIM_SetCompare 和 __HAL_TIM_PRESCALER 分别可以修改 Pulse 和预分频系数,就可以实现修改方波频率和占空比。

例如:

  • 将 Prescaler(PSC)设为 511,则频率为:

f P W M = f T I M ( P S C + 1 ) ∗ ( A R R + 1 ) = 64 M 512 ∗ 62500 = 2 f_{PWM} = \frac{f_{TIM}}{(PSC+1)*(ARR+1)} = \frac{64M}{512*62500} = 2 fPWM=(PSC+1)(ARR+1)fTIM=5126250064M=2

  • 将 Pulse 修改为 75,则输出信号的占空比为 75%。

则可以得到频率为1Hz,占空比为 50% 的 PWM。程序修改如下:

  /* USER CODE BEGIN 2 */
 
   /* USER CODE BEGIN WHILE */
  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);//开启PWM输出
  
  __HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, 75); // 将Pulse设置为75,这样输出的占空比为75%
  __HAL_TIM_PRESCALER(&htim2, 511); //将预分频系数修改为 512-1,则频率为 2Hz

  /* USER CODE END 2 */ 

在这里插入图片描述


3. STM32G4 生成互补 PWM 信号输出

实验内容:
(1)利用定时器在引脚上输出一定频率和占空比的 互补PWM 信号。

实验条件:
① 硬件平台:NUCLEO-G431RB 开发板
② 软件平台:STM32CubeMX, STM32CubeIDE

实现方法

本实验使用 TIM1 定时器,其使能配置如下:

  • Slave Mode: Disable
  • Trigger Source: Disable
  • Clock Source: Disable
  • Channel 1: PWM Generation CH1 CH1N
  • Channel 2: Disable
  • Channel 3: Disable
  • Channel 4: Disable
  • Channel 5: Disable
  • Channel 6: Disable
  • Combined Channels: Disable

3.1 创建新项目

  1. 打开 STM32CubeMX。

  2. 选择 New Project(或Ctrl-N快捷键)新建工程,进入 New Project 界面。

  3. 选择MCU为 STM32G431RBT6(参考开发板的 MCU 型号选择)。

  4. 点击 “Start Project” 建立项目。


3.2 配置 TIM1 互补输出

  1. 例程项目安装完成后,自动转入 CubeMX 的 Pinout Configuration 视图。

  2. 配置 TIM1 互补输出。

在使用定时器时,要先使能(Enable)定时器,并设置定时器的频率。
(1)在左侧 Categories 中选择 Timers – TIM1,配置 TIM1 的 Channel -1为 “PWM Generation CH1 CH1N”,即 PWM互补输出;
(2)在右侧 Pinout View 图中,按住 Ctrl+鼠标左键将 PA13 拖到 PA11,完成将 TIM1_CH1N 重新映射到 PA11 管脚(默认为 PA13)。

在这里插入图片描述

(3)点击 “Clock Configuration” 菜单按钮进入时钟频率设置界面,把 HCLK(MHz) 修改为 64,将 TIM2 的时钟频率设置为 64MHz。

在这里插入图片描述

(4)设置 1Hz,占空比为 25% 的 PWM。
PWM频率与占空比为:
f P W M = f T I M ( P S C + 1 ) ∗ ( A R R + 1 ) d u t y = P u l s e A R R f_{PWM} = \frac{f_{TIM}}{(PSC+1)*(ARR+1)}\\ duty = \frac{Pulse}{ARR} fPWM=(PSC+1)(ARR+1)fTIMduty=ARRPulse

点击 “Pinout&Configuration” 菜单按钮,在左侧 Categories 中选择 Timers – TIM1,在 Configuration 中选择 Parameter Settings:

  • 将 Prescaler(PSC)设为 1023;
  • Counter Period(ARR)设为 62499;
  • Pulse 设为 15625。

则可以得到频率为1Hz,占空比为 25% 的 PWM。

将 “auto-reload preload” 设为 “enable”。

在这里插入图片描述


3.3 生成代码

  1. 点击 “Project Manager” 菜单按钮,进入工程配置界面。
  • 输入项目名称为 “MyPWM3”,选择项目的保存路径。
  • 将Toolchain / IDE 设为 STM32CubeIDE(根据用户安装和使用的 IDE 选择,也可以选择 EWARM、MDK-ARM、MakeFile、CMake 等IDE工具)
  • 点击右上角 “GENERATE CODE” 生成代码
  • 加载完毕后,弹出代码生成提示窗口,点击“ OPEN PROJECT”,进入 STM32CubeIDE。

3.4 代码编辑、编译与调试

  1. 代码生成后,(自动)进入 STM32CubeIDE,并打开创建的项目 MyPWM3。从 Scr 目录打开程序文件 main.c。

  2. 编写程序代码。在用户代码区添加代码。

在 “USER CODE BEGIN 2” 与 "USER CODE END 2"之间,添加启动 PWM 输出的程序代码。
在 “USER CODE BEGIN WHILE” 与 "USER CODE END WHILE"之间,添加启动 PWM 输出的程序代码。

__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, 75); // 将Pulse设置为75,这样输出的占空比为75%

  /* USER CODE BEGIN 2 */
  HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1); // 启动 PWM 互补输出
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); //启动 PWM 输出
  /* USER CODE END 2 */

  /* Infinite loop */
  while (1)
  {
	/* USER CODE BEGIN WHILE */
	__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1, 50000); // 设置 PWM 通道1 占空比
    /* USER CODE END WHILE */

  }

在这里插入图片描述

  1. 程序编译与调试
  • 用 USB连接线,连接 PC 与 NUCLEO-G431RB 开发板。
  • 点击工具栏中 “Build Debug” 按键对程序代码进行编译。
  • 点击工具栏中 “Debug” 按键,将程序下载烧录到目标板 NUCLEO-G431RB 。
  • 点击工具栏中 “Resume” 按键 或 F8 快捷键,运行程序。

实验结果如下:

运行程序,使用示波器观察引脚 PA11 和 PC0 输出的波形如下图所示。请添加图片描述


4. STM32G4 生成带死区的互补 PWM 信号输出

实验内容:
(1)利用定时器在引脚上输出一定频率和占空比的带死区的互补PWM 信号。
注意:由于死区时间通常很小,因此要将输出频率修改为 10KHz,否则死区时间很难观测到。

实验条件:
① 硬件平台:NUCLEO-G431RB 开发板
② 软件平台:STM32CubeMX, STM32CubeIDE

实现方法

本实验使用 TIM1 定时器,使能配置与上节“STM32G4 生成互补 PWM 信号输出”相同。


4.1 创建新项目

  1. 打开 STM32CubeMX。

  2. 选择 New Project(或Ctrl-N快捷键)新建工程,进入 New Project 界面。

  3. 选择MCU为 STM32G431RBT6(参考开发板的 MCU 型号选择)。

  4. 点击 “Start Project” 建立项目。


4.2 配置 TIM1 互补输出

  1. 例程项目安装完成后,自动转入 CubeMX 的 Pinout Configuration 视图。

  2. 配置 TIM1 互补输出。

在使用定时器时,要先使能(Enable)定时器,并设置定时器的频率。
(1)在左侧 Categories 中选择 Timers – TIM1,配置 TIM1 的 Channel -1为 “PWM Generation CH1 CH1N”,即 PWM互补输出;
(2)在右侧 Pinout View 图中,按住 Ctrl+鼠标左键将 PA13 拖到 PA11,完成将 TIM1_CH1N 重新映射到 PA11 管脚(默认为 PA13)。
(3)点击 “Clock Configuration” 菜单按钮进入时钟频率设置界面,把 HCLK(MHz) 修改为 64,将 TIM2 的时钟频率设置为 64MHz。
(4)设置 10kHz,占空比为 50% 的 PWM。
点击 “Pinout&Configuration” 菜单按钮,在左侧 Categories 中选择 Timers – TIM1,在 Configuration 中选择 Parameter Settings,将 Prescaler(PSC)设为 0,Counter Period(ARR)设为 6249,Pulse 设为 3125。则可以得到频率为10KHz,占空比为 50% 的 PWM。
将 “auto-reload preload” 设为 “enable”。


4.3 配置 GPIO

  1. 设置死区时间。
    在左侧 Categories 中选择 Timers – TIM1,在 Configuration 中选择 Parameter Settings,在 “Break And Dead Time management - Output Configuration” 选项中:
  • 将 “Automatic Output State” 设置为 “Enable”;
  • 将 “DeadTime Preload” 设置为 “Enable”
  • 将 “Dead Time” 设置为 “100”(指计数周期)。
    如下图所示。

在这里插入图片描述

  1. 在左侧 Categories 中选择 GPIO,设置 GPIO mode 为 “Alternate Function Push Pull”,PA11 、PC0 行末的Modified 列的选框会自动勾选。

在这里插入图片描述


4.4 生成代码

  1. 点击 “Project Manager” 菜单按钮,进入工程配置界面。
  • 输入项目名称为 “MyPWM4”,选择项目的保存路径。
  • 将Toolchain / IDE 设为 STM32CubeIDE(根据用户安装和使用的 IDE 选择,也可以选择 EWARM、MDK-ARM、MakeFile、CMake 等IDE工具)
  • 点击右上角 “GENERATE CODE” 生成代码;
  • 加载完毕后,弹出代码生成提示窗口,点击“ OPEN PROJECT”,进入 STM32CubeIDE。

4.5 代码编辑、编译与调试

  1. 代码生成后,(自动)进入 STM32CubeIDE,并打开创建的项目 MyPWM4。从 Scr 目录打开程序文件 main.c。

  2. 编写程序代码。在用户代码区添加代码。

在 “USER CODE BEGIN 2” 与 "USER CODE END 2"之间,添加启动 PWM 输出的程序代码。

  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); //启动 PWM 输出
  HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1); // 启动 PWM 互补输出
  __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1, 3125); // 设置 PWM 通道1 占空比

  /* USER CODE END 2 */

  /* Infinite loop */
  while (1)
  {
  }
  1. 程序编译与调试
  • 用 USB连接线,连接 PC 与 NUCLEO-G431RB 开发板。
  • 点击工具栏中 “Build Debug” 按键对程序代码进行编译。
  • 点击工具栏中 “Debug” 按键,将程序下载烧录到目标板 NUCLEO-G431RB 。
  • 点击工具栏中 “Resume” 按键 或 F8 快捷键,运行程序。

实验结果如下:

运行程序,使用示波器观察引脚 PA11 和 PC0 输出的波形如下图所示。

请添加图片描述


5. STM32G4 输出 3路互补PWM

实验内容:
(1)利用定时器在引脚上输出 3对 10KHKH频率和 50%占空比的带死区的互补PWM 信号。

实验条件:
① 硬件平台:NUCLEO-G431RB 开发板
② 软件平台:STM32CubeMX, STM32CubeIDE

实现方法
本实验使用 TIM1 定时器,使能配置与上节“STM32G4 生成互补 PWM 信号输出”相同。


5.1 创建新项目

  1. 打开 STM32CubeMX。

  2. 选择 New Project(或Ctrl-N快捷键)新建工程,进入 New Project 界面。

  3. 选择MCU为 STM32G431RBT6(参考开发板的 MCU 型号选择)。

  4. 点击 “Start Project” 建立项目。


5.2 配置 TIM1 互补输出

  1. 例程项目安装完成后,自动转入 CubeMX 的 Pinout Configuration 视图。

  2. 配置 TIM1 输出管脚。

在右侧 Pinout View 图中,

  • 将 TIM1_CH1 重新映射到 PA8 管脚
  • 将 TIM1_CH2 重新映射到 PA9 管脚
  • 将 TIM1_CH3 重新映射到 PA10 管脚
  • 将 TIM1_CH1N 重新映射到 PB13 管脚
  • 将 TIM1_CH2N 重新映射到 PB14 管脚
  • 将 TIM1_CH3N 重新映射到 PB15 管脚

在这里插入图片描述

  1. 配置 TIM1 互补输出。

在使用定时器时,要先使能(Enable)定时器,并设置定时器的频率。

在左侧 Categories 中选择 Timers – TIM1,在 “TIM1 Mode and Configuration – Mode” 配置 TIM1 如下:

  • 设置内部时钟源:“Clock Source” 设置为 “Internal Clock”
  • 配置 TIM1 的 Channel-1 为 PWM互补输出:“PWM Generation CH1 CH1N”
  • 配置 TIM1 的 Channel-2 为 PWM互补输出:“PWM Generation CH2 CH2N”
  • 配置 TIM1 的 Channel-3 为 PWM互补输出:“PWM Generation CH3 CH3N”

  1. 配置时钟频率。

系统时钟频率为 168MHz,将计数周期 Counter Period 设为 16800/2(除2是因为三角波分为上升和下降两段),则 PWM 频率为 168MHz/16800 = 10KHz。

(1)设置系统时钟频率为 168MHz:
点击 “Clock Configuration” 菜单按钮进入时钟频率设置界面,把 HCLK(MHz) 修改为 168,将 TIM1 的时钟频率设置为 168MHz。

(2)在左侧 Categories 中选择 Timers – TIM1,在 “TIM1 Mode and Configuration – Configuration – Parameter Settings” 配置如下:

  • 预分频 Prescaler(PSC)设为 0,不分频;
  • 计数器模式 Counter Mode 选择中心对齐的三角波:Center Aligned model 1 ;
  • 计数周期 Counter Period 设为 PWM 频率:16800/2;
  • 允许重新加载:auto-reload preload 设为 enable;
  • 更新时触发一个事件:Trigger Event Selection TRGO 设为 Update Event;

在这里插入图片描述


  1. 配置 PWM 通道:
    在 “TIM1 Mode and Configuration – Configuration – Parameter Settings – PWM Generation Channel 1 and 1N”,对 Channel 1 and 1N 配置如下:
  • 比较输出极性设置:Mode 设为 PWM mode 2;
  • 脉冲数设置: Pulse 设为 4200,作为决定占空比的比较值;
  • 有效电平设置:CH Polarity 设为 High;
  • 有效电平设置:CHN Polarity 设为 High;
  • 默认电平设置:CH Idle State 设为 Reset;
  • 默认电平设置:CHN Idle State 设为 Reset。

Channel 2 and 2N,Channel 3 and 3N 的配置相同。
在这里插入图片描述


  1. 配置死区时间。

在左侧 Categories 中选择 Timers – TIM1,在 “TIM1 Mode and Configuration – Configuration – Parameter Settings – Break and Dead Time management - Output Configuration” 配置如下:

  • Automatic Output State 设为 Enable;
  • Off State Selection for Run Mode 设为 Enable;
  • Off State Selection for Idle Mode 设为 Enable;
  • Lock Configuration 设为 Lock Level -1;
  • DeadTime Preload 设为 Disable;
  • Dead Time 设为 100;

在这里插入图片描述


5.3 生成代码

  1. 点击 “Project Manager” 菜单按钮,进入工程配置界面。
  • 输入项目名称为 “MyPWM5”,选择项目的保存路径。
  • 将Toolchain / IDE 设为 STM32CubeIDE(根据用户安装和使用的 IDE 选择,也可以选择 EWARM、MDK-ARM、MakeFile、CMake 等IDE工具)
  • 点击右上角 “GENERATE CODE” 生成代码;
  • 加载完毕后,弹出代码生成提示窗口,点击“ OPEN PROJECT”,进入 STM32CubeIDE。

5.4 代码编辑、编译与调试

  1. 代码生成后,(自动)进入 STM32CubeIDE,并打开创建的项目 MyPWM5。从 Scr 目录打开程序文件 main.c。

  2. 编写程序代码。在用户代码区添加代码。

在 “USER CODE BEGIN 2” 与 "USER CODE END 2"之间,添加启动 PWM 输出的程序代码。

  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1); //启动 PWM 输出
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_2);
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_3);

  HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1); // 启动 PWM 互补输出
  HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_2);
  HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_3);
  
  __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1, 4200); // 设置 PWM 通道1 占空比 50%
  __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2, 4200); 
  __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_3, 4200); 
    
  /* USER CODE END 2 */

  /* Infinite loop */
  while (1)
  {
  }

在这里插入图片描述

  1. 程序编译与调试
  • 用 USB连接线,连接 PC 与 NUCLEO-G431RB 开发板。
  • 点击工具栏中 “Build Debug” 按键对程序代码进行编译。
  • 点击工具栏中 “Debug” 按键,将程序下载烧录到目标板 NUCLEO-G431RB 。
  • 点击工具栏中 “Resume” 按键 或 F8 快捷键,运行程序。

实验结果如下:

运行程序,使用示波器观察输出的波形如下图所示。

  • 通道1 的 PWM互补输出波形:CH1 与 CH1N

请添加图片描述

  • 通道1、2、3 的 PWM 输出波形:CH1、CH2 与 CH3

请添加图片描述


从下节起,我们开始介绍 IHM03 电机控制套件 及其应用。