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_CNT 111:PWM模式2-在向上计数时,⼀旦 TIMx_CNT 当TIMx_CR1寄存器中的DIR位为低的时候执⾏向上计数。参看13.3.2节。下⾯是⼀个PWM模式1的例⼦。当 TIMx_CNT 向下计数的配置 当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){}} 因篇幅问题不能全部显示,请点此查看更多更全内容