stm32 生成PWM信號

STM32的通用定時器和高級定時器都能產生PWM信號,其中每個高級定時器可以產生7路的PWM(有3對是可以互補的),每個通用定時器都能產生4路PWM,這樣算下來,STM32f103系列最多能產生30路PWM。
其實用庫函數配置STM32並不難,可以很容易就生成PWM信號,但是如果想要了解深入一些,至少要大概知道某些比較重要的參數是由哪幾個寄存器控制,這樣其實在項目開發中調試起來也要有頭緒一些。
這裏就用高級定時器TIM1舉例,產生一組互補帶死區的PWM信號,如果高級定時器弄清楚了通用定時器更就不在話下了。爲了便於總結,我事先寫好了一個程序,用KEIL軟件進行調試,然後看寄存器的值,這樣更直觀一些。從這個圖上可以看出高級定時器一共有20個寄存器,其中CCMR1_Output和CCMR1_Input是一個寄存器,CCMR2_Output和CCMR2_Input是一個寄存器,這裏只是分開表示。
這裏寫圖片描述

ARR(auto-reload register)自動重裝載寄存器,當定時器的時鐘開啓時這個值就默認爲0xFFFF,圖裏的0x000004AF是程序裏配置的,一個PWM脈衝週期爲1200(這個1200只是一個計數值,不是實際的時間值)
PSC(prescaler)預分頻寄存器,存儲的是預分頻值,這裏分頻值爲3
PWM的頻率爲72M/(1200*3)=20KHz
CCMR1(Capture/Comprare Mode register)捕獲/比較模式寄存器,這個寄存器配置成了0x00006868,根據這個CCMR寄存器定義圖我們來分析在這個寄存器裏主要完成了哪些事:
這裏寫圖片描述
這裏寫圖片描述
1)CC1S 這兩位配置爲00,說明通道1被配置成輸出模式;
2)OC1FE 這個位是用來加快觸發響應的,暫且不管它;
3)OC1PE這個位配置爲1開啓TIMx_CCR1寄存器的預裝載功能,讀寫操作僅對預裝載寄存器操作,TIMx_CCR1的預裝載值在更新事件到來時被加載至當前寄存器中;
4)OC1M這三位配置爲110, 說明我們配置成了PWM模式1: 在向上計數時,一旦TIMx_CNT < TIMx_CCR1時通道1爲有效電平,否則爲無效電平;在向下計數時,一旦TIMx_CNT>TIMx_CCR1時通道1爲無效電平(OC1REF=0),否則爲有效電平(OC1REF=1)。
這裏寫圖片描述
CCER(Capture/Compare Enable Register)捕獲比較使能寄存器配置爲0x00000055,結合上面的定義圖,可以看出:
1)CC1E這一位配置爲1,通道1配置爲輸出;
2)CC1P配置爲0,在這裏定義高電平爲有效電平(這裏就是對CCMR寄存器裏的有效電平做了定義,就是上一頁標紅色的地方)
CC1NE和CC1NP分別是配置通道1的互補輸出和有效電平。
其他通道以此類推
這裏寫圖片描述
BDTR(Break and Dead-time Register)剎車和死區寄存器配置
DTG這8位定義了互補信號之間的死區時間;
DTG[7:5]=0xx => DT=DTG[7:0] * TDTS;
DTG[7:5]=10x => DT=(64+DTG[5:0]) * 2 * TDTS;
DTG[7:5]=110 => DT=(32+DTG[4:0]) * 8 * TDTS; DTG[7:5]=111 => DT=(32+DTG[4:0]) * 16 * TDTS;
TDTS是多少呢,要在另一個寄存器裏配置
這裏寫圖片描述
CR1(Control Register)控制寄存器1配置爲0x00000001,對照上面這個定義我們來分析:
1)CEN位爲1,使能了計數器,這個不用過多解釋;
2) UDIS爲0,允許更新事件;
3)URS是跟中斷或DMA有關,這裏沒用到暫不提;
4)OPM爲0,更新事件時計數器不停(如果我們只需要單脈衝就要讓計數器停止了)
5)DIR爲0,計數器爲向上計數模式;
這裏寫圖片描述
6)CMS這兩位爲00,邊沿對齊模式;
7) CKD這兩位爲00, 00: TDTS = 定時器頻率
這個TDTS就是之前BDTR裏控制死區時間的時間因子
CCR用來控制佔空比
CNT用是計數器的值
SR是狀態寄存器用來標記當前發生的事件或中斷

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章