【动手学电机驱动】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 电机控制套件 及其应用。

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

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

相关文章

docker+nacos

安装数据库 以docker安装为例(实际建议实体) 初始化数据库 /******************************************/ /* 数据库全名 nacos_config */ /* 表名称 config_info */ /******************************************/ CREATE TABLE config_i…

边缘计算网关如何打造智慧变电站

随着工业化发展,电网规模持续扩大,电力终端设备的数量呈几何级数增长,由此产生了海量的数据传输和处理需求,不仅给服务器主站造成了巨大压力,并且过程中的高时延、高误差也无法满足智能化、自动化等新业务形态的要求。…

Uniapp安装Pinia并持久化(Vue3)

安装pinia 在uni-app的Vue3版本中,Pinia已被内置,无需额外安装即可直接使用(Vue2版本则内置了Vuex)。 HBuilder X项目:直接使用,无需安装。CLI项目:需手动安装,执行yarn add pinia…

(没有跳过联网激活)导致使用微软账号激活电脑---修改为本地账户和英文名字

修改为本地账户和英文名字 前言微软账号,本地账号与用户名基本知识账户管理方式一方式2 查看账户的sid并且修改文件夹名字和系统变量修改注册表和建立软件路径超链接注意事项总结 前言 当没有联网激活新买的电脑时候,这个就不用看了 当你是联网激活的时…

18、论文阅读:AOD-Net:一体化除雾网络

AOD-Net: All-in-One Dehazing Network 前言介绍相关工作物理模型传统方法深度学习方法 建模与扩展变换后的公式网络设计与高级特征任务相结合 除雾评价数据集和实现 前言 该论文提出了一种基于卷积神经网络(CNN)的图像去雾模型,称为 All-in…

[ DOS 命令基础 2 ] DOS 命令详解-网络相关命令

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

【docker】6. 镜像仓库/镜像概念

Docker Registry(镜像仓库) 什么是 Docker Registry 镜像仓库 (Docker Registry) 负责存储、管理和分发镜像,并且提供了登录认证能力,建立了仓库的索引。 镜像仓库管理多个 Repository, Repository 通过命名来区分。…

安装和运行开发微信小程序

下载HBuilder uniapp官网 uni-app官网 微信开发者工具 安装 微信小程序 微信小程序 官网 微信小程序 配置 运行 注意:运行前需要开启服务端口 如果运行看不到效果,设置下基础库选别的版本 配置

[mysql]mysql的DML数据操作语言增删改,以及新特性计算列,阿里巴巴开发手册mysql相关

1DML数据操作语言,增加删除改数据 插入数据INSERT 插入添加数据,两种方法 方式1:VALUES添加数据 #准备工作 USE atguigudb; CREATE TABLE IF NOT EXISTS emp1( id INT, name VARCHAR(15), hire_data DATE, salary DOUBLE(10,2)); SELECT * FROM emp1 INSERT INTO em…

【华为云-云驻共创】UCS跨云多活容灾:让业务高可用不再是难题

【摘要】云原生应用深入到企业各个业务场景,云原生正在走向分布式化,跨云跨域统一协同治理,保证一致应用体验,这些新的需求日益凸显。而容灾是确保服务高可用的保障,但即使应用部署在云上,也无法避免市政方…

R语言生物群落(生态)数据统计分析与绘图丨tidyverse数据清洗、多元统计分析、随机森林、回归及混合效应模型、结构方程模型等

R 语言的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂,涉及众多统计分析方法。内容以生物群落数据分析中的最常用的统计方法回归和混合效应模型、多元统计分析技术及结构方程等数量分析方法为主线,通过多个来自经…

极简实现酷炫动效:Flutter隐式动画指南第二篇之一些酷炫的隐式动画效果

目录 前言 1.弹性放大按钮效果 2.旋转和缩放组合动画 3.颜色渐变背景动画 4.缩放进出效果 前言 在上一篇文章中,我们介绍了Flutter中的隐式动画的一些相关知识,在这篇文章中,我们可以结合多个隐式动画 Widget 在 Flutter 中创建一些酷炫的视觉效果&…

数字马力二面面试总结

24.03.07数字马力二面面试总结 前段时间找工作,做的一些面试笔记总结 大家有面试录音或者记录的也可以发给我,我来整理答案呀 数字马力二面面试总结 24.03.07数字马力二面面试总结你可以挑一个你的最有挑战性的,有难度的,最具有复杂性的项目,可以简单说一下。有没有和算…

C语言例题练手(1)

前几篇博客的内容已经涉及了C语言的部分语法知识,我们可以尝试做一些编程题,或者换一种说法就是可以写出什么样的程序以此来解决一些问题。 题目来自牛客网https://www.nowcoder.com和C语言菜鸟教程C 语言教程 | 菜鸟教程 数值计算 【例1】带余除法计…

大模型LLama3!!!Ollama下载、部署和应用(保姆级详细教程)

首先呢,大家在网站先下载ollama软件 这就和anaconda和python是一样的 废话不多说 直接上链接:Download Ollama on Windows 三个系统都支持 注意: 这里的Models,就是在上面,大家点开之后,里面有很多模型…

【359】基于springboot的智慧草莓基地管理系统

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本智慧草莓基地管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据…

MongoDB笔记03-MongoDB索引

文章目录 一、前言1.1 概述1.2 MongoDB索引使用B-Tree还是BTree?1.3 B 树和 B 树的对比1.4 总结 二、索引的类型2.1 单字段索引2.2 复合索引2.3 其他索引 三、索引的管理操作3.1 索引的查看3.2 索引的创建3.2.1 单字段索引3.2.2 复合索引 3.3 索引的移除3.3.1 指定索…

string模拟实现流插入(输出)+流提取(输入)

个人主页:Jason_from_China-CSDN博客 所属栏目:C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目:C知识点的补充_Jason_from_China的博客-CSDN博客 string模拟实现clear 模拟实现clear的目的是在流提取的时候我们清空之前的数据&#x…

C++入门基础知识134—【关于C 库函数 - gmtime()】

成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于C 库函数 - gmtime()的相关内容&#xf…

ERP学习笔记-预处理eeglab

第一步:数据格式转化 import data:读取收集到的原始数据文件.vhdr格式 读取后的样子: 将数据保存为.set文件 第二步:通道定位 读取.set文件 Channel locations部分为unknown,表明通道的坐标未知 增加默认的设置 Chan…