[STM32G4] 探索STM32G431的PWM生成与配置

[复制链接]
 楼主| Bblythe 发表于 2025-1-22 07:51 | 显示全部楼层 |阅读模式
STM32G431是一款高性能、低功耗的微控制器,广泛应用于工业自动化、消费电子和电机控制等领域。本文将重点介绍如何基于STM32G431的定时器功能生成PWM信号,并提供代码示例。
PWM的基本概念PWM(脉宽调制)是一种通过调节信号高电平时间来实现模拟信号控制的方法。在STM32G431中,可以通过其高级定时器(如TIM1)或通用定时器(如TIM2)生成PWM信号,用于驱动电机、LED调光等场景。

配置步骤要在STM32G431上实现PWM信号的输出,需要完成以下步骤:
  • 初始化GPIO:配置定时器输出的GPIO为复用功能。
  • 配置定时器:设置定时器的计数频率、周期和占空比。
  • 启用PWM输出:启动定时器以输出PWM信号。
下面以STM32CubeIDE为开发工具,通过HAL库实现PWM信号的生成。

实现代码以下代码以TIM2通道1(PA0引脚)为例,生成一个频率为1 kHz,占空比为50%的PWM信号。
  1. #include "main.h"

  2. TIM_HandleTypeDef htim2;

  3. /* 初始化TIM2 */
  4. void MX_TIM2_Init(void)
  5. {
  6.     TIM_OC_InitTypeDef sConfigOC = {0};

  7.     /* 定时器基础配置 */
  8.     htim2.Instance = TIM2;
  9.     htim2.Init.Prescaler = 79;           // 分频系数,设置计数频率为1 MHz
  10.     htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  11.     htim2.Init.Period = 999;             // 自动重装值,设置PWM周期为1 ms
  12.     htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  13.     htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  14.     if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
  15.     {
  16.         Error_Handler();
  17.     }

  18.     /* 配置PWM通道 */
  19.     sConfigOC.OCMode = TIM_OCMODE_PWM1;
  20.     sConfigOC.Pulse = 500;               // 设置占空比为50%
  21.     sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  22.     sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  23.     if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  24.     {
  25.         Error_Handler();
  26.     }
  27. }

  28. /* 初始化GPIO */
  29. void MX_GPIO_Init(void)
  30. {
  31.     GPIO_InitTypeDef GPIO_InitStruct = {0};

  32.     /* GPIO时钟使能 */
  33.     __HAL_RCC_GPIOA_CLK_ENABLE();

  34.     /* 配置PA0为TIM2_CH1复用功能 */
  35.     GPIO_InitStruct.Pin = GPIO_PIN_0;
  36.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  37.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  38.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  39.     GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
  40.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  41. }

  42. /* 主函数 */
  43. int main(void)
  44. {
  45.     HAL_Init();
  46.     SystemClock_Config();

  47.     MX_GPIO_Init();
  48.     MX_TIM2_Init();

  49.     /* 启动PWM */
  50.     if (HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1) != HAL_OK)
  51.     {
  52.         Error_Handler();
  53.     }

  54.     while (1)
  55.     {
  56.         // 主循环
  57.     }
  58. }
代码解析
  • 定时器初始化:设置TIM2的计数频率为1 MHz,周期为1000,生成1 kHz的PWM信号。
  • 通道配置:将TIM2通道1配置为PWM1模式,占空比为50%。
  • GPIO复用:PA0引脚配置为TIM2_CH1的复用功能,用于输出PWM信号。
  • 启动PWM:调用HAL_TIM_PWM_Start函数启动定时器。

验证输出将示波器连接到PA0引脚,可以观察到1 kHz的方波信号,占空比为50%。通过修改sConfigOC.Pulse的值,可以调整占空比。

总结STM32G431通过其强大的定时器模块,可以方便地生成高精度的PWM信号。以上代码提供了从配置到输出的完整流程,适用于电机控制、LED调光等多种应用场景。

公羊子丹 发表于 2025-1-22 07:51 | 显示全部楼层
哇,这篇文章太详细了,新手也能看懂,赞一个!
周半梅 发表于 2025-1-22 07:52 | 显示全部楼层
请问这个代码能不能用在STM32G030上?
帛灿灿 发表于 2025-1-22 07:52 | 显示全部楼层
用定时器生成PWM真是太好用了,感谢分享!
童雨竹 发表于 2025-1-22 07:52 | 显示全部楼层
如果要改变频率的话,是不是改Prescaler和Period?
万图 发表于 2025-1-22 07:52 | 显示全部楼层
STM32CubeIDE确实方便,这代码一看就能跑!
Wordsworth 发表于 2025-1-22 07:53 | 显示全部楼层
有没有关于电机控制的PWM配置文章?
Pulitzer 发表于 2025-1-22 07:53 | 显示全部楼层
最近刚好在学STM32,这篇文章简直是及时雨!
Uriah 发表于 2025-1-22 07:53 | 显示全部楼层
50%的占空比对驱动LED是不是太亮了?
Clyde011 发表于 2025-1-22 07:53 | 显示全部楼层
HAL库用起来挺简单,想问下LL库的实现会更快吗?
SophiaOP 发表于 2025-1-22 08:02 来自手机 | 显示全部楼层
这个专门做电机的吗
Amazingxixixi 发表于 2025-1-24 12:51 | 显示全部楼层
学习一下,提升技能,新年快乐
地瓜patch 发表于 2025-1-24 15:08 来自手机 | 显示全部楼层
主频能到多少,g系列是不是不高
您需要登录后才可以回帖 登录 | 注册

本版积分规则

145

主题

5737

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部