STM32互補PWM輸出使能控制

2021-09-02 18:39:29 字數 1565 閱讀 1968

1、分享如何使用stm32的定時器互補pwm通道,驅動ipm模組產生三相相差120°的正弦波,可產生旋轉磁場驅動三相電機----

2、stm32中tim1-ch1和tim1-ch1n的區別----

3、【stm32】stm32之timer1產生pwm(互補通道)----

stm32的高階定時器tim1可以產生互補的pwm,並且可以通過相關暫存器的設定使能或關閉pwm的輸出。在編寫bldc的驅動程式時,本人利用tim1的channel1,2,3三個通道生成了三路互補的pwm波形,定時器驅動程式如下:

void tim1_init(u16 arr, u16 psc)12

3456

78910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

3536

3738

3940

4142

4344

4546

4748

4950

5152

5354

該函式配置了pwm的gpio,定時器以及死區控制等。產生的波形如圖1所示 

當我想要控制某些通道的輸出(比如使能通道1的輸出ch1,但是關閉其互補輸出ch1n),利用下面兩個函式發現tim1依舊輸出兩路互補的pwm。這個函式最終操作的暫存器是捕獲/比較使能暫存器timx->ccer。 

tim_ccxcmd(tim1, tim_channel_1, tim_ccx_enable); 

tim_ccxncmd(tim1, tim_channel_1, tim_ccxn_disable);

經過除錯發現在定時器初始化函式中乙個函式的呼叫:tim_ccpreloadcontrol(tim1,enable); 

注釋掉這句之後,或者將enable改為disable,才能實現關閉通道1的互補輸出,如圖2所示: 

此時通道1ch1輸出pwm波形,其互補通道ch1n輸出低電平。

分析發現,tim_ccpreloadcontrol()函式最終操作的是控制暫存器 2(timx_cr2)的第0位ccpc。查閱stm32的資料手冊,描述如下: 

ccpc:捕獲/比較預裝載控制位 (capture/compare preloaded control) 

0: ccxe, ccxne和ocxm位不是預裝載的; 

1: ccxe, ccxne和ocxm位是預裝載的;設定該位後,它們只在設定了com位後被更新。 

注:該位只對具有互補輸出的通道起作用。

也就是說如果使能了預裝載,只有在com事件發生後值才能寫入影子暫存器(影子暫存器才是真正起作用的暫存器),產生作用。同時該位只對互補輸出起作用,因此對於普通定時器來說,無論該位是否被設定,都有可以通過tim_ccxcmd()函式使能或者關閉pwm的輸出。

想要讓定時器的pwm輸出低電平(高電平),也可以將相對的 暫存器timx->ccr1置零(大於arr),但是此時互補通道只能為高電平(低電平)。而通過關閉pwm的輸出,可以讓兩個互補的通道輸出更多的電壓組合。

STM32輸出PWM波教程

pwm輸出配置步驟 舉例 使能定時器3和相關io口時鐘。使能定時器3時鐘 rcc apb1periphclockcmd 使能gpiob時鐘 rcc apb2periphclockcmd 初始化io口為復用功能輸出。函式 gpio init gpio initstructure.gpio mode g...

STM32的PWM輸出實驗

通過設定該暫存器 ccrx 來調整pwm輸出的占空比,如下圖所示 以通道1為例說明pwm的工作過程 首先通過設定ccr1 捕獲比較 值 暫存器 設定設定比較值。然後通過設定ccmr1 oc1m 2 0 位以及ccer cc1p位 輸入 捕獲1輸出極性 來設定高低電平的輸出模式,具體如圖所示 最後設定...

STM32 快速上手PWM輸出

在前面文章 stm32 一文搞懂通用定時器捕獲 比較通道 已經詳細介紹了輸入stm32的捕獲 比較通道,這邊文章來寫比較通道的pwm的應用。初始化io口為復用功能輸出 重對映相關引腳為pwm輸出 初始化定時器 主要是配置arr和psc 初始化通道x輸出比較引數 使能通道x預裝載暫存器 使能定時器 修...