CubeIDE Note 05: Lesson 3. HRTIM PWM Setting And Application for LL Library
教學
如何使用 CubeIDE 設定 HRTIM (High-resolution timer) 及 PWM (Pulse-Width Modulation) 基本應用
環境
本文使用
OS: Windows x64
STM32CubeIDE Version: 1.6.1
開發板: NUCLEO-F334R8(STM32F334R8)
Low-Layer (LL) Library
教學文章列表
參考資料
UM2570. Description of STM32G4 HAL and low-layer drivers
RM0364. STM32F334xx advanced Arm®-based 32-bit MCUs
UM1735. Discovery kit for STM32F3 series with STM32F334C8 MCU
AN4539. HRTIM 指南
(中文)
https://www.st.com/resource/zh/application_note/dm00121475-hrtim-cookbook-stmicroelectronics.pdf
(英文)
https://www.st.com/resource/en/application_note/dm00121475-hrtim-cookbook-stmicroelectronics.pdf
【STM32H7教程】第63章 STM32H7的高分辨率定时器HRTIM基础知识和HAL库API — CSDN
Section 1. 基本題
使用HRTIM之Timer A、Timer B與Timer C模組,
每一模組產生兩互補訊號,
分別為HRTIM_CHx1與HRTIM_CHx2 切換頻率皆為20kHz。
此外,請設定PB10為input功能接收訊號。
A. 當PB10 接收低電位(0訊號時), 輸出以下Duty cycle與dead time設定。
B. 當PB10 接收高電位(1訊號時), 輸出以下Duty cycle與dead time設定。
Section 1.1 HRTIM 原理介紹
HRTIM 與 TI系列產生PWM的方式不同,
HRTIM Counter 只會上數,
使用Timer Master做觸發來驅動Timer A~E 產生任意PWM波形
有很多奇特的模組可以用,
做到各種事件處理 ex. Blanking Time
有興趣請參考手冊與各種網路教學文
RM0364. STM32F334xx advanced Arm®-based 32-bit MCUs
【STM32H7教程】第63章 STM32H7的高分辨率定时器HRTIM基础知识和HAL库API — CSDN
A. PWM 頻率計算
看得很亂對不對,大家應該只想關注PWM頻率該如何計算設定
筆者已幫大家統整出一個簡單的公式即可算出頻率或Counter設定值(tick)
tick即為我們等等要設進去HRTIM Counter的值,我們來試算一下
HRTIM 解析度表中寫到 Prescaling ratio = 1時,
Min PWM Frequency = 70.3 kHz
這是由於HRTIM Counter (tick)最大值為 65503 (0xFFDF)
我們用 f_HRCK = 4.603GHz 除以 65503 即可得到 f_PWM = 70.3kHz
或者用 Resolution = 217ps 代入
也可以得到 f_PWM =1 / (65503 * Resolution) = 70.3kHz
基本題要求的 f_PWM =20kHz我們也可來計算一下,
由表可知道,Prescaling ratio = 4時,Min PWM Frequency = 17.6 kHz
(如果用更小的除頻數,會設不出來20kHz)
所以我們等等設定要先將Prescaling ratio 設為 4(除頻越小可保精度)
此時 f_HRCK = 1.152 GHz,
則所需
tick = 1.152GHz / 20kHz = 57600
B. Deadtime 計算
R : Rising, F: Falling
Deadtime計算方式也跟PWM頻率雷同
筆者統整的公式:
基本上也是先看需求多少的deadtime,決定需要的Prescaling ratio再計算tick
基本題要求1us, 2us, 3us,
為了方便計算,我們使用統一的DTPRSC = 011 (Prescaling ratio = 1)
得到以下tick值
tick_1us = 1us / 6.94ns = 144.09,取整數 = 144
tick_2us = 2us / 6.94ns = 288.18,取整數 = 288
tick_3us = 3us / 6.94ns = 432.28,取整數 = 432
Section 1.2 CubeMX 設定
Step 1. 請先按照此篇教學(選對開發板)做好基礎設定
Step 2. 把需要的IO設定好
A. GPIO部分可參閱這篇教學,把PB10設定好
B. HRTIM PWM 輸出教學
B.1 輸出映射設定
首先切換到HRTIM設定,Mode區塊中打開Timer A, B, C三模組各兩組輸出
把 Disable改為 Tx1 and Tx2 outputs active
此時可看到對應的IO腳位已被自動開啟
再切換到 Clock Configuration
可看到HRTIM1時脈設定已被開啟
我們把它的選擇線調到 PLLCLK*2
讓 HRTIM1 時脈為 144 MHz
B.2 頻率設定
之後我們來設定Timer A, B, C模組頻率
切換到HRTIM設定,Configuration區塊中 Timer A分頁
Time Base Setting
- 選擇 Prescaler Ratio = 4 (Multiplied by 8)選項
- Period 輸入剛剛計算的 57600
即可看到下方計算出的頻率為20000 Hz
B.3 計數器設定
Timing Unit
- Preload Enable: Enable
- Repetition Update: Enable
- Deadtime insertion: Deadtime is inserted between output 1 and 2
跟普通Timer不一樣沒有Auto Reload,
所以使用Repetition來做 Update Counter觸發,
Repetition Counter是一個可以計算經過多少完整PWM週期後觸發的計數器
預設Deadtime insertion: Output 1 and 2 signals are independent
是不使用deadtime的意思
設為Deadtime is inserted between output 1 and 2 後
這塊控制板特色之一
開啟 Deadtime後,兩輸出通道會自動互補
也就是等等只需要設定Output 1的行為模式,
Output 2會自動互補不需再設定行為
B.4 比較器設定
Timer A 的 CHA1 輸出 Duty 要求 20%
我們可以這樣偷懶設定,記得後方格式設定要選為No Check
其實週期也可以用變數名稱代替
在程式裡面一次做設定也可以
就不用記那麼長串數字了
B.5 Deadtime設定
Dead Time Configuration 改為 Enable後就會自動跑出其餘設定項
Dead Time
-Dead Time Configuration
- Prescaler
- Rising Value
- Falling Value
照Section 1.1 節推導的結果設定即可
Rising Sign 與 Falling Sign 是決定 Deadtime 補的方向
可參照 Section 1.1 Deadtime插入模式介紹 (RM0364. p. 650)
B.6 輸出行為設定
開啟 Deadtime後,兩輸出通道會自動互補
所以我們只需要設定Output 1 的行為即可,
ST提供多種的Set 源與 Reset 源,
來讓我們做到各種奇怪的波形產生,
根據需求設定即可,
目前我們只需要一個Set與一個Reset源:
Timer 計數器週期更新時,Output 1 Set
Timer 計數器觸發 CMP1(0.2週期),Output 1 Reset
則Output 2不需做任何設定將自動與Output 1互補
到此Timer A設定完成,Timer B 與 Timer C 同學按照上述步驟自行設定。
Step 3. 改用LL函數庫
Step 4. 按下Generate Code,產生程式框架
提供 ioc檔與設定報告供大家參考核對設定
- ioc檔https://drive.google.com/file/d/1aIMNGufgrGj8r0qZGsFcsuHQaNkrwy95/view?usp=sharing
- 設定報告( pdf )
https://drive.google.com/file/d/18ofhHn2YeyVbPZ4Tbkyv3vxyQH6AOqUT/view?usp=sharing
Section 1.3 程式碼撰寫
main.c
跟Timer用法一樣,記得要Enable Counter不然他不會開始計數
還要多Enable Output才會開始輸出
至於要用的參數可以在Source Code或手冊UM2570裡找到
這裡是改比較器值的方法,同場加映暫存器寫法,擇一使用即可
Section 1.4 實驗結果
可看到頻率與週期非常精準,Deadtime精度也相當高
(筆者家示波器量測Duty真的怪怪的XD
A. Timer A 輸出(Duty = 20%; Deadtime = 1us)
B. Timer B 輸出(Duty = 50%; Deadtime = 2us)
C. Timer C 輸出(Duty = 70%; Deadtime = 2us)
Section 2. 進階題
使用 HRTIM 之 Timer Master、Timer A、Timer B 與 Timer C 模組,
產生三相 Interleaved PWM 波形,每組PWM之相位差為120度,
且Timer A之Duty為20%、Timer B之Duty為50%、Timer C之Duty為70%;
切換頻率皆為50kHz。
Section 2.1 CubeMX 設定
基本上設定按照基本題即可,
本題將教大家如何使用 Timer Master 進行同步,
做到三相 Interleaved PWM 波形
Step 1. 啟用 Timer Master
不需做輸出設定,因 Timer Master 只做同步訊號用,它沒有輸出腳位
在 Mode 區塊把 Master Timer Enable 打勾
Step 2. 頻率設定
Time Base Setting
- 選擇 Prescaler Ratio = 2(Multiplied by 16)選項
- Period 輸入 PWM_PERIOD ( 46080= 2.304GHz / 50kHz)
教大家怎麼用變數(Variable)或宏(Marco)當作設定參數,
記得用No Check 不然會沒辦法設定
Step 3. 計數器設定
Timing Unit
- Preload Enable: Enable
- Repetition Update: Enable
Stpe 4. 比較器設定
我們使用Timer Master來做同步訊號,
因為要做三相,所以
CMP1 設定在 120度,即 1/3 週期
CMP2 設定在 240度,即 2/3 週期
Stpe 5. Reset Trigger設定
Timer A 保持原本相位不動
Timer B 要延遲 1/3 週期,
Reset Trigger 設為 Timer Master 的 CMP1
Timer C 要延遲 2/3 週期,
Reset Trigger 設為 Timer Master 的 CMP2
Reset 示意圖
參考資料:
https://www.st.com/resource/en/application_note/dm00121475-hrtim-cookbook-stmicroelectronics.pdf
Step 6. Timer A, B, C 之 設定
Time Base Setting
- 選擇 Prescaler Ratio = 2(Multiplied by 16)選項
- Period 輸入 PWM_PERIOD ( 46080= 2.304GHz / 50kHz)Timing Unit
- Preload Enable: Enable
- Repetition Update: Enable
本題沒有deadtime要求,可不設方便觀察波形
最後, Duty 設定按照基本題步驟即可
Step 7. 放心Generate Code吧
提供 ioc檔與設定報告供大家參考核對設定
- ioc檔
https://drive.google.com/file/d/1W0zkxuWyhtNvvxE3G3S-dLRwcxi2yDvj/view?usp=sharing- 設定報告( pdf )
https://drive.google.com/file/d/1dq5hpcBlGtB05DbW4Dmzv_Llg6ILPZMA/view?usp=sharing
Section 2.2 程式碼撰寫
main.c
我們剛剛是用變數(Variable)或宏(Marco)當作設定參數,
所以現在得補上宣告
這種用法須注意initial函數不可被宣告為static
有用到的函數紅框設定不可打勾
宏(Marco)
變數(Variable)
以上擇一即可,就可以一次改變所有參數,加快速度
記得把 Timer Master 的 Counter Enable才會有作用喔
Section 2.3 實驗結果
由於筆者家示波器只有兩通道,
只能這樣展示波形給大家看XDD
可看到
Timer A 領先 Timer B 波形 6.7us ( 1 / 3 週期),
Timer A 領先 Timer C 波形 13.3us ( 2 / 3 週期),結果正確
Duty 與 頻率週期驗證