STM32學習筆記 通用定時器的PWM介紹及配置

2021-10-04 18:21:29 字數 3953 閱讀 3109

脈衝寬度調製(pwm),是英文「pulse width modulation」的縮寫,簡稱脈寬調變,是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術。簡單一點,就是對脈衝寬度的控制。

stm32 的定時器除了 tim6 和 7。其他的定時器都可以用來產生 pwm 輸出。其中高階定時器 tim1 和 tim8 可以同時產生多達 7 路的 pwm 輸出。而通用定時器也能同時產生多達 4路的 pwm 輸出,這樣,stm32 最多可以同時產生 30 路 pwm 輸出!這裡我們僅利用 tim3的 ch2 產生一路 pwm 輸出。

配置過程

1)開啟 tim3 時鐘以及復用功能時鐘,配置 pb5 為復用輸出。

先開啟 tim3 的時鐘,然後配置 pb5 為復用輸出,這是因為 tim3_ch2 通道將重對映到 pb5 上,此時,pb5屬於復用功能輸出。庫函式使能 tim3 時鐘的方法是:

rcc_apb1periphclockcmd

(rcc_apb1periph_tim3, enable)

;//使能定時器 3 時鐘

庫函式設定 afio 時鐘的方法是:

rcc_apb2periphclockcmd

(rcc_apb2periph_afio, enable)

;//復用時鐘使能

最後設定 pb5 為復用功能輸出

列出 gpio 初始化的一行**即可:

gpio_initstructure.gpio_mode = gpio_mode_af_pp; //復用推挽輸出

2)設定 tim3_ch2 重對映到 pb5 上。

因為 tim3_ch2 預設是接在 pa7 上的,所以我們需要設定 tim3_remap 為部分重對映(通過 afio_mapr 配置),讓 tim3_ch2 重對映到 pb5 上面。在庫函式函式裡面設定重對映的函式是:

void

gpio_pinremapconfig

(uint32_t gpio_remap, functionalstate newstate);

stm32 重對映只能重對映到特定的埠。第乙個入口引數可以理解為設定重對映的型別,比如 tim3 部分重對映入口引數為gpio_partialremap_tim3。所以 tim3 部分重對映的庫函式實現方法是:

gpio_pinremapconfig

(gpio_partialremap_tim3, enable)

;

3)初始化 tim3,設定 tim3 的 arr 和 psc。在開啟了 tim3 的時鐘之後,我們要設定arr 和 psc 兩個暫存器的值來控制輸出 pwm 的

週期。當 pwm 週期太慢(低於 50hz)的時候,我們就會明顯感覺到閃爍了。因此,pwm 週期在這裡不宜設定的太小。這在庫函式是通過 tim_timebaseinit 函式實現的【參考】呼叫的格式為:

tim_timebasestructure.tim_period = arr;

//設定自動重裝載值

tim_timebasestructure.tim_prescaler =psc;

//設定預分頻值

tim_timebasestructure.tim_clockdivision =0;

//設定時鐘分割:tdts = tck_tim

tim_timebasestructure.tim_countermode = tim_countermode_up;

//向上計數模式

tim_timebaseinit

(tim3,

&tim_timebasestructure)

;//根據指定的引數初始化 timx 的

4)設定 tim3_ch2 的 pwm 模式,使能 tim3 的 ch2 輸出。在庫函式中,pwm 通道設定是通過函式tim_oc1init()~tim_oc4init()來設定的,不同的通道的設定函式不一樣,這裡我們使用的是通道 2,所以使用的函式是tim_oc2init()。

void

tim_oc2init

(tim_typedef* timx, tim_ocinittypedef* tim_ocinitstruct);

tim_ocinittypedef的定義:

typedef

struct

tim_ocinittypedef;

這裡我們講解一下與我們要求相關的幾個成員變數:

引數 tim_ocmode 設定模式是 pwm 還是輸出比較,這裡我們是 pwm 模式。

引數 tim_outputstate 用來設定比較輸出使能,也就是使能 pwm 輸出到埠。

引數 tim_ocpolarity 用來設定極性是高還是低。

其他的引數 tim_outputnstate,tim_ocnpolarity,tim_ocidlestate 和 tim_ocnidlestate 是高階定時器 tim1 和 tim8 才用到的。

要實現我們上面提到的場景,方法是:

tim_ocinittypedef tim_ocinitstructure;

tim_ocinitstructure.tim_ocmode = tim_ocmode_pwm2;

//選擇 pwm 模式 2

tim_ocinitstructure.tim_outputstate = tim_outputstate_enable;

//比較輸出使能

tim_ocinitstructure.tim_ocpolarity = tim_ocpolarity_high;

//輸出極性高

tim_oc2init

(tim3,

&tim_ocinitstructure)

;//初始化 tim3 oc2

5)使能 tim3。在完成以上設定了之後,我們需要使能 tim3。使能 tim3 的方法前面已經講解過:

tim_cmd

(tim3, enable)

;//使能 tim3

6)修改 tim3_ccr2 來控制占空比。最後,在經過以上設定之後,pwm 其實已經開始輸出了,只是其占空比和頻率都是固定

的,而我們通過修改 tim3_ccr2 則可以控制 ch2 的輸出占空比。在庫函式中,修改 tim3_ccr2 占空比的函式是:

void

tim_setcompare2

(tim_typedef* timx, uint16_t compare2);

理所當然,對於其他通道,分別有乙個函式名字,函式格式為tim_setcomparex(x=1,2,3,4)。

通過以上 6 個步驟,我們就可以控制 tim3 的 ch2 輸出 pwm 波了。

//tim3 pwm 部分初始化

//pwm 輸出初始化

//arr:自動重灌值

//psc:時鐘預分頻數

void

tim3_pwm_init

(u16 arr,u16 psc)

STM32學習 定時器(通用定時器)

如圖所示,輸出理解時注意兩種訊號ocxref和ocx,ocx是直接連到埠的訊號,ocxref是輸出控制的輸出訊號。一般在參考手冊中大多數講ocxref。ocx與ocxref可由ccxp控制是否反向,由ccxe控制訊號輸出。比較輸出功能 輸出乙個波形 指示一段給定時間已到。它的原理是通過計數器的值cn...

STM32學習筆記 通用定時器基本設定

stm32 包含11個定時器,其中tim2 tim5為通用定時器。通用定時器掛載在低速外設匯流排apb1上,其時鐘 於輸入為apb1的乙個倍頻器,只要apb1的時鐘分頻數不為1,timx的時鐘頻率就會為apb1時鐘頻率的2倍,即72mhz 配置通用定時器需要4步 以配置tim2為例 1 配置系統時鐘...

STM32定時器(TIM)之通用定時器

stm32的通用定時器有四個,分別是tim2,tim3,tim4,tim5,有以下功能 通用定時器的框圖如下 從圖中可以看出,通用定時器timx的觸發源 計數器時鐘的時鐘源 有四個 1 內部時鐘 clk int 2 外部時鐘模式1 外部輸入引腳 tix 分別經timx chx通道傳入 3 外部時鐘模...