您的当前位置:首页STM32TIM的PMW模式

STM32TIM的PMW模式

2021-11-02 来源:小侦探旅游网
STM32TIM的PMW模式

STM32 TIM的PMW模式

STM32开发板学习⽇记-[5]TIM的PMW模式

脉冲宽度调制模式可以产⽣⼀个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空⽐的信号。在TIMx_CCMRx寄存器中的OCxM位写⼊’110’(PWM模式1)或

’111’(PWM模式2),能够独⽴地设置每个OCx输出通道产⽣⼀路PWM。必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位使能⾃动重装载的预装载寄存器(在向上计数或中⼼对称模式中)。因为仅当发⽣⼀个更新事件的时候,预装载寄存器才能被传送到影⼦寄存器,因此在计数器开始计数之前,必须通过设置TIMx_EGR寄存器中的UG位来初始化所有的寄存器。OCx的极性可以通过软件在TIMx_CCER寄存器中的CCxP 位设置,它可以设置为⾼电平有效活或低电平有效。

TIMx_CCER寄存器中的CCxE位控制OCx输出使能。在PWM模式(模式1或模式2)下,TIMx_CNT和TIM1_CCRx

始终在进⾏⽐较,(依据计数器的计数⽅向)以确定是否符合TIM1_CCRx≤TIM1_CNT或者

TIM1_CNT≤TIM1_CCRx。然⽽为了与OCREF_CLR 的功能(在下⼀个PWM周期之前,ETR信号上的⼀个外部事件能够清除OCxREF)⼀致,OCxREF信号只能在下述条件下产⽣:●当⽐较的结果改变

●当输出⽐较模式(TIMx_CCMRx寄存器中的OCxM位)从

“冻结”(⽆⽐较,OCxM=’000’)切换到某个PWM模式(OCxM=’110’或’111’)。这样在运⾏中可以通过软件强置PWM输出。

根据TIMx_CR1寄存器中CMS位的状态,定时器能够产⽣边沿对齐的PWM信号或中央对齐的PWM信号。110:PWM模式1-在向上计数时,⼀旦

TIMx_CNTTIMx_CCR1时通道1为⽆效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

111:PWM模式2-在向上计数时,⼀旦

TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为⽆效电平。PWM 边沿对齐模式向上计数配置

当TIMx_CR1寄存器中的DIR位为低的时候执⾏向上计数。参看13.3.2节。下⾯是⼀个PWM模式1的例⼦。当

TIMx_CNT(TIMx_ARR),则OCxREF保持为’1’。如果⽐较值为0,则OCxREF保持为’0’。下图为TIMx_ARR=8时边沿对齐的PWM波形实例。

向下计数的配置

当TIMx_CR1寄存器的DIR位为⾼时执⾏向下计数。

在PWM模式1,当TIMx_CNT>TIMx_CCRx时参考信号OCxREF为低,否则为⾼。如果TIMx_CCRx中的⽐较值⼤于

TIMx_ARR中的⾃动重装载值,则OCxREF保持为’1’。该模式下不能产⽣0%的PWM波形。PWM 中央对齐模式

当TIMx_CR1寄存器中的CMS位不为’00’时为中央对齐模式(所有其他的配置对OCxREF/OCx信号都有相同的作⽤)。根据不同的CMS位的设置,⽐较标志可以在计数器向上计数时被置1、在计数器向下计数时被置1、或在计数器向上和向下计数时被置1。TIMx_CR1寄存器中的计数⽅向位(DIR)由硬件更新,不要⽤软件修改它。下图给出了⼀些中央对齐的PWM波形的例⼦●TIMx_ARR=8●PWM模式1

●TIMx_CR1寄存器中的CMS=01,在中央对齐模式1时,当计数器向下计数时设置⽐较标志。通⽤定时器(TIMx)使⽤中央对齐模式的提⽰:

●进⼊中央对齐模式时,使⽤当前的上/下计数配置;这就意味着计数器向上还是向下计数取决于TIMx_CR1寄存器中DIR位的当前值。此外,软件不能同时修改DIR和CMS位。

●不推荐当运⾏在中央对齐模式时改写计数器,因为会产⽣不可预知的结果。特别地:─如果写⼊计数器的值⼤于⾃动重加载的值

(TIMx_CNT>TIMx_ARR),则⽅向不会被更新。例如,如果计数器正在向上计数,它就会继续向上计数。─如果将0或者TIMx_ARR的值写⼊计数器,⽅向被更新,但不产⽣更新事件UEV。

●使⽤中央对齐模式最保险的⽅法,就是在启动计数器之前产⽣⼀个软件更新(设置TIMx_EGR 位中的UG位),不要在计数进⾏过程中修改计数器的值。

本例展⽰了如何设置TIM⼯作在脉冲宽度调制模式(PWM Pulse Width Modulationmode)。

TIM3时钟设置为36MHz,预分频设置为0,TIM2计数器时钟可表达为:

TIM3 counter clock = TIMxCLK / (Prescaler +1) = 36 MHz 设置TIM3_CCR1寄存器值为500,则TIM3通道1产⽣⼀个频率为36MHz,占空⽐(duty cycle)为50%的PWM信号。同理,根据寄存器TIM3_CCR2 、TIM3_CCR3和

TIM3_CCR4的值,TIM3通道2产⽣⼀个频率为36MHz,占空⽐(duty cycle)为37.5%的PWM信号;TIM3通道1产⽣⼀个频率为36MHz,占空⽐(duty cycle)为25%的PWM信号;TIM3通道1产⽣⼀个频率为36MHz,占空⽐(duty cycle)为12.5%的PWM信号。

可以通过⽰波器,在相应管脚观察到输出信号。u16 CCR1_Val = 500;u16 CCR2_Val = 375;u16 CCR3_Val = 250;u16 CCR4_Val = 125;

TIM_TimeBaseStructure.TIM_Period = 999;TIM_TimeBaseStructure.TIM_Prescaler = 0;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3,

&TIM_TimeBaseStructure);

TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_Channel = TIM_Channel_1; TIM_OCInitStructure.TIM_Pulse = CCR1_Val;TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;

TIM_OCInit(TIM3, &TIM_OCInitStructure);

启⽤CCR1寄存器的影⼦寄存器(直到产⽣更新事件才更改设置)TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);

TIM_OCInitStructure.TIM_Channel = TIM_Channel_2; TIM_OCInitStructure.TIM_Pulse = CCR2_Val;TIM_OCInit(TIM3, &TIM_OCInitStructure);TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);

TIM_OCInitStructure.TIM_Channel = TIM_Channel_3; TIM_OCInitStructure.TIM_Pulse = CCR3_Val;TIM_OCInit(TIM3, &TIM_OCInitStructure);TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);

TIM_OCInitStructure.TIM_Channel = TIM_Channel_4; TIM_OCInitStructure.TIM_Pulse = CCR4_Val;TIM_OCInit(TIM3, &TIM_OCInitStructure);TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);

TIM_ARRPreloadConfig(TIM3, ENABLE);TIM_Cmd(TIM3, ENABLE);while (1){}}

因篇幅问题不能全部显示,请点此查看更多更全内容