stm32學習筆記(5):通用定時器pwm輸出
2023年3
月30日timer
輸出pwm1.
timer
輸出pwm
基本概念
脈衝寬度調製
(pwm)
,是英文「
pulse width modulation
」的縮寫,簡稱脈寬調變,是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術。簡單一點,就是對脈衝寬度的控制。一般用來控制步進電機的速度等等。
stm32
的定時器除了
tim6
和tim7
之外,其他的定時器都可以用來產生
pwm輸出,其中高階定時器
tim1
和tim8
可以同時產生7路的
pwm輸出,而通用定時器也能同時產生4路的
pwm輸出。
1.1 pwm
輸出模式
stm32
的pwm
輸出有兩種模式,模式
1和模式2,由
timx_ccmrx
暫存器中的
ocxm
位確定的(「
110」為模式1,「
111」為模式
2)。模式
1和模式
2的區別如下:
110:
pwm模式
1-在向上計數時,一旦
timx_cnt時通道
1為有效電平,否則為無效電平;在向下計數時,一旦
timx_cnt>timx_ccr1
時通道1
為無效電平
(oc1ref=0)
,否則為有效電平
(oc1ref=1)
。111
:pwm模式2
-在向上計數時,一旦
timx_cnt時通道
1為無效電平,否則為有效電平;在向下計數時,一旦
timx_cnt>timx_ccr1
時通道1
為有效電平,否則為無效電平。
由此看來,模式
1和模式
2正好互補,互為相反,所以在運用起來差別也並不太大。
而從計數模式上來看,
pwm也和
timx
在作定時器時一樣,也有向上計數模式、向下計數模式和中心對齊模式,關於
3種模式的具體資料,可以檢視《
stm32
參考手冊》的「
14.3.9 pwm
模式」一節,在此就不詳細贅述了。
1.2 pwm
輸出管腳
pwm的輸出管腳是確定好的,具體的引腳功能可以檢視《
stm32
參考手冊》的「
8.3.7
定時器復用功能重對映」一節。在此需要強調的是,不同的
timx
有分配不同的引腳,但是考慮到管腳復用功能,
stm32
提出了乙個重映像的概念,就是說通過設定某一些相關的暫存器,來使得在其他非原始指定的管腳上也能輸出
pwm。但是這些重映像的管腳也是由參考手冊給出的。比如說
tim3的第2
個通道,在沒有重映像的時候,指定的管腳是
pa.7
,如果設定部分重映像之後,
tim3_ch2
的輸出就被對映到
pb.5
上了,如果設定了完全重映像的話,
tim3_ch2
的輸出就被對映到
pc.7
上了。1.3
pwm輸出訊號
pwm輸出的是乙個方波訊號,訊號的頻率是由
timx
的時鐘頻率和
timx_arr
預分頻器所決定的,具體設定方法在前面乙個學習筆記中有詳細的交代。而輸出訊號的占空比則是由
timx_crrx
暫存器確定的。其公式為「占空比
=(timx_crrx/timx_arr)*100%
」,因此,可以通過向
crr中填入適當的數來輸出自己所需的頻率和占空比的方波訊號。
2. timer
輸出pwm
實現步驟
1. 設定
rcc時鐘;
2. 設定
gpio
時鐘;3.
設定timx
定時器的相關暫存器;
4. 設定
timx
定時器的
pwm相關暫存器。第1
步設定rcc
時鐘已經在前文中給出了詳細的**,在此就不再多說了。需要注意的是通用定時器
timx
是由apb1
提供時鐘,而
gpio
則是由apb2
提供時鐘。注意,如果需要對
pwm的輸出進行重映像的話,還需要開啟引腳復用時鐘
afio。第
2步設定
gpio
時鐘時,
gpio
模式應該設定為復用推挽輸出
gpio_mode_af_pp
,如果需要引腳重映像的話,則需要用
gpio_pinremapconfig()
函式進行設定。第3
步設定timx
定時器的相關暫存器時,和前一篇學習筆記一樣,設定好相關的
timx
的時鐘和技術模式等等。具體設定參看「
timer
基本定時功能」的學習筆記。第4
步設定pwm
相關暫存器,首先要設定
pwm模式(預設情況下
pwm是凍結的),然後設定占空比(根據前面所述公式進行計算),再設定輸出比較極性:當設定為
high
時,輸出訊號不反相,當設定為
low時,輸出訊號反相之後再輸出。最重要是是要使能
timx
的輸出狀態和使能
timx
的pwm
輸出使能。
相關設定完成之後,就可以通過
tim_cmd()
來開啟timx
定時器,從而得到
pwm輸出了。
3. timer
輸出pwm
源**由於我現在手上的奮鬥開發板是將
pb.5
接到led
上,因此需要使用
tim3
的ch2
通道,並且要進行引腳重映像。開啟
tim3
之後,pwm
輸出,使得
led點亮,通過改變
pwm_cfg()
中的占空比可以調節
led的亮度。
#include "stm32f10x_lib.h"
void rcc_cfg();
void gpio_cfg();
void timer_cfg();
void pwm_cfg(); //
占空比,取值範圍為
0-100
int dutyfactor = 50;
int main()
void rcc_cfg()
//開啟
tim3
的時鐘 rcc_apb1periphclockcmd(rcc_apb1periph_tim3,enable);
//開啟gpiob
的時鐘和復用功能
rcc_apb2periphclockcmd(rcc_apb2periph_gpiob | rcc_apb2periph_afio,enable); }
void gpio_cfg()
void timer_cfg()
void pwm_cfg()
stm32通用定時器
stm32的定時器是個強大的模組,定時器使用的頻率也是很高的,定時器可以做一些基本的定時,還可以做pwm輸出或者輸入捕獲功能。時鐘源問題 名為timx的有八個,其中tim1和tim8掛在apb2匯流排上,而tim2 tim7則掛在 apb1匯流排上。其中tim1 tim8稱為高階控制定時器 adva...
STM32通用定時器配置
stm32通用定時器配置 一 stm32 通用定時器原理 stm32 系列的cpu 有多達8 個定時器,其中tim1 和tim8 是能夠產生三對pwm 互補輸出的高階定時器,常用於三相電機的驅動,它們的時鐘由apb2 的輸出產生。其它6 個為普通定時器,時鐘由apb1 的輸出產生。下圖是stm32參...
STM32 通用定時器基本定時功能
1.stm32的timer簡介 stm32中一共有11個定時器,其中2個高階控制定時器,4個普通定時器和2個基本定時器,以及2個看門狗定時器和1個系統嘀嗒定時器。其中系統嘀嗒定時器是前文中所描述的systick,看門狗定時器以後再詳細研究。今天主要是研究剩下的8個定時器。定時器計數器解析度 計數器型...