PWM,Pulse Width Modulation,即脈衝寬度調製,就是利用定時器的計數功能實現對模擬輸出的控制,可以產生周期和佔空比可調的信號輸出。連續輸出的話就會產生方波,周期由自動重裝載值ARR(TIMx_ARR)決定,佔空比由捕獲/比較寄存器(TIMx_CCR1~4)值決定。除了基本定時器TIM6、TIM7,其他定時器(通用、高級)都有PWM輸出功能。
在介紹如果進行脈寬調製之前,先介紹幾個重要的寄存器:
1、TIMx_CNT定時器計數器:存儲了當前定時器的計數值
2、TIMx_ARR自動重裝載寄存器:例如向上計數時當CNT從0計數到自動重裝載值ARR就會重新從0計數;向下計數時,就CNT從ARR計數到0時又重新從ARR往下計數;
3、TIMx_PSC預分頻寄存器:決定CNT計數頻率;
4、TIMx_CCMR1/2捕獲 /比較模式寄存器:OCxM設置PWM模式1或2(110/111)
5、TIMx_CCR1~4捕獲/比較寄存器:與CNT比較,決定輸出高/低電平,控制佔空比。
6、TIMx_CCER捕獲 /比較使能寄存器:CC1P位:輸入/捕獲1輸出極性。0:高電平有效,1:低電平有效。
舉例:設置向上計數,CC1P為0(高電平有效),PWM模式1,那麼可以得到下圖:
PWM輸出配置過程:
1、使能定時器時鐘,和對應GPIO時鐘;
2、初始化I/O:
GPIO_Init();//模式設置為GPIO_Mode_AF_PP
3、重映射還需使能AFIO時鐘,和設置部分或完全重映射;
4、初始化定時器:ARR,PSC等:TIM_TimeBaseInit();
5、設置PWM模式及通道方向、極性等:
6、使能定時器:如TIM_Cmd(TIM3, ENABLE); //使能 TIM3
7、使能預裝載寄存器: 如TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
8、可以實時修改佔空比:TIM_SetComparex(x=1,2,3,4);