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 可以採用定時器的計...