Stm32產生兩路相位差為180度的pwm

2021-07-25 20:19:53 字數 4194 閱讀 6244

stm32產生兩路相位差為180度的pwm

by derrick wang

由於上次用高階定時器產生的兩路互補帶死區的pwm訊號不能滿足應用需求。如標題所示需要的是兩路相位差為180度的pwm訊號,占空比和頻率都是相同的,只是相位不同。仔細重讀高階定時器的資料手冊,發現產生的兩路互補訊號達不到這個要求。然後必然要考慮用兩個通道產生了(兩路互補屬於乙個通道)。仔細蒐羅最終確定了兩種發案可以實現,這兩種方式具有異曲同工之妙但也有各自的不同。相同之處在於同採用定時器計數的**對齊模式,不同就在於輸出選擇的模式不同(對tim_ccmrx暫存器中ocxm位進行配置)。 下面待我一一詳解。生成的波形圖如下:

方案一:定時器計數採用**對齊模式,兩路輸出配置為pwm的輸出比較模式。

1)配置定時器的計數器為中間對齊計數,即先向上計數再向下計數。

2)在該定時器上選擇2個通道,並分別配置為輸出比較模式,要輸出如上圖波形須把兩路輸出極性設定為不同。

3)配置自動重裝載暫存器timx_arr為要求輸出頻率的一半。

4)假定cc1為第乙個輸出訊號的通道,再假定第乙個訊號的正脈衝寬度對應為w1,則配置timx_ccr1為timx_arr-w1/2。

5) 同4),假定cc2為第二個輸出訊號的通道,正脈衝寬度對應為w2,配置timx_ccr2為w2/2。

下面我要產生頻率為50khz,占空比為20%的兩路pwm訊號。timx_arr=72000/50/2=720;

timx_ccr1=720-720*0.2=576;timx_ccr2=720*0.2=144;

為什麼這樣算請看下圖:

①和②對應得值就是576. ③和④對應得值就是144。但是他們之間的距離是相等的,也就保證了兩路pwm產生的占空比是一樣的。

具體配置**如下所示:

gpio_inittypedef gpio_initstructure2

;tim_timebaseinittypedef tim_timebasestructure

;tim_ocinittypedef tim_ocinitstructure

;rcc_apb2periphclockcmd

(rcc_apb2periph_gpioa

,enable

);rcc_apb1periphclockcmd

(rcc_apb1periph_tim3

,enable

);/********tim3_ch1 引腳配置*********/

gpio_initstructure2

.gpio_pin

=gpio_pin_6

;gpio_initstructure2

.gpio_speed

=gpio_speed_50mhz

;gpio_initstructure2

.gpio_mode

=gpio_mode_af_pp

;//設定為復用浮空輸出

gpio_init

(gpioa

,&gpio_initstructure2

);/********tim3_ch2 引腳配置*********/

gpio_initstructure2

.gpio_pin

=gpio_pin_7

;gpio_initstructure2

.gpio_speed

=gpio_speed_50mhz

;gpio_initstructure2

.gpio_mode

=gpio_mode_af_pp

;//設定為復用浮空輸出

gpio_init

(gpioa

,&gpio_initstructure2

);/************定時器基本配置***************/

tim_timebasestructure

.tim_period

=720-1

;// 自動重裝載暫存器的值

tim_timebasestructure

.tim_prescaler=0

;// 時鐘預分頻數

tim_timebasestructure

.tim_clockdivision

=tim_ckd_div1

;// 取樣分頻

tim_timebasestructure

.tim_countermode

=tim_countermode_centeraligned3

;//**對齊計數

tim_timebasestructure

.tim_repetitioncounter=0

;//重複暫存器,用於自動更新pwm占空比

tim_timebaseinit

(tim3,&

tim_timebasestructure

);/**************pwm通道1輸出配置*************/

tim_ocinitstructure

.tim_ocmode

=tim_ocmode_pwm1

;//設定為pwm1輸出模式

tim_ocinitstructure

.tim_pulse

=200

;//設定占空比時間

tim_ocinitstructure

.tim_ocpolarity

=tim_ocpolarity_low

;//設定輸出極性

tim_ocinitstructure

.tim_outputstate

=tim_outputstate_enable

;//使能該通道輸出

//    //下面幾個引數是高階定時器才會用到

//    tim_ocinitstructure.tim_ocnpolarity=tim_ocnpolarity_low;    //設定互補端輸出極性

//    tim_ocinitstructure.tim_outputnstate=tim_outputnstate_enable;//使能互補端輸出

//    tim_ocinitstructure.tim_ocidlestate=tim_ocidlestate_set;    //死區後輸出狀態

//    tim_ocinitstructure.tim_ocnidlestate=tim_ocnidlestate_set;//死區後互補端輸出狀態

tim_oc1init

(tim3

,&tim_ocinitstructure

);//按照指定引數初始化

/**************pwm通道2輸出配置*************/

tim_ocinitstructure

.tim_ocmode

=tim_ocmode_pwm2

;//設定為pwm1輸出模式

tim_ocinitstructure

.tim_pulse

=520

;//設定占空比時間

tim_ocinitstructure

.tim_ocpolarity

=tim_ocpolarity_low

;//設定輸出極性

tim_ocinitstructure

.tim_outputstate

=tim_outputstate_enable

;//使能該通道輸出

tim_oc2init

(tim3

,&tim_ocinitstructure

);tim_oc1preloadconfig

(tim3

,tim_ocpreload_enable

);//使能timx在ccr1上的預裝載暫存器

tim_arrpreloadconfig

(tim3

,enable

);//使能timx在arr上的預裝載暫存器

tim_cmd

(tim3

,enable

);//開啟tim2

tim_ctrlpwmoutputs

(tim3

,enable

);//pwm輸出使能,一定要記得開啟

stm32電機控制之控制兩路直流電機!看完你會了嗎

小車使用的電機是12v供電的直流電機,帶編碼器反饋,這樣就可以採用閉環速度控制,這裡電機使用pwm驅動,速度控制框圖如下 由以上框圖可知,stm32通過定時器模組輸出pwm波來控制兩個直流電機的轉動,通過改變pwm占空比的大小可以改變電機的轉速,由於我們的控制目標是實現電機執行在速度範圍內任意給定的...

stm32電機控制之控制兩路直流電機!看完你會了嗎

手頭上有乙個差分驅動的小車,使用兩個直流電機驅動,要實現小車的在給定速度下運動,完成直線行駛,轉向,加速,剎車等複雜運動。使用的電機是12v供電的直流電機,帶編碼器反饋,這樣就可以採用閉環速度控制,這裡電機使用pwm驅動,速度控制框圖如下 由以上框圖可知,stm32通過定時器模組輸出pwm波來控制兩...

stm32產生隨機數

stm32使用rand 函式產生隨機數,在os程式設計中會設定srand 隨機種子,其實隨機種子就是某一時候的time 的值,因為這個值不同,所以每次的隨機數都不同。那麼我們需要在stm32中模擬這樣的乙個隨機種子 1 可以採用adc取樣值,必須是乙個空腳 沒接gnd vcc 2 可以採用定時器的計...