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(相當于脈沖)給步進電機,從而計算步進電機的步距角,有時候也需要計算電平翻轉的次數。
二、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的值,然后才啟動溢出中斷。
五、細節補充
總結
以上是生活随笔為你收集整理的STM32H743+CubeMX-定时器TIM输出PWM(PWM Generation模式)+ 中断的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何实现轮播图的内容的多少随div的大小
- 下一篇: 《计算机应用基础》18春作业,【北语网院