打印
[STM32G4]

探索STM32G431的PWM生成与配置

[复制链接]
217|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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信号。
#include "main.h"

TIM_HandleTypeDef htim2;

/* 初始化TIM2 */
void MX_TIM2_Init(void)
{
    TIM_OC_InitTypeDef sConfigOC = {0};

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

    /* 配置PWM通道 */
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 500;               // 设置占空比为50%
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
    {
        Error_Handler();
    }
}

/* 初始化GPIO */
void MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /* GPIO时钟使能 */
    __HAL_RCC_GPIOA_CLK_ENABLE();

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

/* 主函数 */
int main(void)
{
    HAL_Init();
    SystemClock_Config();

    MX_GPIO_Init();
    MX_TIM2_Init();

    /* 启动PWM */
    if (HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1) != HAL_OK)
    {
        Error_Handler();
    }

    while (1)
    {
        // 主循环
    }
}
代码解析
  • 定时器初始化:设置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真是太好用了,感谢分享!

使用特权

评论回复
5
童雨竹| | 2025-1-22 07:52 | 只看该作者
如果要改变频率的话,是不是改Prescaler和Period?

使用特权

评论回复
6
万图| | 2025-1-22 07:52 | 只看该作者
STM32CubeIDE确实方便,这代码一看就能跑!

使用特权

评论回复
7
Wordsworth| | 2025-1-22 07:53 | 只看该作者
有没有关于电机控制的PWM配置文章?

使用特权

评论回复
8
Pulitzer| | 2025-1-22 07:53 | 只看该作者
最近刚好在学STM32,这篇文章简直是及时雨!

使用特权

评论回复
9
Uriah| | 2025-1-22 07:53 | 只看该作者
50%的占空比对驱动LED是不是太亮了?

使用特权

评论回复
10
Clyde011| | 2025-1-22 07:53 | 只看该作者
HAL库用起来挺简单,想问下LL库的实现会更快吗?

使用特权

评论回复
11
SophiaOP| | 2025-1-22 08:02 | 只看该作者
这个专门做电机的吗

使用特权

评论回复
12
Amazingxixixi| | 2025-1-24 12:51 | 只看该作者
学习一下,提升技能,新年快乐

使用特权

评论回复
13
地瓜patch| | 2025-1-24 15:08 | 只看该作者
主频能到多少,g系列是不是不高

使用特权

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

本版积分规则

39

主题

3858

帖子

0

粉丝