脈沖寬度調制(PWM),是英文“ Pulse Width Modulation”的縮寫,簡稱脈寬調制,是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術。簡單一點,就是對脈沖寬度的控制。
STM32 的定時器除了 TIM6 和7。其他的定時器都可以用來產生PWM 輸出。其中高級定
時器TIM1 和 TIM8 可以同時產生多達 7 路的 PWM輸出。而通用定時器也能同時產生多達4路的PWM 輸出,這樣, STM32 最多可以同時產生 30路 PWM 輸出!這里我們僅使用 TIM1的CH1 產生一路 PWM 輸出。要使STM32 的高級定時器 TIM1 產生 PWM 輸出,除了上一章介紹的幾個寄存器( ARR、PSC、CR1 等) 外,我們還會用到 4 個寄存器(通用定時器則只要 3 個),來控制 PWM 的輸出。這四個寄存器分別是[size=+0]:[size=+0]捕獲/比較模式寄存器(TIMx_CCMR1/2)、捕獲/比較使能寄存器(TIMx_CCER)、捕獲/比較寄存器( TIMx_CCR1~4) 以及剎車和死區寄存器(TIMx_BDTR)。
接下來我們簡單介紹一下這四個寄存器。
首先是捕獲/比較模式寄存器(TIMx_CCMR1/2),該寄存器總共有 2 個, TIMx _CCMR1和TIMx _CCMR2。 TIMx_CCMR1 控制 CH1 和 2,而 TIMx_CCMR2 控制 CH3 和4這里我們需要說明的是模式設置位OCxM,此部分由3 位組成。總共可以配置成 7種模式,我們使用的是 PWM 模式,這 3 位必須設置為110/111。這兩種PWM 模式的區別就是輸出電平的極性相反。 另外 CCxS 用于設置通道的方向(輸入/輸出)默認設置為0,就是設置通道作為輸出使用。

接下來,我們介紹捕獲/比較使能寄存器(TIMx_CCER),該寄存器控制著各個輸入輸出通道的開關。該寄存器的各位描述如圖13.1.2 所示:

圖 13.1.2 TIMx_ CCER寄存器各位描述該寄存器比較簡單,我們這里只用到了CC1E 位,該位是輸入/捕獲 1 輸出使能位,要想PWM從 IO 口輸出,這個位必須設置為 1,所以我們需要設置該位為 1。該寄存器更詳細的介紹了,請參考《STM32 參考手冊》第 250 頁, 最后,我們介紹一下捕獲/比較寄存器(TIMx_CCR1~4),該寄存器總共有 4 個,對應 4 個輸通道CH1~4。因為這 4 個寄存器都差不多,我們僅以 TIMx_CCR1 為例介紹,該寄存器的各

注意:如果只是普通定時器,只需要配置三個寄存器
捕獲/比較模式寄存器(TIMx_CCMR1/2)、捕獲/比較使能寄存器(TIMx_CCER)、捕獲/比較寄存器(TIMx_CCR1~4)。
對于高級定時器1,8還需要配置剎車和死區寄存器(TIMx_BDTR)。對于高級定時器我們只需要關注MOE:主輸出使能,必須置1,否則不能夠輸出。
TIM1 單路PWM的配置 1.開啟TIM1定時器時鐘,配置PA8為復用輸出(說明PA8不再是簡單的IO口,而是做定時器用了,注意IO輸出最大為50MHZ)有一點要注意,定時器的時鐘不是直接來自APB1或APB2,而是來自于輸入為APB1或APB2的一個倍頻器,當APB1的預分頻系數為1時,這個倍頻器不起作用,定時器的時鐘頻率等于APB1的頻率;當 APB1的預分頻系數為其它數值(即預分頻系數為2、4、8或16)時,這個倍頻器起作用,定時器的時鐘頻率等于APB1的頻率兩倍。 庫函數使能TIM3的方法: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); PA8的復用功能配置 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復用推挽輸出 2.在開啟了TIM1時鐘后就需要設置ARR,PSC,通過設置這兩個值來控制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(TIM1, &TIM_TimeBaseStructure); //根據指定的參數初始化TIMx 的
3)設置 TIM1_CH1 的 PWM 模式及通道方向,使能 TIM1 的 CH1 輸出。
接下來,我們要設置 TIM1_CH1 為 PWM 模式(默認是凍結的),因為我們的 DS0 是低電
平亮,而我們希望當 CCR1 的值小的時候, DS0 就暗, CCR1 值大的時候, DS0 就亮,所以我
們要通過配置 TIM1_CCMR1 的相關位來控制 TIM1_CH1 的模式。在庫函數中, PWM 通道設
置是通過函數 TIM_OC1Init()~TIM_OC4Init()來設置的,不同的通道的設置函數不一樣,這里我
們使用的是通道 1,所以使用的函數是TIM_OC1Init()。 void TIM——OC1Init(TIM_TypeDef*TIMx,TIM_OCInitTypeDef*TIM_OCInitStructure)
這種初始化格式大家學到這里應該也熟悉了,所以我們直接來看看結構體 TIM_OCInitTypeDef
的定義:
typedef struct
{
uint16_t TIM_OCMode;
uint16_t TIM_OutputState;
uint16_t TIM_OutputNState; */
uint16_t TIM_Pulse;
uint16_t TIM_OCPolarity;
uint16_t TIM_OCNPolarity;
uint16_t TIM_OCIdleState;
uint16_t TIM_OCNIdleState;
}TIM_OCInitTypeDef;
參數 TIM_OCMode 設置模式是 PWM 還是輸出比較,這里我們是 PWM 模式。
參數 TIM_OutputState 用來設置比較輸出使能,也就是使能 PWM 輸出到端口。
參數 TIM_OCPolarity 用來設置極性是高還是低。
其他的參數 TIM_OutputNState, TIM_OCNPolarity, TIM_OCIdleState 和TIM_OCNIdleState 是
高級定時器 TIM1 和 TIM8 才用到的。
要實現我們上面提到的場景,方法是:
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(TIM1, &TIM_OCInitStructure); //初始化 TIM1OC1
4)使能 TIM1。
在完成以上設置了之后,我們需要使能 TIM1。使能 TIM1 的方法前面已經講解過:
TIM_Cmd(TIM1, ENABLE); //使能 TIM1
5)設置 MOE 輸出,使能 PWM 輸出。
普通定時器在完成以上設置了之后,就可以輸出 PWM 了,但是高級定時器,我們還需要
使能剎車和死區寄存器(TIM1_BDTR)的 MOE 位,以使能整個 OCx(即 PWM)輸出。 庫函
數的設置函數為:【這個配置只用于定時器1與定時器8兩個高級定時器,一般的定時不要配置這兩個】
TIM_CtrlPWMOutputs(TIM1,ENABLE);//MOE 主輸出使能
6)修改 TIM1_CCR1 來控制占空比。
最后,在經過以上設置之后, PWM 其實已經開始輸出了,只是其占空比和頻率都是固定
的,而我們通過修改 TIM1_CCR1 則可以控制 CH1 的輸出占空比。繼而控制 DS0 的亮度。
在庫函數中,修改 TIM1_CCR1 占空比的函數是:
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
理所當然,對于其他通道,分別有一個函數名字,函數格式為TIM_SetComparex(x=1,2,3,4);
PWM占空比,周期計算
下面的這個是stm32的定時器邏輯圖,上來有助于理解: 
TIM3的ARR寄存器和PSC寄存器, 確定PWM頻率。
這里配置的這兩個定時器確定了PWM的頻率,我的理解是:PWM的周期(頻率)就是ARR寄存器值與PSC寄存器值相乘得來,但不是簡單意義上的相乘,例如要設置PWM的頻率參考上次通用定時器中設置溢出時間的算法,例如輸出100HZ頻率的PWM,首先,確定TIMx的時鐘,除非APB1的時鐘分頻數設置為1,否則通用定時器TIMx的時鐘是APB1時鐘的2倍,這時的TIMx時鐘為72MHz,用這個TIMx時鐘72MHz除以(PSC+1),得到定時器每隔多少秒漲一次,這里給PSC賦7199,計算得定時器每隔0.0001秒漲一次,即此時頻率為10KHz,再把這個值乘以(ARR+1)得出PWM頻率,假如ARR值為0,即0.0001*(0+1),則輸出PWM頻率為10KHz,再假如輸出頻率為100Hz的PWM,則將ARR寄存器設置為99即可。如果想調整PWM占空比精度,則只需降低PSC寄存器的值即可。 TIMx_CCRx寄存器,
確定PWM的占空比。
TIMx_CCR1—TIMx_CCR4確定定時器的CH1—CH4四路PWM的占空比。直接給該寄存器賦0—65535值即可確定占空比。占空比計算方法:TIMx_CCRx的值除以ARR寄存器的值即為占空比,因為占空比在0—100%之間,所以一般TIMx_CCRx寄存器值不能超過ARR寄存器的值,否則可能會引起PWM的頻率或占空比的準確性。
|