要理解PWM输出频率的计算,首先需要知道定时器的基础配置,包括自动重装载寄存器 (ARR) 和预分频器 (PSC) 是如何影响定时器的时钟频率。
基本公式:
PWM频率的计算公式为:
fPWM=ftimer_clock/(ARR+1)×(PSC+1)
其中:
- fPWM 是生成的PWM频率。
- ftimer_clock 是定时器的输入时钟频率,就是MCU运行主频。
- ARR 是自动重装载寄存器的值。
- PSC 是预分频器的值。
假设你的定时器时钟频率为 48 MHz (典型的值,可能与你的具体设置有关,需参考时钟树),你使用的初始化参数 TIM1_PWMOut_Init(100, 48000-1, 50)
设置了:
ARR = 100
(即TIM_Period
为 100)PSC = 48000 - 1
(即TIM_Prescaler
为 47999)
代入公式:
fPWM=48 MHz / (100+1)×48000≈9.98Hz
这就是你当前的10 Hz输出频率。
如果要输出10 kHz的PWM波:
你需要重新调整 ARR
和 PSC
以获得更高的频率。假设我们仍使用48 MHz的定时器时钟,并目标频率为 10 kHz,即 fPWM=10,000 Hzf_{\text{PWM}} = 10,000 \, \text{Hz}fPWM=10,000Hz。
使用公式,首先固定预分频器 PSCPSCPSC 为 0(意味着没有预分频),我们可以推导出适合的ARR:
ARR=(ftimer_clock / fPWM)−1=4799
还有如果需要切换PWM波输出引脚,只需要在GPIO初始化时用不同的初始化函数TIM_OC4Init。
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //指定TIM输出比较状态,即使能比较输出
TIM_OCInitStructure.TIM_Pulse = ccp; //指定要加载到捕获比较寄存器中的脉冲值。
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //指定输出极性
TIM_OC4Init( TIM1, &TIM_OCInitStructure ); //根据TIM_OC4Init的选择,可以选择不同的引脚来输出pwm波。
TIM_CtrlPWMOutputs(TIM1, ENABLE ); //启用定时器1PWM输出
TIM_OC1PreloadConfig( TIM1, TIM_OCPreload_Disable ); //使能CCR1上的TIM1外设预加载寄存器
TIM_ARRPreloadConfig( TIM1, ENABLE ); //使能ARR上TIM1外设预加载寄存器
TIM_Cmd( TIM1, ENABLE ); //使能TIM1