stm32 的定時器除了 tim6 和 7。其他的定時器都可以用來產生 pwm 輸出。其中高階定 時器 tim1 和 tim8 可以同時產生多達 7 路的 pwm 輸出。而通用定時器也能同時產生多達 4 路的 pwm 輸出,這樣,stm32 最多可以同時產生 30 路 pwm 輸出。
用到3個暫存器:捕獲/比較模式暫存器 (timx_ccmr1/2
)、捕獲/比較使能暫存器(timx_ccer
)、捕獲/比較暫存器(timx_ccr1~4
)。
此暫存器有兩個,其中timx_ccmr1
控制ch1和ch2;timx_ccmr2
控制ch3和ch4;
bit6~4為模式設定位ocxm,總共可以配置成 7 種模式。pwm模式需要將其設定為 110 / 111.區別是輸出電平的極性相反
在下文pwm配置過程中進行如下設定即可
此暫存器控制著各個輸入輸出通道的開關。tim_ocinitstructure.tim_ocpolarity = tim_ocpolarity_high; //輸出極性高
tim_ocinitstructure.tim_ocpolarity = tim_ocpolarity_low; //輸出極性低
我們這裡只用到了cc2e
位,為輸入/捕獲使能位。要想pwm從io口輸出,必須把這個位設定為1.
在下文pwm配置過程中進行如下設定即可
tim_ocinitstructure.tim_outputstate = tim_outputstate_enable; //比較輸出使能
此暫存器有4個,對應4個通道 ch1~4。4個暫存器幾乎一樣,這裡僅以timx_ccr1
為例進行介紹
將timx_ccr1
的值與timx_cnt
的值進行比較,決定輸出的是高電平還是低電平,實現pwm波的輸出。
(回顧下定時器章節內容,timx_cnt
為16位自動裝載計數器。)
通過修改timx_ccr1
的值,控制pwm的輸出脈寬。
直接呼叫庫函式tim_setcomparex
(x=1,2,3,4)進行ccr暫存器值的修改,下面為通道2的示例
void tim_setcompare2(tim_typedef* timx, uint16_t compare2);
直接呼叫庫函式tim_getcapturex
(x=1,2,3,4)進行ccr暫存器值的讀取,下面為通道2的示例
void tim_getcapture2(tim_typedef* timx, uint16_t compare2);
tips:1.tim3_ch1
~tim3_ch4
分別接在 pa6、pa7、pb0 和 pb1 上,需要重對映進行修改
2. pwm 相關的函式設定在庫函式檔案stm32f10x_tim.h
和stm32f10x_tim.c
庫函式使能tim3時鐘的方法是:
rcc_apb1periphclockcmd(rcc_apb1periph_tim3, enable); //使能定時器 3 時鐘
由於tim3_ch2
通道預設為pa7
,我們需要將其重對映到pb5
上(因為led在pb5),此時pb5
屬於復用功能輸出,配置時需注意。
庫函式使能afio
時鐘
pb5配置(重複多次了,不再贅述,僅列出關鍵的一行)rcc_apb2periphclockcmd(rcc_apb2periph_gpiob| //gpiob 時鐘使能
rcc_apb2periph_afio, enable); //afio復用時鐘使能
gpio_initstructure.gpio_mode = gpio_mode_af_pp; //復用推挽輸出
stm32 重對映只能重對映到特定的埠。第乙個 入口引數可以理解為設定重對映的型別,比如 tim3 部分重對映入口引數為 gpio_partialremap_tim3,這 點可以顧名思義。所以 tim3 部分重對映的庫函式實現方法是:
gpio_pinremapconfig(gpio_partialremap_tim3, enable);
生疏的話回顧定時器章節.(arr
與psc
需指定,用於控制pwm的週期)
接下來,要把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 的
tim3_ch2
設定為pwm模式。需注意的是不同的通道的初始化函式不一樣,具體看下面**
完成pwm配置後,需要使能tim3tim_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_oc1init()~tim_oc4init()
tim_oc2init(tim3, &tim_ocinitstructure); //初始化 tim3 oc2
tim_cmd(tim3, enable); //使能 tim3
通過上述設定後,pwm已經開始輸出了,只不過占空比和頻率都是固定的。我們通過修改tim3_ccr2
則可以控制 ch2 的輸出占空比.
tim_setcompare2(tim3,pwmval);
其中pwmval
即為賦給tim3_ccr2
的值
void tim3_pwm_init(u16 arr,u16 psc)
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輸出極性 來設定高低電平的輸出模式,具體如圖所示 最後設定...
STM32 快速上手PWM輸出
在前面文章 stm32 一文搞懂通用定時器捕獲 比較通道 已經詳細介紹了輸入stm32的捕獲 比較通道,這邊文章來寫比較通道的pwm的應用。初始化io口為復用功能輸出 重對映相關引腳為pwm輸出 初始化定時器 主要是配置arr和psc 初始化通道x輸出比較引數 使能通道x預裝載暫存器 使能定時器 修...