STM32 CubeMX时钟配置PWM信号输出

PWM 基本原理

PWM 是一种通过调节方波信号的占空比(高电平时间与周期的比例)来控制输出功率的技术。在 STM32 中,PWM 主要由定时器和 CCR 寄存器协同实现。

CCR 寄存器的作用

CCR 寄存器存储用于与定时器计数器值进行比较的数值。以定时器 TIMx 为例,其包含多个 CCR 寄存器(CCR1、CCR2 等),分别对应不同的 PWM 输出通道。

PWM 生成过程

  1. 定时器计数:定时器从 0 开始递增计数,直到达到自动重载寄存器(ARR)的值,然后重新从 0 开始。
  2. 比较过程:在每个计数周期内,定时器会将当前计数值与 CCR 寄存器的值进行比较。
  3. 输出控制:根据比较结果,输出引脚的电平会发生相应变化,从而生成 PWM 波形。

PWM 模式

STM32 支持两种 PWM 模式:

  • PWM 模式 1:当计数器值小于 CCR 值时,输出高电平;否则输出低电平。
  • PWM 模式 2:当计数器值小于 CCR 值时,输出低电平;否则输出高电平。

示例代码

以下是一个配置 TIM3 通道 1 生成 PWM 的示例:

#include "stm32f10x.h"

void TIM3_PWM_Init(u16 arr, u16 psc)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    
    // 使能TIM3和GPIOA时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    // 配置PA6为复用推挽输出(TIM3 CH1)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    // 配置TIM3时基
    TIM_TimeBaseStructure.TIM_Period = arr;          // 自动重载值
    TIM_TimeBaseStructure.TIM_Prescaler = psc;       // 预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;     // 时钟分割
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  // 向上计数模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    
    // 配置TIM3通道1为PWM模式1
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;        // PWM模式1
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  // 使能输出
    TIM_OCInitStructure.TIM_Pulse = 0;                        // 初始占空比为0
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  // 输出极性高
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);
    
    // 使能TIM3
    TIM_Cmd(TIM3, ENABLE);
}

int main(void)
{
    // 初始化TIM3,设置PWM频率为50Hz(系统时钟72MHz)
    TIM3_PWM_Init(19999, 719);  // ARR=19999,PSC=719,频率=72MHz/(720*20000)=50Hz
    
    // 设置占空比为50%(CCR值为ARR的一半)
    TIM_SetCompare1(TIM3, 10000);  // 占空比=10000/20000=50%
    
    while(1)
    {
        // 主循环可以执行其他任务
    }
}

工作过程解析

  • 频率控制:PWM 频率由 ARR 和 PSC 共同决定,公式为:频率 = 定时器时钟 / ((PSC+1)×(ARR+1))
  • 占空比控制:占空比由 CCR 值与 ARR 值的比例决定,公式为:占空比 = CCR / ARR × 100%
  • 波形生成:当计数器值小于 CCR 值时,输出高电平;大于等于 CCR 值时,输出低电平,形成 PWM 波形。

通过修改 CCR 寄存器的值,可以动态调整 PWM 的占空比,从而实现对外部设备(如电机、LED 等)的精确控制。

### 如何在 STM32CubeMX配置 PWM 并添加相关硬件组件 #### 使用 STM32CubeMX 进行基本设置 STM32CubeMX 提供了一个直观的界面来简化微控制器的配置过程,包括时钟、外设以及中间件的选择和初始化代码生成[^1]。 为了配置脉宽调制 (PWM),首先启动 STM32CubeMX 应用程序,并创建一个新的项目。选择目标设备型号后进入主窗口,在这里可以通过图形界面对各个模块进行参数设定。 #### 添加定时器用于 PWM 输出 对于大多数 STM32 系列而言,PWM 功能通常通过通用定时器实现。因此,在 Pinout & Configuration 页面找到 TIMx 定时器(其中 x 表示具体的定时器编号),将其模式更改为 Advanced-Control PWM 或者其他适合的形式取决于具体的应用场景需求。 ```c // 示例:TIM1 配置PWM 模式 __HAL_RCC_TIM1_CLK_ENABLE(); // 启用 TIM1 时钟 ``` #### 设置 GPIO 引脚作为 PWM 输出通道 接着定义哪些 GPIO 引脚将被用来传输 PWM 波形。这一步骤同样是在 Pinout & Configuration 页面完成;只需点击相应的引脚图标即可弹出对话框允许更改其用途至指定的定时器通道上。 ```c // 示例:PA8 设定为 TIM1_CH1 的 PWM 输出 GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` #### 调整高级控制选项 如果需要进一步定制 PWM 特性,则可以在 Parameters 和 NVIC Settings 子菜单下调整更多细节,比如频率、占空比等。这些设置能够影响最终产生的波形特性,满足特定应用场景下的精确要求。 #### 利用 HAL 库编写应用代码 当所有的硬件资源都已正确配置完毕之后,利用自动生成的初始化函数基础上继续扩展应用程序逻辑部分。借助于 STM32CubeMX 所集成的 Hardware Abstraction Layer (HAL) API 函数,可以直接操作底层寄存器而无需深入了解复杂的架构细节[^2]。 ```c // 初始化并开启 TIM1 的 PWM 输出 htim1.Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 999; if (HAL_TIM_PWM_Init(&htim1) != HAL_OK){ Error_Handler(); } if (HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1)!= HAL_OK){ Error_Handler(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值