普通网友 2025-10-27 06:20 采纳率: 97.6%
浏览 0
已采纳

STM32F103手册中如何配置PWM输出模式?

在查阅STM32F103参考手册时,许多开发者对如何正确配置定时器以实现PWM输出模式感到困惑。常见问题是:当使用通用定时器(如TIM2-TIM5)配置PWM时,应如何设置捕获/比较寄存器(CCR)、自动重载寄存器(ARR)以及输出比较模式?特别是,在选择PWM模式1与模式2时,其有效电平差异容易导致输出波形不符合预期。此外,极性设置(CCxP)与时钟使能、GPIO复用功能配置的顺序也常被忽略,导致无PWM信号输出。如何根据手册中的寄存器定义和时序图,正确完成从时钟使能到占空比调节的完整配置流程?
  • 写回答

1条回答 默认 最新

  • IT小魔王 2025-10-27 09:33
    关注

    STM32F103通用定时器PWM输出配置详解

    1. 基础概念:PWM与定时器工作原理

    PWM(脉宽调制)是一种通过调节占空比来控制平均电压的技术,广泛应用于电机驱动、LED调光等场景。在STM32F103中,通用定时器如TIM2-TIM5支持多种PWM模式。

    核心寄存器包括:

    • ARR(Auto-Reload Register):决定PWM周期
    • CCR(Capture/Compare Register):决定占空比
    • CCMRx(Capture/Compare Mode Register):设置输出比较模式
    • CCER(Capture/Compare Enable Register):使能通道并设置极性

    定时器基于内部时钟(经PSC预分频后)递增计数,当计数值等于CCR时触发动作,达到ARR后重置。

    2. PWM模式选择:模式1 vs 模式2

    模式计数器 < CCR计数器 ≥ CCR典型应用场景
    PWM Mode 1有效电平(高)无效电平(低)正向PWM输出
    PWM Mode 2无效电平(低)有效电平(高)互补或反相需求

    若误选模式2,原本期望高占空比输出长时间高电平,实际却变为短时间高电平,导致波形反转。

    3. 配置流程:从时钟使能到信号输出

    1. 开启APB1或APB2总线时钟(RCC)
    2. 配置GPIO为复用推挽输出模式
    3. 设置TIMx的PSC、ARR以确定频率
    4. 配置CCMRx寄存器选择PWM模式
    5. 设置CCER寄存器启用通道及极性(CCxP)
    6. 启动定时器(CR1寄存器)
    7. 动态修改CCR值调节占空比

    4. 寄存器级配置示例(以TIM3_CH1为例)

    // RCC使能
    RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
    
    // GPIOA.6 复用推挽输出
    GPIOA->CRL &= ~GPIO_CRL_MODE6;
    GPIOA->CRL |= GPIO_CRL_MODE6_1;        // 2MHz
    GPIOA->CRL &= ~GPIO_CRL_CNF6;
    GPIOA->CRL |= GPIO_CRL_CNF6_1;         // 复用推挽
    
    // TIM3基本配置
    TIM3->PSC = 71;                          // 72MHz / (71+1) = 1MHz
    TIM3->ARR = 999;                         // 周期1ms → 1kHz
    TIM3->CCR1 = 250;                        // 占空比25%
    
    // PWM模式1,OC1M[2:0]=110
    TIM3->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1;
    TIM3->CCMR1 &= ~TIM_CCMR1_OC1M_0;
    TIM3->CCMR1 |= TIM_CCMR1_OC1PE;          // 使能预装载
    
    // 使能通道1,非反相输出
    TIM3->CCER |= TIM_CCER_CC1E;
    
    // 启动定时器
    TIM3->CR1 |= TIM_CR1_CEN;
    

    5. 极性与时序关键点分析

    极性由CCER中的CCxP位控制:

    • CCxP=0:正常极性(CCR匹配时按模式翻转)
    • CCxP=1:反向极性(高低电平反转)

    常见错误是先启动定时器再配置GPIO,导致无信号输出。正确顺序必须是:

    graph TD A[RCC时钟使能] --> B[GPIO复用配置] B --> C[TIM参数设置:PSC/ARR] C --> D[CCMRx设PWM模式] D --> E[CCER使能+极性] E --> F[启动CR1.CEN] F --> G[动态调节CCR]

    6. 动态占空比调节与调试技巧

    运行时可通过更新CCR寄存器实现平滑调光或调速:

    void set_pwm_duty(TIM_TypeDef* TIMx, uint32_t channel, uint32_t duty) {
        uint32_t arr = TIMx->ARR;
        uint32_t ccr = (arr * duty) / 100;  // 百分比输入
        switch(channel) {
            case 1: TIMx->CCR1 = ccr; break;
            case 2: TIMx->CCR2 = ccr; break;
            // 其他通道...
        }
    }
    

    建议使用逻辑分析仪验证波形,并结合STM32参考手册第14章时序图核对边沿行为。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月28日
  • 创建了问题 10月27日