CubeIDE Note 07: Lesson 5. COMP & DAC Setting And Application for HAL Library

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

教學

如何使用 CubeIDE 設定 Comparator 與 DAC 基本應用

環境

本文使用
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

Datasheet. STM32F334x4 STM32F334x6 STM32F334x8

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

Section 1. 基本題

使用訊號產生器,產生頻率為60Hz之弦波,訊號電壓之振幅為0~3V。
使用COMP2之V+作為訊號輸入腳位,
並使用DAC1輸出1.5V內部連接給COMP2之V-作為比較閾值。
開啟COMP2之輸出觀察其波形。

Section 1.1 原理介紹

ADC讀值加上程式判斷也可做到一樣的效果
這邊會教同學使用比較器的原因是
ADC運作需要通過CPU運算轉換
比較器不像ADC還需要CPU參與
比較器本身是實體模組,動作肯定較迅速
很適合拿來做一些電路保護

A. COMP 內部訊號連接

B. DAC 介紹

DAC 輸出電壓 = V_DDA * DOR/4096
DOR = DAC 輸出電壓 / 3.3 * 4096

來試算一下,題目要求之DAC輸出電壓 1.5 V,所需要的DOR

DOR_1.5V = 1.5 / 3.3 *4096 = 1862

Section 1.2 CubeMX 設定

Step 1. 請先按照此篇教學(選對開發板)做好基礎設定

Step 2. 把需要的IO設定好

A. 設定DAC

Mode
- 打勾 OUT1 Configuration
其餘維持預設即可

B. 設定 COMP2

Mode
- 打勾 Input[+]
- Input [-] 選擇 DAC1 OUT1
- 打勾 External Output (以便觀察波形,如果不需要可不開)

其他維持預設即可

可看到對應的Pin腳已被開啟

設定就這樣而已,是不是很簡單呢

Step 3. 使用HAL函數庫

COMP 跟 DAC 在使用上通常不會在運行中改變值
只有做一開始初始化設定
較不易產生效率問題,所以使用HAL庫即可

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 程式撰寫

程式碼撰寫也很簡單
只需要寫入DAC DOR暫存器的值並啟動即可

main.c

通常這種設定會寫在相關模組的initial 函數中

A. DAC1 初始化

按住Crtl 點擊 MX_DAC1_Init() 即可轉跳到函數宣告位置
在/* USER CODE BEGIN DAC1_Init 2 */ /* USER CODE END DAC1_Init 2 */

HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1 ,DAC_ALIGN_12B_R, 1862);
HAL_DAC_Start(&hdac1, DAC_CHANNEL_1); //啟用模組

之間插入兩行代碼如下所示即可

B. COMP2 初始化

按住Crtl 點擊 MX_COMP2_Init() 即可轉跳到函數宣告位置
在/* USER CODE BEGIN COMP2_Init 2 */
/* USER CODE END COMP2_Init 2 */之間加上

//啟用模組
HAL_COMP_Start(&hcomp2);

Section 1.4 實驗結果

如果是使用 NUCLEO-F334R8 記得把背面的 SB63 焊接起來
不然會測不到訊號

A. CH1(黃色): V+ 輸入弦波,CH2(藍色): V- DAC輸出

DAC輸出1.58V比原本設定的1.5V高了一些
可以再針對設定值做一些修正

B. CH1(黃色): V+ 輸入弦波,CH2(藍色): 比較器輸出

Section 2. 進階題

承接範例題之設定與配置,使用HRTIM Timer C模組,
設定為互補模式並產生切換頻率20kHz,deadtime為1us之 PWM 訊號。
設定 COMP2 為外部事件觸發Timer C中斷,
此時CHC1 之 Duty cycle為10%;
接下來,利用Timer Master中斷,並設定中斷頻率為20kHz,
將CHC1之Duty cycle於下一次 Timer C 中斷前,
線性增加至90%。(CHC2則由90%降至10%),示意圖如下圖所示。

Section 2.1 CubeMX 設定

本節著重在外部事件觸發HRTIM中斷做設定教學
基本設定請參考Lesson 3.內容,就不多贅述
請先設定好頻率與輸出相關設定,再進行以下設定

Step 1. 設定外部事件通道

切換到 External Event Configuration
外部事件Mapping與關係可參考 Section 1.1.A Table. 86

External Event 6: Enable
Event Sensivity: Rising Edge
Event Filter: fSAMPLING = fEEVS div 8, N = 6
其他維持預設即可

這裡的 Filter 是拿來抗雜訊使用,應該是取平均方式
fSAMPLING 是對外部事件訊號的取樣頻率,N是取樣次數
如果直接使用 COMP2 中斷,應該沒有這個抗雜訊的功能
可能會造成誤觸發,同學也可試試看把這項停用
看看會發生甚麼事情

Step 2. 設定Timer C 擷取外部事件

切換到Timer C設定頁

Capture Unit 1: Enable
Trigger Sources Selection: 1
Trigger Source: External Event 6

Interrupt Request Source: Timer Capture 1

到此就設定完成,可以透過External Event 6 觸發 Timer C 中斷了

Step 3. 記得去NVIC開啟中斷函數,還有修改LL庫

Step 4. Generate Code

- ioc檔https://drive.google.com/file/d/1aIMNGufgrGj8r0qZGsFcsuHQaNkrwy95/view?usp=sharing

- 設定報告( pdf )
https://drive.google.com/file/d/18ofhHn2YeyVbPZ4Tbkyv3vxyQH6AOqUT/view?usp=sharing

Section 2.2 程式撰寫

main.c

該開的記得要開 (參照基本題開啟DAC及COMP)

stm32f3xx_it.c

Section 2.3 實驗結果

可看到COMP2 OUT剛起來時CHC1 Duty 很小
隨時間軸移動Duty 越來越大
直到COMP2 OUT再次起來又被重置
筆者波形有點醜,因為示波器記憶體深度不夠所以失真了XD

CH1(黃色): CHC1 PWM,CH2(藍色): COMP2 OUT

--

--