日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32H743+CubeMX-定时器TIM输出PWM(PWM Generation模式)+ 中断

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32H743+CubeMX-定时器TIM输出PWM(PWM Generation模式)+ 中断 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、前言
  • 二、CubeMX
    • 2.1、Mode and Parameter Settings
    • 2.2、NVIC Settings
    • 2.3、生成代碼
  • 三、代碼
    • 3.1、tim.c
    • 3.2、main.c
  • 四、DEBUG
    • 4.1、OC中斷回調函數的驗證
    • 4.2、定時器溢出中斷
  • 五、細節補充

一、前言


STM32H743+CubeMX-定時器TIM輸出PWM(PWM Generation模式)
上一次完成了使用定時器TIM的PWM Generation模式輸出PWM波,沒有產生中斷。在實際項目上,有時候需要計算一共發了多少個PWM(相當于脈沖)給步進電機,從而計算步進電機的步距角,有時候也需要計算電平翻轉的次數。

  • 計算PWM的個數需要使用定時器溢出中斷(CNT寄存器的值 = ARR寄存器的值)
  • 計算電平翻轉次數的總數,需要同時使用定時器溢出中斷(CNT寄存器的值 = ARR寄存器的值)與OC中斷(CNT計數器的值 = CCR寄存器的值)
  • 二、CubeMX


    2.1、Mode and Parameter Settings

    TIM8的時鐘頻率是240M,當Prescaler = 239時,TIM8的時鐘頻率 = 240M / (239 + 1) = 1MHz。

    Counter Period設置49999時,定時器溢出中斷的頻率 = 1M / (49999 + 1) = 20Hz,周期T = 1 / 20 = 0.05s = 50ms

    Pulse設置24999時,OC中斷的頻率 = 1M / (24999 + 1) = 40Hz ,周期T = 1 / 40 = 0.025s = 25ms

    根據示波器的波形,可以證明以上的計算是正確的。

    2.2、NVIC Settings

    TIM8 update interrupt : 更新:計數器上溢/下溢,計數器初始化(通過軟件或內部/外部觸發)

    TIM8 capture compare interrupt : 輸出比較

    2.3、生成代碼

    三、代碼


    3.1、tim.c

    首先,在函數void MX_TIM8_Init(void)添加用戶代碼。目的是打開定時器溢出中斷與OC中斷。

    然后,添加OC中斷回調函數。值得注意的是,經過實驗證明:HAL_TIM_OC_DelayElapsedCallback與HAL_TIM_PWM_PulseFinishedCallback效果是一樣的,都是當CNT寄存器的值 = CCR比較寄存器的值時就會進入函數一次。所以,任意挑一個來使用即可。

    3.2、main.c

    還需要添加另外一個中斷回調函數HAL_TIM_PeriodElapsedCallback(),當CNT寄存器的值 = ARR寄存器的值時,進入一次回調函數。

    HAL_TIM_PeriodElapsedCallback()也可以放到tim.c里面,這個都可以的。

    四、DEBUG


    4.1、OC中斷回調函數的驗證

    HAL_TIM_OC_DelayElapsedCallback()與HAL_TIM_PWM_PulseFinishedCallback()都會獲取當前CNT寄存器的值。目的是知道產生OC中斷時,CNT寄存器當前的值時多少,從而判斷究竟是OC中斷還是溢出中斷。

    從Monitor的監控看來,Curr_CNT與OC_CNT一直都是24999,24999是CCR比較寄存器的值。并且從OC_Value與PWM_Value始終相等看來,這兩個回調函數進入的次數是一樣的。

    所以,HAL_TIM_OC_DelayElapsedCallback與HAL_TIM_PWM_PulseFinishedCallback都是當CNT的值24999等于CCR寄存器的值24999時進入一次。

    4.2、定時器溢出中斷

    從Monitor監控看來,main_Value一直在遞增,main_CNT保持0,證明每一次定時器溢出時,都會進入此中斷。

    main_CNT保持0的原因是溢出后會馬上復位CNT的值,然后才啟動溢出中斷。

    五、細節補充


  • 不要被函數HAL_TIM_PWM_PulseFinishedCallback的名字欺騙了,一開始我以為進入這個中斷回調函數時是PWM波結束(相當于PWM開始)的那個時刻(CNT = ARR),測試的結果表明并不是這樣的。反而是PWM中間的位置(CNT = CCR),占空比設置50%時)。函數HAL_TIM_PWM_PulseFinishedCallback與函數HAL_TIM_OC_DelayElapsedCallback效果一樣。

  • 計算PWM(脈沖)的數量需要在函數HAL_TIM_PeriodElapsedCallback。有一個細節需要注意,使用HAL_TIM_PeriodElapsedCallback計算PWM波數量時,會比實際的數量多1。原因是當計數初始化時也會進入一次HAL_TIM_PeriodElapsedCallback函數,這個細節需要注意一下。有一個不錯的方法可以解決這個問題,這一次實驗使用main_Value來計算PWM波的數量,main_Value的變量大小是uint32_t,所以聲明main_Value時,可以讓main_Value = 4294967295,相當于main_Value = -1,這樣就能解決PWM波多1的問題。

  • 需要弄明白以下寄存器的意義,比如CubeMX上的Counter Period相當于TIMx_ARR寄存器,Pulse相當于TIMx_CCR寄存器等。
  • 總結

    以上是生活随笔為你收集整理的STM32H743+CubeMX-定时器TIM输出PWM(PWM Generation模式)+ 中断的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。