STM32之定時器 例項

2021-07-16 09:40:43 字數 4875 閱讀 2758

pwm輸出例項:

pwm在電力電子技術中佔據著重要的地位,被廣泛地用在逆變電路之中。利用stm32定時器的pwm輸出功能,可以直接獲取pwm波。根據面積等效原理,利用規則取樣法、查表法可以調製出spwm波及各種調製pwm波形。

這裡實現的是輸入占空比固定的pwm波形

ps:

通用定時器tim3產生4路不同占空比的pwm波。(僅僅適合本例項))

tim3 channel1 duty cycle = (tim3_ccr1/ tim3_arr)* 100 = 50%

tim3 channel2 duty cycle = (tim3_ccr2/ tim3_arr)* 100 = 37.5%

tim3 channel3 duty cycle = (tim3_ccr3/ tim3_arr)* 100 = 25%

tim3 channel4 duty cycle = (tim3_ccr4/ tim3_arr)* 100 = 12.5%

main函式:

int main(void) }

main函式十分簡單,呼叫 tim3_pwm_init()把tim初始化成pwm輸出模式後,核心就把所有的工作都交給tim外設,完全有tim來控制gpio引腳輸出pwm波.

定時器初始化:

void tim3_pwm_init(void)

呼叫tim3_gpio_config()作為tim外設通道復用的gpio引腳進行初始化,再呼叫tim3_mode_config()對tim外設進行初始化.

gpio初始化:

static void tim3_gpio_config(void)

使能了tim3外設的時鐘,並對tim3通道相應的gpio引腳作了相應的配置,使能gpio時鐘,分別是pa6、pa7、pb0和pb1。它們被配置為復用輸出,翻轉速率為50mhz。

(關於tim3通道的gpio引腳對映可以在《stm32 資料手冊》的引腳定義表找到,gpio復用模式配置可從《stm32 參考手冊》的gpio章節找到)

tim引腳定義

tim模式配置

定時器3模式初始化:

static void tim3_mode_config(void)

這個配置可以分為3部分,分別為時基初始化,輸出模式初始化和裝載捕獲、比較暫存器的數值。

時基初始化:

使用了乙個tim_timebaseinittypedef型別的結構體。時基初始化,即配置基本定時器只具有的那部分功能

tim_timebasestructure.tim_period = 999;

定時週期,實質就是儲存到過載暫存器 timx——arr的數值,脈衝計數器從0累加到這個值上溢或從這個值下溢。這個數值加1然後乘以時鐘源週期就是實際定時週期。

這裡設定為999,所以定時週期為(999+1)*t,t為時鐘源週期

tim_timebasestructure.tim_prescaler = 0;

對定時器時鐘timxclk的預分頻值,分頻後作為脈衝計數器timx_cnt的驅動時鐘,得到脈衝計數器的時鐘頻率為:f ck_cnt=f timx_clk /(n+1),其中n為賦給本成員的是時鐘分頻值.

這裡設定為0,就是不對timxclk分頻,例如:已知ahb時鐘頻率為72mhz、timxclk為72mhz,所以輸出到脈衝計數器timx_cnt的時鐘頻率為 f ck_cnt =72mhz/1=72mhz。

tim_timebasestructure.tim_clockdivision = tim_ckd_div1;

時鐘分頻因子,這個tim_clockdivision和tim_prescaler分頻是不一樣的,tim_prescaler分頻配置是對timx_clk進行分頻,分頻後的時鐘被輸出到脈衝計數器timx_cnt,而tim_clockdivision雖然也是對timxclk進行分頻,但它分頻後的時鐘頻率為f dts,是被輸出到定時器的etrp數字濾波器部分,會影響濾波器的取樣頻率.tim_clockdivision可以被配置為1分頻(f dts = f timxclk),2分頻和四分頻,etrp數字濾波器的作用是對外部時鐘timxetr進行濾波.

這裡只使用了內部時鐘 timxclk作為定時器時鐘源,所以配置 tim_clockdivision為任何值都無影響.

tim_timebasestructure.tim_countermode = tim_countermode_up;

脈衝計數器 timx_cnt的計數模式,分別有向上計數,向下計數,**對齊模式.

向上計數:timx_cnt從0向上累加到tim_period中的值(過載暫存器timx_arr的值),產生上溢事件;

向下計數:timxcnt 從tim_period的值累減至0,產生下溢事件;

**對齊模式:向上,向下計數的合體,timxcnt從0累加到tim_period的值減1時,產生乙個上溢事件,然後向下計數到1時,產生乙個計數器下溢事件,再從0開始重新計數,一直迴圈.

這裡是配置成 tim_countermode_up(向上計數模式)

填充完配置引數後,呼叫庫函式tim_timebaseinit()把這些控制引數寫到暫存器中,定時器的時基配置就完成了。

輸出模式配置:

通用定時器的輸出模式由 tim_ocinittypedef型別結構體來配置.

tim_ocinitstructure.tim_ocmode = tim_ocmode_pwm1;

輸出模式配置,主要使用的為pwm1和pwm2模式。

pw1模式:在向上計數時,當timx_cnt小於(不知道為什麼要用中文小於才能顯示下面其他內容)timx_ccrn(比較暫存器,其數值等於tim_pulse成員的內容)時,通道n輸出為有效電平,否則為無效電平,向下計數時,當timx_cnt>timx_ccrn時通道n為無效電平,否則為有效電平.pwm2模式和pwm1模式相反.

(其中的有效電平好無效電平並不是固定對應高電平和低電平,也是需要配置的)

這裡使用了pwm1模式.

tim_ocinitstructure.tim_outputstate = tim_outputstate_enable;

配置輸出模式的狀態或關閉輸出.

這裡配置成tim_outputstate_enable(使能輸出)

tim_ocinitstructure.tim_ocpolarity = tim_ocpolarity_high;

有效電平的極性,把pwm模式中的有效電平設定為高電平或低電平.

這裡是配置成tim_ocpolarity_high(有效電平為高電平),因為在上面把輸出模式配置為pwm1模式,向上計數,所以在timx_cnt小於timx_ccrn時,通過到n輸出為高電平,否則為低電平.

tim_ocinitstructure. = ccr1_val;

跳動,即為比較暫存器 timx_ccr的數值,當脈衝計數器 timx_cnt與 timx_ccr的比較結果發生變化時,輸出脈衝將發生變化.

這裡向1,2,3,4通道的tim_pulse分別賦值為500,375,250,125,定時器向上計數,pwm1模式,有效高電平為高,定時週期為1000(tim_period=999),所以當timx_cnt計數值小於 tim_pulse值時,輸出高電平,否則為低電平,即各通道輸出pwm的占空比為d=tim_pulse/(tim_period+1),即分別為 50%、37.5%、25%、12.5%。

填充完輸出模式初始化結構體後,要呼叫輸出模式初始化函式tim_ocxinit()對各個通道進行初始化(x表示定時器的通道).如tim_oc1init()是用來初始化定時器的通道1的,tim_oc2init()是用來初始化定時器的通道2的.

ps:

呼叫各個通道初始化函式前,需要對初始化結構體的 tim_pulse重新賦值,因為這裡的成員配置都一樣,而占空比是不同的.

最後使用了tim_ocxpreloadconfig()配置了各通道的比較暫存器tim_ccr 預裝載使能,使用 tim_arrpreloadconfig()把過載暫存器 timx_arr使能,最後用 tim_cmd()使能定時器 tim3,定時器外設就開始工作了.

ps:

總結以下定時器的配置:

1,設定tim訊號週期;

2,設定tim預分頻值(tim_prescaler);

3,設定tim分頻係數(tim_clockdivision);

4,設定tim計數模式;

5,根據tim_timebaseinitstruct這個結構體裡面的值初始化tim;

6,設定tim的oc模式;

7,tim的輸出使能;

8,設定電平跳變值;

9,設定pwm訊號的極性;

10,使能tim訊號通道;

11,使能tim比較暫存器ccrx過載;

12,使能tim過載暫存器arr;

13,使能tim計數器;

這個例項輸出的為占空比固定的pwm波,如果想利用定時器輸出spwm波,就需要不斷改變pwm的占空比,可以利用庫函式tim_setcompare()查表修改比較暫存器中的值(就是脈衝寬度)來實現.

STM32之定時器

stm32f4的定時器分布如下 其中基本定時器包括tim6 tim7,其結構最簡單,也具有最基本的定時功能,一是用於基本定時 產生時基 二是用於驅動dac數模轉換器。其中通用定時器包括time2 time5,time9 time14共10個 通用定時器除了包含基本定時器的功能外還有輸入捕獲 輸出比較...

stm32關定時器 STM32定時器TIM3程式

include led.h include delay.h include key.h include sys.h include usart.h include timer.h stm32開發板實驗8 定時器中斷實驗 int main void delay init 延時函式初始化 nvic co...

STM32之SysTick定時器

systick 作業系統的心跳 systick是系統滴答定時器,可以說是作業系統的的 心跳 它被綁在nvic中,用於產生systick異常 異常號 15 一旦產生systick異常,就會產生滴答中斷,這個滴答中斷對作業系統尤其重要。例如 作業系統可以為多個任務分配不同數目的時間片,確保沒有乙個任務霸...