STM32自學筆記(六)PWM輸出

2021-09-10 14:33:41 字數 3744 閱讀 5410

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.hstm32f10x_tim.c

庫函式使能tim3時鐘的方法是:

rcc_apb1periphclockcmd(rcc_apb1periph_tim3, enable); //使能定時器 3 時鐘
由於tim3_ch2通道預設為pa7,我們需要將其重對映到pb5上(因為led在pb5),此時pb5屬於復用功能輸出,配置時需注意。

庫函式使能afio時鐘

rcc_apb2periphclockcmd(rcc_apb2periph_gpiob|            //gpiob 時鐘使能

rcc_apb2periph_afio, enable); //afio復用時鐘使能

pb5配置(重複多次了,不再贅述,僅列出關鍵的一行)

gpio_initstructure.gpio_mode = gpio_mode_af_pp;  //復用推挽輸出
stm32 重對映只能重對映到特定的埠。第乙個 入口引數可以理解為設定重對映的型別,比如 tim3 部分重對映入口引數為 gpio_partialremap_tim3,這 點可以顧名思義。所以 tim3 部分重對映的庫函式實現方法是:

gpio_pinremapconfig(gpio_partialremap_tim3, enable);
生疏的話回顧定時器章節.(arrpsc需指定,用於控制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模式。需注意的是不同的通道的初始化函式不一樣,具體看下面**

tim_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

完成pwm配置後,需要使能tim3

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預裝載暫存器 使能定時器 修...