關於STM32 定時器 PWM 實時調節占空比時,預裝載特性


 

最近在調試項目的時候遇到一個奇怪的現象:在調試狀態下,給定時器捕獲比較寄存器賦不同值,能產生不同占空比的波形(圖1)。反映到器件上也有不同的電壓顯示,但是在設備運行的時候,就不行了(圖2)。 

圖1

圖2

糾結了N天后,也沒有辦法解決,只好乖乖的看STM32 控制器手冊找找看了,結果還真找到了。

從圖中可以看到,如果使能預裝載特性,則數據會立即寫入寄存器中,如果沒有使能,那就得等到有事件(?)發生了。這我就明白了,在調試狀態下,給寄存器賦值,不會產生什么影響,因為人的反應速度很慢,但是在運行的時候,占空比是實時發生改變的,這樣就不能及時寫入到捕獲比較寄存器中,輸出就不會改變了。所以在配置定時器輸出PWM的時候,還是乖乖的把預裝載使能吧。代碼原型如下:

/*******************************************************************************

* Function Name  : TIM_OC3PreloadConfig

* Description    : Enables or disables the TIMx peripheral Preload register on CCR3.

* Input          : - TIMx: where x can be  1, 2, 3, 4, 5 or 8 to select the TIM *

                    peripheral.

*                  - TIM_OCPreload: new state of the TIMx peripheral Preload

*                    register

*                    This parameter can be one of the following values:

*                       - TIM_OCPreload_Enable

*                       - TIM_OCPreload_Disable

* Output         : None

* Return         : None

*******************************************************************************/

void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, u16 TIM_OCPreload)

{

  u16 tmpccmr2 = 0;

  /* Check the parameters */

  assert_param(IS_TIM_123458_PERIPH(TIMx));

  assert_param(IS_TIM_OCPRELOAD_STATE(TIM_OCPreload));

  tmpccmr2 = TIMx->CCMR2;

  /* Reset the OC3PE Bit */

  tmpccmr2 &= CCMR_OC13PE_Reset;

  /* Enable or Disable the Output Compare Preload feature */

  tmpccmr2 |= TIM_OCPreload;

  /* Write to TIMx CCMR2 register */

  TIMx->CCMR2 = tmpccmr2;

}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM