stm32——pwm基本知識及配置過程
stm32——pwm基本知識及配置過程
將通用定時器分為四個部分:
1,選擇時鐘
2,時基電路
3,輸入捕獲
4,輸出比較
本節定時器pwm輸出主要涉及到定時器框圖右下方部分,即輸出比較部分
什麼是pwm
脈衝寬度調製(pwm),是英文「pulse width modulation」的縮寫,簡稱脈寬調變,是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術,廣泛應用在從測量、通訊到功率控制與變換的許多領域中。
pwm工作過程
每個定時器有四個通道,每乙個通道都有乙個捕獲比較暫存器,
將暫存器值和計數器值比較,通過比較結果輸出高低電平,實現pwm訊號
先簡單說明一下:
如圖為向上計數:
定時器重裝載值為arr,比較值ccrx
t時刻對計數器值和比較值進行比較
如果計數器值小於ccrx值,輸出低電平
如果計數器值大於ccrx值,輸出高電平
pwm的乙個週期
定時器從0開始向上計數
當0-t1段,定時器計數器timx_cnt值小於ccrx值,輸出低電平
t1-t2段,定時器計數器timx_cnt值大於ccrx值,輸出高電平
當timx_cnt值達到arr時,定時器溢位,重新向上計數...迴圈此過程
至此乙個pwm週期完成
影響因素
arr : 決定pwm週期(在時鐘頻率一定的情況下,當前為預設內部時鐘ck_int)
ccrx : 決定pwm占空比(高低電平所佔整個週期比例)
pwm工作過程(以通道1為例)
1,timx_ccmr1暫存器的oc1m[2:0]位,設定輸出模式控制器
110:pwm模式1
111:pwm模式2
2,計數器值timx_cnt與通道1捕獲比較暫存器ccr1進行比較,通過比較結果輸出有效電平和無效電平
oc1ref=0 無效電平
oc1ref=1 無效電平
3,通過輸出模式控制器產生的訊號
timx_ccer暫存器的cc1p位,設定輸入/捕獲通道1輸出極性
0:高電平有效
1:低電平有效
4,timx_ccer:cc1e位控制輸出使能電路,訊號由此輸出到對應引腳
0:關閉
1:開啟
pwm如何輸出高低電平
計數器值timx_cnt與捕獲比較暫存器值ccrx比較後,最終輸出高電平還是低電平,
由timx_ccmr1:oc1m位和timx_ccer:cc1p位共同決定
1,timx_ccmr1暫存器的oc1m[2:0]位,設定pwm模式1或模式2
通過設定模式1或模式2,決定了比較結果輸出有效或無效電平
2,timx_ccer暫存器的cc1p位,設定輸入/捕獲通道1輸出極性
通過設定輸出極性,確定有效或無效電平為最終輸出的高電平或低電平
總結:模式1:
cntccr為無效電平 //(oc1ref = 0)
模式2:
cntccr為有效電平 //(oc1ref = 1)
cc1p:
0:高電平有效
1:低電平有效
pwm模式配置
tim_oc1preloadconfig函式:
作用:tim_ccmrx暫存器ocxpe位使能相應的預裝在暫存器
void tim_oc1preloadconfig(tim_typedef* timx, uint16_t tim_ocpreload);
tim_arrpreloadconfig函式:
作用:操作timx_cr1暫存器arpe位,使能自動重裝載的預裝載暫存器
void tim_arrpreloadconfig(tim_typedef* timx, functionalstate newstate);
arpe的使能-arr變更生效配置
arpe=1,arr立即生效
arpe=0,arr下週期生效
定時器3輸出通道引腳
定時器3的4個通道對應的引腳及重對映
pwm輸出庫函式
1,定時器通道初始化-tim_oc1init
經過上面的講解,我們知道了要想使用pwm需要配置
配置引數對應框圖位置如下:
1,timx_ccmr1暫存器的oc1m[2:0]位,設定輸出模式控制器
2,timx_ccer暫存器的cc1p位,設定輸入/捕獲通道1輸出極性
3,timx_ccer:cc1e位控制輸出使能電路,訊號由此輸出到對應引腳
初始化定時器輸出比較通道
void tim_oc1init(tim_typedef* timx, tim_ocinittypedef* tim_ocinitstruct);
1tim_ocinittypedef結構體
typedef struct
tim_ocinittypedef;
2,設定比較值函式-tim_setcompare1
作用:外部改變tim_pulse值,即改變ccr的值
void tim_setcompare1(tim_typedef* timx, uint16_t compare1);
13,使能輸出比較預裝載-tim_oc1preloadconfig
作用:tim_ccmrx暫存器ocxpe位使能相應的預裝在暫存器
void tim_oc1preloadconfig(tim_typedef* timx, uint16_t tim_ocpreload);
14,使能自動重裝載的預裝載暫存器允許位-tim_arrpreloadconfig
作用:操作timx_cr1暫存器arpe位,使能自動重裝載的預裝載暫存器
void tim_arrpreloadconfig(tim_typedef* timx, functionalstate newstate);
5,修改通道極性
作用:操作timx_ccer的cc1p位,修改通道極性
void tim_oc1npolarityconfig(tim_typedef* timx, uint16_t tim_ocnpolarity);
1pwm輸出實驗
使用定時器3初始pwm訊號,輸出占空比可變的pwm波驅動led(pb5引腳),實現led亮度變換
led:低電平點亮,高電平熄滅,占空比越大,乙個週期中高電平持續時間越長,亮度越大,反之越暗.
查詢手冊pb5引腳為定時器3的通道2,需要部分重對映
pwm輸出實驗步驟
1,使能定時器3和相關io時鐘(led-pb5)
使能定時器3時鐘:rcc_apb1periphclockcmd();
使能gpiob時鐘:rcc_apb2periphclockcmd();
2,初始化io口為復用功能輸出 gpio_init();
gpio_initstructure.gpio_mode = gpio_mode_af_pp;
3,pb5輸出pwm(定時器3通道2),需要部分衝突對映
rcc_apb2periphclockcmd(rcc_apb2periph_afio,enable);//開啟afio時鐘設定
gpio_pinremapconfig(gpio_partialremap_tim3, enable);//部分重對映
4,初始化定時器 (重裝載值arr,與分頻係數psc等)
tim_timebaseinit();//決定pwm週期
5,初始化輸出比較引數:
tim_oc2init();//通道2輸出比較初始化
6,使能預裝載暫存器
tim_oc2preloadconfig(tim3, tim_ocpreload_enable);//定時器3 通道2
7,使能定時器
tim_cmd();
8,不斷改變比較值ccrx,達到不同的占空比效果
tim_setcompare2(); //通道2,改變比較值ccrx
**實現
基於 定時器中斷實驗 **進行編寫
timer.h新增pwm初始化函式定義 void tim3_pwm_init(u16 arr,u16 psc);
#ifndef __timer_h
#define __timer_h
#include "sys.h"
void tim3_pwm_init(u16 arr,u16 psc);
#endif
timer.c 實現定時器pwm初始化函式
#include "timer.h"
//tim3 pwm初始化
//arr 重裝載值
//psc 預分頻係數
void tim3_pwm_init(u16 arr,u16 psc)
主程式的設計:
進行pwm的設定
tim_setcompare2(tim3,led0pwmval); //改變比較值tim3->ccr2達到調節占空比的效果
int main(void)
}//此處led0pwmval值最大可以設定到899,輸出pwm波基本全為1,大小隨意設定。
STM32 PWM輸出相關配置介紹
2018 4 21 stm32 1.pwm 脈衝寬度調製 通過數字輸出對模擬量進行控制 2.tim x 定時器,在stm32中存在8個 3.tim oc 實現輸出比較功能 4.pwmval 占空比 2.具體配置流程 1,介紹 作為pwm除了基本定時器沒有通道,通用暫存器有4道,高階暫存器有7道 2....
STM32 PWM原理總結
pwm的工作原理 假如我們要讓乙個led燈由暗到亮,就需要不斷的改變ccrx的值,也就是改變占空比。如果我們改變led燈由暗到亮的速度,我們就需要改變arr的值。pwm配置相關暫存器 使用通用定時器的pwm功能,除了配置一般定時器的方式之外,還需要三種暫存器來控制 捕獲 比較暫存器 timx ccr...
STM32 PWM控制詳解
include sys.h 定時器3,可產生四路的pwm輸出,四個通道分別對應的引腳情況如下 tim3 ch1,tim3 ch2,tim3 ch3,tim3 ch4 沒有重映像的對應情況 pa6,pa7,pb0,pb1 部分重映像 pb4,pb5,pb0,pb1 完全重映像 pc6,pc7,pc8,...