查看: 1430|回复: 0

[经验] 详解STM32的PWM输出及频率和脉宽(占空比)的计算——寄存器...

[复制链接]
  • TA的每日心情
    开心
    2019-11-4 13:48
  • 签到天数: 14 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2020-7-6 10:00:07 | 显示全部楼层 |阅读模式
    分享到:

    一、stm32的pwm输出引脚是使用的IO口的复用功能。

    二、T2~T5这4个通用定时器均可输出4路PWM——CH1~CH4。

    三、我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类似),并在最后给出tim3的ch1和ch2两路pwm输出的c代码(已在STM32F103RBT6上测试成功,大家放心使用!)。

    四、给出了PWM频率和占空比的计算公式。

    步骤如下:

    1、使能TIM3时钟

    RCC->APB1ENR |= 1 << 1;

    2、配置对应引脚(PA6)的复用输出功能

    GPIOA->CRL &= 0XF0FFFFFF;//PA6清0
    GPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)
    GPIOA->ODR |= 1 << 6;//PA6上拉

    3、设定计数器自动重装值及是否分频

    TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)
    TIM3->PSC = psc;//预分频器,0为不分频

    4、设置PWM的模式(有1和2两种模式,区别在于输出电平极性相反),根据需求选一种即可

    注:TIMX_CCMR1决定CH1~CH2路,TIMX_CCMR2决定CH3~CH4路。

    //TIM3->CCMR1 |= 6 << 4;//CH1 PWM1模式

    TIM3->CCMR1 |= 7 << 4;//CH1 PWM2模式
    TIM3->CCMR1 |= 1 << 3;//CH1预装载使能

    5、输出使能设置

    TIM3->CCER  |= 1 << 0;//输入/捕获1输出使能

    6、自动重装载预装载允许位(ARPE) 及 定时器 使能

    TIM3->CR1 = 0X0080;//ARPE使能(此句不配置也行)
    TIM3->CR1 |= 0X01;//使能定时器3

    下面给出TIM3_CH1及TIM3_CH2的PWM输出代码:

    void PWM_Init_TIM3_CH1(u16 arr, u16 psc)
    {

        //1、使能TIM3时钟   

        RCC->APB1ENR |= 1 << 1;//使能TIM3时钟

        //2、配置对应引脚(PA6)的复用输出功能

        GPIOA->CRL &= 0XF0FFFFFF;//PA6清0
        GPIOA->CRL |= 0X0B000000;//复用功能输出(推挽50MHz输出)
        GPIOA->ODR |= 1 << 6;//PA6上拉   

        //3、设定计数器自动重装值及是否分频

        TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)
        TIM3->PSC = psc;//预分频器 0为不分频
        //4、设置PWM的模式
        TIM3->CCMR1 |= 7 << 4;//CH1 PWM2模式
        TIM3->CCMR1 |= 1 << 3;//CH1预装载使能   
        //5、输出使能设置

        TIM3->CCER  |= 1 << 0;//输入/捕获1输出使能

        //6、自动重装载预装载允许位(ARPE) 及 定时器 使能

        TIM3->CR1 = 0X0080;//ARPE使能
        TIM3->CR1 |= 0X01;//使能定时器3
    }

    void PWM_Init_TIM3_CH2(u16 arr, u16 psc)
    {
        RCC->APB1ENR |= 1 << 1;//使能TIM3时钟
       
        GPIOA->CRL &= 0X0FFFFFFF;//PA7清0
        GPIOA->CRL |= 0XB0000000;//复用功能输出(推挽50MHz输出)
        GPIOA->ODR |= 1 << 7;//PA7上拉

        TIM3->ARR = arr;//设定计数器自动重装值(决定PWM的频率)
        TIM3->PSC = psc;//预分频器 不分频

        TIM3->CCMR1 |= 7 << 12;//CH2 PWM2模式
        TIM3->CCMR1 |= 1 << 11;//CH2预装载使能

        TIM3->CCER  |= 1 << 4;//输入/捕获2输出使能
        TIM3->CR1 = 0X0080;//ARPE使能
        TIM3->CR1 |= 0X01;//使能定时器3
    }

    频率:

    //Fpwm = 72M / ((arr+1)*(psc+1))(单位:Hz)
    占空比:

    //duty circle = TIM3->CCR1 / arr(单位:%)

    注:本文方法的一个定时器4个通道的pwm输出的频率是相同的,但占空比可以不同!


    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-20 21:03 , Processed in 0.112134 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.