[STM32G4] 基于STM32G431的PWM控制详解与实现

[复制链接]
1727|12
 楼主| 万图 发表于 2025-1-16 09:49 | 显示全部楼层 |阅读模式
近年来,STMicroelectronics(意法半导体)的STM32系列微控制器因其强大的性能、灵活的外设以及易用的开发生态,受到了嵌入式开发者的广泛青睐。在工业控制、消费电子等领域,PWM(脉宽调制)作为一种控制技术,应用非常广泛。本文将以STM32G431为例,介绍如何配置并使用其高级定时器实现PWM功能。
1. STM32G431简介STM32G431是STM32G4系列的一员,定位于数字电源与高性能应用。其特点包括:
  • 主频高达170MHz的ARM Cortex-M4内核
  • 丰富的外设,包括高级定时器(TIM1、TIM8),适用于高精度控制
  • 内置运算放大器和DAC,适合电机控制和信号处理
2. PWM的基本原理PWM通过控制信号的占空比来实现能量或信号的调制。以定时器为核心,MCU通过设置周期、占空比等参数,产生所需的PWM波形,广泛应用于电机速度控制、LED调光等场景。
3. STM32G431的PWM配置步骤通过STM32CubeMX和HAL库,可以快速完成PWM的配置和实现。以下是实现一个简单PWM波的代码示例。
代码实现
  1. #include "main.h"

  2. // 定义PWM输出通道和定时器句柄
  3. TIM_HandleTypeDef htim1;
  4. uint32_t pwm_duty_cycle = 50; // 初始占空比为50%

  5. // 定时器初始化函数
  6. void MX_TIM1_Init(void)
  7. {
  8.     TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  9.     TIM_MasterConfigTypeDef sMasterConfig = {0};
  10.     TIM_OC_InitTypeDef sConfigOC = {0};

  11.     htim1.Instance = TIM1;
  12.     htim1.Init.Prescaler = 170 - 1; // 定时器分频
  13.     htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  14.     htim1.Init.Period = 1000 - 1; // PWM周期为1ms
  15.     htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  16.     htim1.Init.RepetitionCounter = 0;
  17.     htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

  18.     if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  19.     {
  20.         Error_Handler();
  21.     }

  22.     sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  23.     if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
  24.     {
  25.         Error_Handler();
  26.     }

  27.     if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
  28.     {
  29.         Error_Handler();
  30.     }

  31.     sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  32.     sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  33.     if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  34.     {
  35.         Error_Handler();
  36.     }

  37.     sConfigOC.OCMode = TIM_OCMODE_PWM1;
  38.     sConfigOC.Pulse = pwm_duty_cycle * (htim1.Init.Period + 1) / 100; // 根据占空比设置脉冲宽度
  39.     sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  40.     sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

  41.     if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  42.     {
  43.         Error_Handler();
  44.     }

  45.     // 启动PWM输出
  46.     HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  47. }

  48. // 修改PWM占空比的函数
  49. void Set_PWM_DutyCycle(uint8_t duty)
  50. {
  51.     pwm_duty_cycle = duty;
  52.     __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty * (htim1.Init.Period + 1) / 100);
  53. }

  54. int main(void)
  55. {
  56.     HAL_Init();
  57.     SystemClock_Config();
  58.     MX_TIM1_Init();

  59.     while (1)
  60.     {
  61.         // 模拟占空比变化
  62.         for (uint8_t duty = 10; duty <= 90; duty += 10)
  63.         {
  64.             Set_PWM_DutyCycle(duty);
  65.             HAL_Delay(500);
  66.         }
  67.     }
  68. }
代码说明
  • 初始化定时器:通过MX_TIM1_Init函数配置TIM1的分频系数、计数模式、周期等参数。
  • 配置PWM通道:调用HAL_TIM_PWM_ConfigChannel设置TIM1的通道1为PWM模式。
  • 实时更新占空比:通过Set_PWM_DutyCycle函数动态调整PWM波的占空比。
4. 测试与优化通过示波器,可以观察到PWM波形的变化。如果需要更高的分辨率或特殊波形,可以:
  • 调整定时器的分频参数
  • 使用DMA或中断提高实时性
  • 集成其它外设,如DAC,实现更复杂的功能
5. 总结本文通过详细的代码示例,介绍了如何在STM32G431上实现基本的PWM功能。STM32G431凭借其强大的硬件资源和高灵活性,非常适合应用于工业控制、电机驱动等场景。

公羊子丹 发表于 2025-1-16 09:49 | 显示全部楼层
这个代码简单明了,正好最近在做电机控制,用得上
周半梅 发表于 2025-1-16 09:49 | 显示全部楼层
STM32G431确实好用,PWM功能丰富,性能也够强!
帛灿灿 发表于 2025-1-16 09:50 | 显示全部楼层
有示波器截图就更好了,代码效果看起来不错。
童雨竹 发表于 2025-1-16 09:50 | 显示全部楼层
能不能分享一下如何用DMA优化PWM控制?谢谢
Wordsworth 发表于 2025-1-16 09:50 | 显示全部楼层
STM32CubeMX工具真是神器,配置效率超高
Bblythe 发表于 2025-1-16 09:50 | 显示全部楼层
希望能有个LED调光的实际例子,感觉更直观。
Pulitzer 发表于 2025-1-16 09:50 | 显示全部楼层
楼主有没有尝试过用高级定时器做死区插入?
Uriah 发表于 2025-1-16 09:51 | 显示全部楼层
文章很详细,想问问如果用这个控制直流无刷电机怎么样
Clyde011 发表于 2025-1-16 09:51 | 显示全部楼层
STM32G431集成了放大器和DAC,适合搞数字电源。
Amazingxixixi 发表于 2025-1-21 17:26 | 显示全部楼层
学习一下啊,还有好多需要学习的。
gejigeji521 发表于 2025-1-21 17:57 | 显示全部楼层
PWM是用库函数做啊,还是用cubeMX做啊。
SophiaOP 发表于 2025-1-22 21:16 来自手机 | 显示全部楼层
G4系列好像只有hal库
您需要登录后才可以回帖 登录 | 注册

本版积分规则

171

主题

6183

帖子

1

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