CubeIDE Note 09: Lesson 6. Tutorial of using HRTIM to generate SPWM
實作
如何使用 HRTIM產生SPWM
環境
本文使用
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
Datasheet. STM32F334x4 STM32F334x6 STM32F334x8
Section 1. 測驗題
以不同方式產生SPWM (Sinusoidal Pulse Width Modulation)波形。
A.
設定訊號產生器產生一60Hz之弦波訊號,
其振幅為0~3V(offset電壓為1.5V),並使用ADC1_IN1接收此訊號。
此外,利用HRTIM Timer Master作為中斷之觸發訊號,中斷頻率為20kHz。接下來,利用ADC1_IN1讀取外部弦波,經過計算後,
使HRTIM Timer A模組輸出SPWM訊號,
其Duty最大為90% (對應至弦波波峰),
最小為10% (對應至弦波波谷);
而Timer Master, A模組之頻率為20kHz,
CHA1與CHA2為互補訊號,deadtime為1μs。示意圖如下圖所示。
B.
不使用任何外部訊號輸入,直接由DSP內部之程式設定與撰寫,
分別輸出下列要求之SPWM訊號於CHA1與CHA2。
i. 頻率為 30Hz之 SPWM
ii. 頻率為 60Hz之 SPWM
iii. 頻率為 120Hz之 SPWM
Section 1.1 CubeMX 設定
A. 參考資料
CubeIDE Note 05: Lesson 3. HRTIM PWM Setting And Application
CubeIDE Note 06: Lesson 4. ADC Setting And Application
B. ioc檔與設定報告
- ioc檔 (for F334R8) https://drive.google.com/file/d/1aIMNGufgrGj8r0qZGsFcsuHQaNkrwy95/view?usp=sharing
- 設定報告 ( pdf )
https://drive.google.com/file/d/18ofhHn2YeyVbPZ4Tbkyv3vxyQH6AOqUT/view?usp=sharing
Section 1.2 程式撰寫
題目A
main.c
stm32f3xx_it.c
由於 fPWM 宣告在main.c裡面
如果要共用變數,必須使用extern關鍵字宣告一次
對ADC值做了縮放跟平移是為了讓duty介於 0.1 ~ 0.9 之間。
題目B
main.c
stm32f3xx_it.c
因為用到 PI 及 sin 所以要引入 math.h 函數庫
sin回傳值為double
接著利用Timer Master的中斷函數(1/20000 s觸發一次)來計時,
令一整數i來計數觸發次數,
以便重置(不重置好像也能動,只是有一天資料會溢位),
一個完整週期會觸發20000次(1s),
所以用i除以20000即可得出比例時間,
題目要求30、60、120Hz,就等於週期變為1/30、1/60、1/120,
用時間i乘上頻率即可縮短週期,
一個完整週期為2π,至於那個3π,
筆者也不知道怎麼來的,
就測量後發現用2π 做出來頻率會只有 2/3 倍,所以要修正
歡迎知道為甚麼的同學告訴我,感謝
對sin值做了縮放跟平移是為了讓duty介於 0.1 ~ 0.9 之間。
Section 1.3 實驗結果
題目A
題目B
使用低通濾波器對SPWM濾波可得到調變訊號(低頻弦波)
筆者是直接對 CHA1 並聯1顆 470uF 電容