DSP

PWM频率计算公式

2019-07-13 20:45发布

觉得原子的公式可能有点差错。
也可能是自己概念不清,总之指出来,大家讨论一下。
--------------------------------------------------------------------------------
这里是原子定时器周期的计算公式。

我今天看库函数手册发现:

然后做实验仿真:
1)ARR=20,PSC=7199  =>  T=2.1ms,F=476.19Hz

2)ARR=19,PSC=7199  => T=2ms,F=500Hz

所以,频率计算公式应该为:




详解STM32的PWM输出及频率和脉宽(占空比)的计算——寄存器配置六步曲!
一、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输出的频率是相同的,但占空比可以不同!