打印
[STM32G4]

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

[复制链接]
45|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
万图|  楼主 | 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波的代码示例。
代码实现
#include "main.h"

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

// 定时器初始化函数
void MX_TIM1_Init(void)
{
    TIM_ClockConfigTypeDef sClockSourceConfig = {0};
    TIM_MasterConfigTypeDef sMasterConfig = {0};
    TIM_OC_InitTypeDef sConfigOC = {0};

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

    if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
    {
        Error_Handler();
    }

    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
    if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
    {
        Error_Handler();
    }

    if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
    {
        Error_Handler();
    }

    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
    {
        Error_Handler();
    }

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

    if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
    {
        Error_Handler();
    }

    // 启动PWM输出
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
}

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

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_TIM1_Init();

    while (1)
    {
        // 模拟占空比变化
        for (uint8_t duty = 10; duty <= 90; duty += 10)
        {
            Set_PWM_DutyCycle(duty);
            HAL_Delay(500);
        }
    }
}
代码说明
  • 初始化定时器:通过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 | 只看该作者
有示波器截图就更好了,代码效果看起来不错。

使用特权

评论回复
5
童雨竹| | 2025-1-16 09:50 | 只看该作者
能不能分享一下如何用DMA优化PWM控制?谢谢

使用特权

评论回复
6
Wordsworth| | 2025-1-16 09:50 | 只看该作者
STM32CubeMX工具真是神器,配置效率超高

使用特权

评论回复
7
Bblythe| | 2025-1-16 09:50 | 只看该作者
希望能有个LED调光的实际例子,感觉更直观。

使用特权

评论回复
8
Pulitzer| | 2025-1-16 09:50 | 只看该作者
楼主有没有尝试过用高级定时器做死区插入?

使用特权

评论回复
9
Uriah| | 2025-1-16 09:51 | 只看该作者
文章很详细,想问问如果用这个控制直流无刷电机怎么样

使用特权

评论回复
10
Clyde011| | 2025-1-16 09:51 | 只看该作者
STM32G431集成了放大器和DAC,适合搞数字电源。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

3821

帖子

0

粉丝