脈沖寬度調(diào)制(PWM),是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調(diào)制,是利用微處理器的數(shù)字輸出來對模擬電路進行控制的一種非常有效的技術(shù)。簡單一點,就是對脈沖寬度的控制。
STM32的定時器除了TIM6和7。其他的定時器都可以用來產(chǎn)生PWM輸出。其中高級定時器TIM1和TIM8可以同時產(chǎn)生多達7路的PWM輸出。而通用定時器也能同時產(chǎn)生多達4路的PWM輸出,這樣,STM32最多可以同時產(chǎn)生30路PWM輸出!
要使STM32的通用定時器TIMx產(chǎn)生PWM輸出,我們會用到3個寄存器來控制PWM。這三個寄存器分別是:捕獲/比較模式寄存器(TIMx_CCMR1/2)、捕獲/比較使能寄存器(TIMx_CCER)、捕獲/比較寄存器(TIMx_CCR1~4)。(注意,還有個TIMx的ARR寄存器是用來控制pwm的輸出頻率)
首先是捕獲/比較模式寄存器(TIMx_CCMR1/2),該寄存器總共有2個,TIMx _CCMR1和TIMx _CCMR2。TIMx_CCMR1控制CH1和2,而TIMx_CCMR2控制CH3和4。
其次是捕獲/比較使能寄存器(TIMx_CCER),該寄存器控制著各個輸入輸出通道的開關(guān)。
最后是捕獲/比較寄存器(TIMx_CCR1~4),該寄存器總共有4個,對應(yīng)4個輸通道CH1~4。4個寄存器都差不多,這個寄存器就是用來設(shè)置pwm的占空比的。
上面提到的,TIMx_ARR寄存器是用來設(shè)置pwm的頻率的,那么它的原理是怎樣的呢?TIM_Period(即是TIMx_ARR寄存器的值) 的大小實際上表示的是需要經(jīng)過TIM_Period 次計數(shù)后才會發(fā)生一次更新或中斷。接下來需要設(shè)置時鐘預(yù)分頻數(shù)TIM_Prescaler,這里有一個公式,我們舉例來說明:例如時鐘頻率=72MHZ/(時鐘預(yù)分頻+1)。(假設(shè)72MHZ為系統(tǒng)運行的頻率,這里的時鐘頻率即是產(chǎn)生這個pwm的時鐘的頻率)說明當前設(shè)置的這個TIM_Prescaler,直接決定定時器的時鐘頻率。
通俗點說,就是一秒鐘能計數(shù)多少次。比如算出來的時鐘頻率是2000,也就是一秒鐘會計數(shù)2000 次,而此時如果TIM_Period 設(shè)置為4000,即4000 次計數(shù)后就會中斷一次。由于時鐘頻率是一秒鐘計數(shù)2000 次,因此只要2 秒鐘,就會中斷一次。