打印
[STM32G4]

利用STM32G431的TIM1或TIM8等高级定时器来生成PWM波形

[复制链接]
65|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
米多0036|  楼主 | 2025-1-17 11:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32G431 配置高级定时器(如 TIM1 或 TIM8)生成 PWM 信号的步骤如下。通过调整定时器的预分频器(PSC)、自动重载寄存器(ARR)和比较寄存器(CCR),可以精确控制 PWM 波形的频率和占空比。下面是一个详细的配置过程,包括代码示例。

1. 选择定时器和引脚
STM32G431 的高级定时器包括 TIM1、TIM8 等,这些定时器支持 PWM 输出。首先需要选择一个适合的定时器和引脚。

定时器 TIM1/TIM8:这两个定时器可以生成高精度 PWM 信号,具有多个输出通道。
引脚选择:通常,定时器的 PWM 信号输出可以通过特定的引脚(如 PA8、PA9、PA10 等)连接到外部硬件。
2. 基本的定时器配置
配置一个高级定时器生成 PWM 信号的核心步骤包括:

设置定时器的计数频率
设置 PWM 的频率和占空比
启用定时器的 PWM 输出通道
3. 配置过程
以下是如何在 STM32G431 上使用 TIM1 生成 PWM 信号的步骤,代码将会使用 HAL 库。

3.1 启用时钟和外设
首先启用定时器 TIM1 的时钟,并配置相应的 GPIO 引脚为定时器的输出模式。

c
复制
编辑
// 启用 TIM1 和 GPIOA 的时钟
__HAL_RCC_TIM1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();

// 配置 PA8 引脚为定时器 TIM1 的通道 1 输出
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
3.2 配置定时器 TIM1
TIM1 是一个高级定时器,支持 PWM 输出。我们需要设置定时器的预分频器、自动重载值(ARR)以及比较寄存器(CCR)来生成合适的 PWM 信号。

预分频器(PSC):定时器的时钟频率通过预分频器来调整,预分频器的作用是降低定时器的计数频率。
自动重载值(ARR):ARR 决定了 PWM 的频率,公式为:
编辑
// 配置定时器 TIM1
TIM_HandleTypeDef htim1;
htim1.Instance = TIM1;
htim1.Init.Prescaler = 79;          // 预分频器
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 999;            // 自动重载值 (ARR)
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
HAL_TIM_PWM_Init(&htim1);
3.3 配置 PWM 通道
TIM1 通道 1 用于输出 PWM 信号。我们需要设置 PWM 的输出模式并启动 PWM。

c
复制
编辑
// 配置 PWM 通道 1
TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 499;              // 设置初始占空比(50%)
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
3.4 启动 PWM 输出
最后,启动 PWM 输出信号。
c
// 启动 PWM 输出
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
4. 调整 PWM 的频率和占空比
频率调整:通过改变 htim1.Init.Period(ARR)的值来改变 PWM 的频率。
占空比调整:通过修改 sConfigOC.Pulse(CCR)的值来调整 PWM 信号的占空比。CCR 的范围是 0 到 ARR,例如 Pulse = 499 时,PWM 的占空比为 50%。

使用特权

评论回复
沙发
米多0036|  楼主 | 2025-1-17 11:45 | 只看该作者
完整代码示例
c
复制
编辑
#include "stm32g4xx_hal.h"

TIM_HandleTypeDef htim1;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM1_Init(void);

int main(void)
{
    // 初始化硬件
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_TIM1_Init();
   
    // 启动 PWM 输出
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

    while (1)
    {
        // 你可以通过修改 Pulse 值来改变占空比
        // 例如:改变占空比为 75%
        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 749);
        HAL_Delay(1000);
        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 249); // 50%
        HAL_Delay(1000);
    }
}

static void MX_TIM1_Init(void)
{
    // 配置定时器 TIM1
    htim1.Instance = TIM1;
    htim1.Init.Prescaler = 79;        // 预分频器
    htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim1.Init.Period = 999;          // 自动重载值 (ARR)
    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim1.Init.RepetitionCounter = 0;
    HAL_TIM_PWM_Init(&htim1);

    // 配置 PWM 通道 1
    TIM_OC_InitTypeDef sConfigOC;
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 499;            // 初始占空比为 50%
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
}

static void MX_GPIO_Init(void)
{
    // 配置 PA8 为定时器 TIM1 通道 1 的输出引脚
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitStruct.Pin = GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

使用特权

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

本版积分规则

130

主题

1396

帖子

0

粉丝