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

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_InitInitialize the TIM Time base Unit
HAL_TIM_Base_DeInitDe-Initialize the TIM Base peripheral
HAL_TIM_Base_MspInitInitialize the TIM Base MSP
HAL_TIM_Base_MspDeInitDe-Initialize the TIM Base MSP
HAL_TIM_Base_StartStarts the TIM Base generation
HAL_TIM_Base_Stop()Stops the TIM Base generation
HAL_TIM_Base_Start_ITStarts 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 电机控制套件 及其应用。


参考资料:

  1. P-NUCLEO-IHM03 STM32电机控制套件
  2. UM2505 - STM32G4 Nucleo-64 boards (MB1367), STMicroelectronics/意法半导体, 2021
  3. UM2538 - STM32 motor-control pack using the FOC algorithm for three-phase, low-voltage, and low‑current motor evaluationl, STMicroelectronics/意法半导体, 2023
  4. 许少伦等,STM32G4入门与电机控制实战,电子工业出版社,2023

版权声明:
youcans@qq 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/143476266)
Copyright@youcans 2024
Crated:2024-11

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/60228.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark中的shuffle

Shuffle的本质基于磁盘划分来解决分布式大数据量的全局分组、全局排序、重新分区【增大】的问题。 1、Spark的Shuffle设计 Spark Shuffle过程也叫作宽依赖过程,Spark不完全依赖于内存计算,面临以上问题时,也需要Shuffle过程。 2、Spark中哪…

ffmpeg 视频滤镜:屏蔽边框杂色- fillborders

滤镜描述 fillborders 官网链接 > FFmpeg Filters Documentation fillborders滤镜有几种方式帮你屏蔽边框的杂色、不好的图案。 滤镜使用 参数 left <int> ..FV.....T. set the left fill border (from 0 to INT_MAX) (default 0)right …

「C/C++」C++标准库 之 #include<iostream> 标准输入输出

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

智能合约在供应链金融中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 智能合约在供应链金融中的应用 智能合约在供应链金融中的应用 智能合约在供应链金融中的应用 引言 智能合约概述 定义与原理 发展…

设计模式之责任链模式(Chain Of Responsibility)

一、责任链模式介绍 1、责任链模式介绍 职责链模式(chain of responsibility pattern) 定义: 避免将一个请求的发送者与接收者耦合在 一起&#xff0c;让多个对象都有机会处理请求。将接收请求的对象连接成一条链&#xff0c;并且沿着这条链 传递请求&#xff0c;直到有一个对…

C语言中的 printf( ) 与 scanf( )

时隔多日&#xff0c;小编我又回来咯小编相信之前的博客能够给大家带来不少的收获。在我们之前的文章中&#xff0c;许多代码块的例子都用到了printf( ) 与 scanf( )这两个函数&#xff0c;大家都知道他们需要声明头文件之后才能使用&#xff0c;那这两个函数是什么呢&#xff…

数字乡村解决方案-1

1. 政策背景与新时代党建 党的十九大报告提出新时代党建总要求&#xff0c;强调乡村治理在国家治理体系中的重要性&#xff0c;并作为实现乡村振兴战略的基石。提出按照产业兴旺、生态宜居、乡风文明、治理有效、生活富裕的总要求&#xff0c;推进乡村治理体系和治理能力现代化…

栈和队列相关题 , 用队列实现栈, 用栈实现队列 ,设计循环队列 C/C++双版本

文章目录 1.用队列实现栈2.用栈实现队列3. 设计循环队列 1.用队列实现栈 225. 用队列实现栈 思路&#xff1a; 使用两个队列&#xff0c;始终保持一个队列为空。 当我们需要进行压栈操作时&#xff0c;将数据压入不为空的队列中&#xff08;若两个都为空&#xff0c;则随便压…

零基础入门进程间通信:task 1(匿名管道与vscode使用)

目录 引言 VSCODE使用 进程间通信正题 基础背景 进程间通信分类 匿名管道 理解匿名管道 代码实现 匿名管道的特性 管道的四种情况 应用场景 引言 在当今的计算机技术领域&#xff0c;操作系统作为计算机系统的核心组件&#xff0c;承担着资源管理、任务调度和进程管…

#渗透测试#SRC漏洞挖掘#Python自动化脚本的编写04之通过面向对象编程学生管理信息系统01

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

【销帮帮-注册_登录安全分析报告-试用页面存在安全隐患】

联通支付注册/登录安全分析报告 前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨…

微信小程序——01开发前的准备和开发工具

文章目录 一、开发前的准备1注册小程序账号2安装开发者工具 一、开发前的准备 开发前需要进行以下准备&#xff1a; 1 注册小程序账号2激活邮箱3 信息登记4 登录小程序管理后台5完善小程序信息6绑定开发者 1注册小程序账号 第1步&#xff1a;首先打开“微信公众平台” https:…

文心一言 VS 讯飞星火 VS chatgpt (388)-- 算法导论24.5 8题

八、设 G ( V , E ) G(V,E) G(V,E) 为一个带权重的有向图&#xff0c;且包含一个可以从源结点 s s s 到达的权重为负值的环路。请说明如何构造一个 G G G 的边的松弛操作的无限序列&#xff0c;使得每一步松弛操作都能对某一个最短路径估计值进行更新。如果要写代码&#x…

鸿蒙UI开发——自定义UI绘制帧率

1、概 述 随着设备屏幕的不断演进&#xff0c;当前主流设备采用LTPO屏幕&#xff08;可变刷新率屏幕&#xff09;&#xff0c;此类屏幕支持在多个档位之间切换屏幕帧率。 对于快速变化的内容&#xff0c;如射击游戏&#xff0c;交互动画等&#xff0c;显示帧率越高&#xff0…

计算机毕业设计 | SpringBoot慈善公益平台 爱心互助活动发布管理系统(附源码)

1&#xff0c;项目介绍 爱慈善公益平台&#xff08;love-charity&#xff09;是一个基于 SpringBoot 开发的标准 Java Web 项目。整体页面非常的简约大气&#xff0c;项目的完整度较高&#xff0c;是一个偏向公益论坛的系统。非常适合刚刚接触学习 SpringBoot 的技术小白学习&…

在 AMD GPU 上使用 AI2 的 OLMo 模型进行推理

Inferencing with AI2’s OLMo model on AMD GPU — ROCm Blogs 2024 年 4 月 17 日&#xff0c;作者&#xff1a;Douglas Jia. 在这篇博客中&#xff0c;我们将向您展示如何在 AMD GPU 上使用 AI2 的 OLMo 模型生成文本。 简介 由艾伦人工智能研究所&#xff08;Allen Instit…

工作流初始错误 泛微提交流程提示_泛微协同办公平台E-cology8.0版本后台维护手册(11)–系统参数设置

工作流初始错误 泛微提交流程提示_泛微协同办公平台E-cology8.0版本后台维护手册(11)–系统参数设置...-CSDN博客 工作流初始错误 泛微提交流程提示_泛微OA 工作流WebService接口使用说明 工作流初始错误 泛微提交流程提示_泛微OA 工作流WebService接口使用说明-CSDN博客 工作…

C++数学

前言 C算法与数据结构 打开打包代码的方法兼述单元测试 数论&#xff1a;质数、最大公约数、菲蜀定理 组合数学汇总 计算几何 博弈论 曼哈顿距离与切比雪夫距离 红线是哈曼顿距离&#xff0c;绿线是切比雪夫距离。 二维曼哈顿距离转切比雪夫距离 曼哈顿距离&#xff1a;|…

前深度学习时代-经典的推荐算法

参考自《深度学习推荐系统》—— 王喆&#xff0c;用于学习记录。 1.协同过滤 “协同过滤”就是协同大家的反馈、评价和意见一起对海量的信息进行过滤&#xff0c;从中筛选出目标用户可能感兴趣的信息的推荐过程。 基于用户相似度进行推荐的协同过滤算法 UserCF 用户相似度…

10 Oracle Data Guard:打造高可用性与灾难恢复解决方案,确保业务连续性

文章目录 10 Oracle Data Guard&#xff1a;打造高可用性与灾难恢复解决方案&#xff0c;确保业务连续性一、Data Guard基本概念二、Data Guard技术架构三、配置Oracle Data Guard的步骤3.1 准备主数据库和备用数据库3.2 配置Redo日志传输服务3.3 配置Data Guard Broker3.4 启动…