官方解釋:pwm訊號一般指脈衝寬度調製。脈衝寬度調製是一種模擬控制方式,根據相應載荷的變化來調製電晶體基極或mos管柵極的偏置,來實現電晶體或mos管導通時間的改變,從而實現開關穩壓電源輸出的改變。這種方式能使電源的輸出電壓在工作條件變化時保持恆定,是利用微處理器的數碼訊號對模擬電路進行控制的一種非常有效的技術。
stm32 的定時器除了 tim6 和 7。其他的定時器都可以用來產生 pwm 輸出。其中高階定
時器 tim1 和 tim8 可以同時產生多達 7 路的 pwm 輸出。而通用定時器也能同時產生多達 4
路的 pwm 輸出,這樣,stm32 最多可以同時產生 30 路 pwm 輸出!(cope過來的)由於資源和時間有限,所以我這裡拿stm32f103來做這個訊號的輸出。emmmm,這邊我用tm3的ch2輸出一路pwm。
首先說的是控制暫存器 1(timx_cr1),它的樣子大概是這樣的:
位15:10:是6個保留位,始終讀為0。
ckd[1:0]:定時器時鐘頻率在數字濾波器使用的取樣頻率之間的分頻比例。(總的來說就是分頻係數)。
arpe:自動重裝載預裝載的允許位。
cms:選擇**對齊模式。
dir:控制計數器的計算方向。
opm:單脈衝模式。
urs:更新請求源位。
udis:禁止(允許)更新位。
cen:禁止(使能)計數器。
cc4of:捕獲/比較4重複捕獲標記。
cc3of:捕獲/比較3重複捕獲標記。
cc2of:捕獲/比較2重複捕獲標記。
cc1of:捕獲/比較1重複捕獲標記,僅當相應的通道被配置為輸入捕獲時,該標記可由硬體置』1』。寫』0』可清除該位。
tif:觸發器中斷標記,當發生觸發事件(當從模式控制器處於除門控模式外的其它模式時,在trgi輸入端檢測到有效邊沿,或門控模式下的任一邊沿)時由硬體對該位置』1』。它由軟體清』0』。
cc4if:捕獲/比較4 中斷標記。
cc3if:捕獲/比較3 中斷標記。
cc2if:捕獲/比較2 中斷標記。
cc1if:捕獲/比較1 中斷標記。
uif:更新中斷標記。
這個暫存器前面那些什麼標記啊什麼都不用管,這裡主要是了解uif這一位,當產生更新事件時該位由硬體置』1』。它由軟體清』0』。也就是說它為0時是無中斷產生的。
了解了上面暫存器的配置就可以對定時器進行配置了,但要想實現pwm的輸出,還有另外幾個暫存器需要配置。
第乙個是是捕獲/比較模式暫存器(timx_ccmr1/2),該暫存器總共有 2 個,timx _ccmr1
和 timx _ccmr2。timx_ccmr1 控制 ch1 和 ch2 ,而 timx_ccmr2 控制 ch3 和 ch4 。
他有兩個模式,所以在不同模式下同乙個位可能會有不同的作用。這裡我們只需要配置ocxm(至於是1還是2就要看你使用的pwm模式是1還2了)。我們使用的是 pwm 模式,所以這 3 位必須設定為 110/111。這兩種主要就是輸出極性相反。
接著是捕獲/比較使能暫存器(timx_ccer),該暫存器控制著各個輸入輸出通道的開關。
這裡我們只用到了 cc2e 位,該位是輸入/捕獲 2 輸出使能位,要想pwm 從 io 口輸出,這個位必須設定為 1,所以我們需要設定該位為 1。
最後是捕獲/比較暫存器(timx_ccr1~4),該暫存器總共有 4 個,對應 4 個
輸通道 ch1~4。我這裡只有timx_ccr1的圖,其實它裡面都是一樣的:
在輸出模式下,該暫存器的值與 cnt 的值比較,根據比較結果產生相應動作。利用這點,我們通過修改這個暫存器的值,就可以控制 pwm 的輸出脈寬了。
如果要用到重對映的功能還需要配置復用重對映和除錯 io 配置暫存器(afio_mapr)
因為我不用這個功能,所以我就不配置了。
接下來就是**實現了,首先呢,是開啟tim3的時鐘和pa7的時鐘:
rcc_apb1periphclockcmd
(rcc_apb1periph_tim3,enable)
;rcc_apb2periphclockcmd
(rcc_apb2periph_gpioa,enable)
;
因為tim3是在apb1匯流排上,所以tim3的時鐘初始化要使用rcc_apb1periphclockcmd()函式,pa7是在apb2匯流排上的。接著是對pa7的配置:
gpio_initstructure.gpio_pin = gpio_pin_7;
gpio_initstructure.gpio_mode = gpio_mode_af_pp;
gpio_initstructure.gpio_speed = gpio_speed_50mhz;
gpio_init
(gpioa,
&gpio_initstructure)
;
對tim3的配置:
tim_timebasestructure.tim_period = arr;
tim_timebasestructure.tim_prescaler =psc;
tim_timebasestructure.tim_clockdivision =0;
//不分頻
tim_timebasestructure.tim_countermode = tim_countermode_up;
//向上計數
tim_timebaseinit
(tim3,
&tim_timebasestructure)
; tim_ocinitstructure.tim_ocmode = tim_ocmode_pwm2;
//模式2
tim_ocinitstructure.tim_outputstate = tim_outputstate_enable;
//輸出比較使能
tim_ocinitstructure.tim_pulse =0;
//設定待裝入捕獲比較暫存器的脈衝值
tim_ocinitstructure.tim_ocpolarity = tim_ocpolarity_high;
//輸出比較極性高
tim_oc1init
(tim3,
&tim_ocinitstructure)
;
使能輸出:
tim_ctrlpwmoutputs
(tim3,enable)
;//moe 主輸出使能
tim_oc2preloadconfig
(tim3, tim_ocpreload_enable)
;//ch2預裝載使能
tim_arrpreloadconfig
(tim3, enable)
;//tim3使能
tim_cmd
(tim3, enable)
;
以上就配置完了pwm的輸出,至於占空比的設定,這裡有乙個函式可以調節占空比:
void tim_setcompare2(tim_typedef* timx, uint16_t compare2)這個函式在stm32f10x_tim.c檔案中,如果設定成這樣tim_setcompare2(tim3, 0)則會輸出3.3v,好了pwm的輸出就到這裡了。謝謝大家的**。
下面是完整的**:
void
tim3_ch2_pwm_init
(u16 arr,u16 psc)
STM32 實現PWM 庫函式版
tim1和tim7沒有pwm輸出 tim0和tim8 有七路pwm輸出 27 14 通用定時器 都有4個 pwm 44 16 一共有30個pwm輸出 圖中,我們假定定時器工作在向上計數 pwm 模式,且當 cnt ccrx 時輸出 1。那麼就可以得到如上的 pwm示意圖 當 cnt 值小於 ccrx...
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輸出極性 來設定高低電平的輸出模式,具體如圖所示 最後設定...