CubeIDE Note 05: Lesson 3. HRTIM PWM Setting And Application for LL Library

Hsueh-Ju Wu 吳學儒
STM32CubeIDE
Published in
16 min readJun 7, 2021

教學

如何使用 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

https://www.st.com/resource/en/user_manual/dm00610707-description-of-stm32g4-hal-and-lowlayer-drivers--stmicroelectronics.pdf

RM0364. STM32F334xx advanced Arm®-based 32-bit MCUs

https://www.st.com/resource/en/reference_manual/dm00093941-stm32f334xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf

UM1735. Discovery kit for STM32F3 series with STM32F334C8 MCU

https://www.st.com/resource/en/user_manual/dm00108524--discovery-kit-for-stm32f3-series-with-stm32f334c8-mcu-stmicroelectronics.pdf

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

https://blog.csdn.net/Simon223/article/details/104574222

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 模組圖(RM0364. p. 630)

HRTIM 與 TI系列產生PWM的方式不同,
HRTIM Counter 只會上數,
使用Timer Master做觸發來驅動Timer A~E 產生任意PWM波形

有很多奇特的模組可以用,
做到各種事件處理 ex. Blanking Time

有興趣請參考手冊與各種網路教學文

RM0364. STM32F334xx advanced Arm®-based 32-bit MCUs

https://www.st.com/resource/en/reference_manual/dm00093941-stm32f334xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf

【STM32H7教程】第63章 STM32H7的高分辨率定时器HRTIM基础知识和HAL库API — CSDN

https://blog.csdn.net/Simon223/article/details/104574222

A. PWM 頻率計算

HRTIM 參數介紹(RM0364. p. 632)
HRTIM 解析度 (RM0364. p. 632)

看得很亂對不對,大家應該只想關注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 計算

Deadtime clock(RM0364. p. 633)
Deadtime 計算方式(RM0364. p. 650)

R : Rising, F: Falling

Deadtime 解析度(RM0364. p. 651)

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

Deadtime插入模式介紹 (RM0364. p. 650)

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

AN4539. p 35

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 與 頻率週期驗證

Appendix. 延伸介紹

HRTIM PWM Burst Mode(輕載模式)使用

--

--