STM32學習筆記(10)——高級定時器TIM


前排提示:本筆記參考了野火PPT的大部分內容。

STM32F103系列有8個定時器,其中分為2個高級定時器,4個通用定時器、2個基本定時器。

下面為高級定時器TIM功能框圖(來自野火PPT),由於高級定時器功能相當復雜,因此本文將大篇幅介紹每種功能(定時、輸入捕獲、輸出比較、剎車輸入)。我們將功能框圖分為6個部分進行講解:

image

一、時鍾源

本部分內容可見STM32中文參考手冊13.3.4時鍾選擇

計數器時鍾可由內部時鍾源(CK_INT)、外部時鍾模式1(外部的GPIO TIx(x = 1、2、3、4))、外部時鍾模式2(外部的GPIO ETR)、內部觸發模式(ITRx)提供。無論是由什么時鍾源提供,最終都會成為CK_PSC,經過預分頻器,成為計數器時鍾。

1. 內部時鍾源

我們最常用的是內部時鍾源,通常的頻率為72MHz。這個數字是怎么來的呢?

內部時鍾源來自 RCC 時鍾的 TIMx_CLK,可以查看 STM32 的時鍾樹,它是經過 APB2 預分頻器后得到的,如果預分頻因子等於 1,則時鍾頻率x 1,否則頻率x 2。由於經過 APB1 和 APB2 預分頻后得到的 PCLK1 和 PCLK2 的最大頻率為 36MHz,且庫函數中的預分頻因子為2,所以最后的TIMx_CLK = 72MHz。

2. 外部時鍾模式 1

本內容我們分為以下部分進行講解,如圖所示:

image

(1)時鍾輸入引腳

時鍾輸入引腳對應於GPIO TIx,也就是對應 TIMx_CH1/2/3/4,具體由寄存器TIMx_CCMR1/2的位CCxS[1:0]來控制。下面是引腳的分布情況:

image

TIMx_CCMR1 寄存器控制(TI1/2)TIMx_CH1/2,TIMx_CCMR2寄存器控制(TI3/4)TIMx_CH3/4。對於TIMx_CCMR1寄存器,當CCxS[1:0] = 01時映射在TI1上,10時映射在TI2上;對於TIMx_CCMR2寄存器,當CCxS[1:0] = 01 時映射在 TI3 上,10 時映射在 TI4 上。

(2)濾波器

(本段出自野火教程PPT)如果來自外部的時鍾信號的頻率過高或者混雜有高頻干擾信號的話,我們就需要使用濾波器對 ETRP(外部觸發預分頻,External trigger prescaler) 信號重新采樣,來達到降頻或者去除高頻干擾的目的。由TIMx_CCMRx寄存器的位ICxF[3:0]配置。

TIMx_CCMR1寄存器控制位IC2F[3:0]和位IC1F[3:0]TIMx_CCMR2寄存器控制位IC4F[3:0]和位IC3F[3:0]

現在我們來說明一下這個IC1F[3:0]是個什么玩意。IC1F[3:0]輸入捕獲1濾波器 (Input capture 1 filter),它定義了 TI1 輸入的采樣頻率及數字濾波器長度。比如設置0001表示采樣頻率f(SAMPLING) = f(CK_INT) = 72MHz;再比如設置0100表示采樣頻率f(SAMPLING) = f(DTS)/2

注意這里的f(DTS)又是從哪里來的呢?它是從TIMx_CR1的位CKD[1:0](時鍾分頻因子,Clock division)來的,這2位定義在定時器時鍾(CK_INT)頻率、死區時間和由死區發生器與數字濾波器(ETR,TIx)所用的采樣時鍾之間的分頻比例。

(3)邊沿檢測

邊沿檢測的信號來自濾波器的輸出,它有兩種檢測方式:上升沿有效和下降沿有效。

邊沿檢測由TIMx_CCER寄存器的位CCxP(位1)CCxNP(位3)配置。當 CC1 通道配置為輸入時,0 表示上升沿檢測,1 表示下降沿檢測。

(4)觸發選擇

當使用外部時鍾模式 1 時,觸發源有兩個,一個是濾波后的定時器輸入 1(TI1FP1)和濾波后的定時器輸入 2(TI2FP2)。

TIMx_SMCR寄存器的位TS[2:0]配置,這3位選擇用於同步計數器的觸發輸入。

(5)從模式選擇

(本段內容來自野火教程PPT)選定了觸發源信號后,最后我們需把信號連接到 TRGI 引腳,讓觸發信號成為外部時鍾模式 1 的輸入,最終等於 CK_PSC,然后驅動計數器 CNT 計數。

具體的配置在TIMx_SMCR寄存器的位SMS[2:0]設置為 000 即可選擇外部時鍾模式 1。

(6)使能計數器

經過上面的 5 個步驟之后,最后我們只需使能計數器開始計數,外部時鍾模式 1 的配置就算完成。

使能計數器由TIMx_CR1寄存器的位CEN配置。

3. 外部時鍾模式 2

本內容分為以下部分講解,如圖所示:

image

(1)時鍾信號輸入引腳

當使用外部時鍾模式2的時候,時鍾信號輸入引腳對應的是引腳TIMx_ETR

(2)外部觸發極性

通過TIMx_SMCR寄存器的位ETP選擇外部觸發極性(External trigger polarity),0 表示高電平或上升沿有效,1 表示低電平或下降沿有效。

(3)外部觸發預分頻器

由於 ETRP(外部觸發預分頻,External trigger prescaler) 的信號的頻率不能超過 TIMx_CLK(180MHz)的 1/4,當觸發信號的頻率很高的情況下,就必須使用分頻器來降頻。

具體由TIMx_SMCR寄存器的位ETPS[1:0]配置。

(4)濾波器

(本段出自野火教程PPT)如果來自外部的時鍾信號的頻率過高或者混雜有高頻干擾信號的話,我們就需要使用濾波器對 ETRP 信號重新采樣,來達到降頻或者去除高頻干擾的目的。由TIMx_SMCR寄存器的位ETF[3:0]配置。

(5)從模式選擇

經過濾波器濾波的信號連接到 ETRF(外部觸發輸入) 引腳后,觸發信號成為外部時鍾模式 2 的輸入,最終等於CK_PSC,然后驅動計數器 CNT 計數。

具體的配置在TIMx_SMCR寄存器的位ECE為 1即可選擇外部時鍾模式 2。

(6)使能計數器

經過上面的 5 個步驟之后,最后我們只需使能計數器開始計數,外部時鍾模式 1 的配置就算完成。

使能計數器由TIMx_CR1寄存器的位CEN配置。

4. 內部觸發輸入

本部分僅作了解即可。

內部觸發輸入的方式是使用一個定時器作為另一個定時器的預分頻器。硬件上高級控制定時器和通用定時器在內部連接在一起,可以實現定時器同步或級聯。因此,采用內部觸發輸入的時候,必須要用到兩個 TIM 定時器,一個設置為主模式,另一個設置為從模式。

image

TIMx_SMCR寄存器的位TS[2:0]配置。如下圖為TIM1為TIM2提供時鍾:

image

二、控制器

控制器主要分為三大部分:觸發控制器、從模式控制器和編碼器接口,所涉及的寄存器主要是 CR1、CR2、SMCR、CCER。這些控制器將信號傳到預分頻器后作為計數器 CNT的時鍾,同時也有 TRGO 信號傳到其他定時器或 DAC/ADC。

三、時基單元

時基單元包括:預分頻寄存器(TIMx_PSC)、計數器寄存器(TIMx_CNT)、自動裝載寄存器(TIMx_ARR)和重復次數寄存器(TIMx_RCR)。下圖為時基單元的結構:

image

1. 預分頻寄存器

可參見STM32中文參考手冊13.3.1時基單元

預分頻器可以將計數器的時鍾頻率按 1 至 65536 之間任意分頻,因此TIMx_PSC寄存器一共有16位,計數器的時鍾頻率f(CK_CNT) = f(CK_PSC) / (PSC[15:0]+1),計數一次的時間為1 / f(CK_CNT)

注意上面的公式中 PSC 多加了 1,所以如果想分頻 72,那么實際配置寫入的應該是 71,比如f(CK_PSC) = 72MHz,則f(CK_CNT) = 72MHz / (71+1) = 1MHz,也就是 1us。

2. 計數器寄存器

可參見STM32中文參考手冊13.3.2計數器模式

(1)向上計數模式

計數器從 0 開始,每來一個CK_CNT脈沖計數加 1 ,一直加到與自動裝載值(即TIMx_ARR寄存器的值ARR,一共16位)相等,然后計數器又從 0 開始計數,並產生一次上溢事件

如果使能了重復計數器,每生成一次上溢事件,重復計數器減 1 ,在向上計數的次數達到設置的重復計數次數(即TIMx_RCR寄存器的值,高八位保留,低八位為重復計數器的值REP)之后,即重復計數器的值為 0 時,產生一次更新事件(UEV)。

如果禁用了重復計數器,第一次生成上溢事件之后立刻產生一次更新事件(UEV)。

(2)向下計數模式

計數器從 ARR 開始,每來一個CK_CNT脈沖計數減 1 ,一直減到 0 ,然后計數器又從 ARR 開始計數,並產生一次下溢事件

如果使能了重復計數器,每生成一次下溢事件,重復計數器減 1 ,在向下計數的次數達到設置的重復計數次數(即TIMx_RCR寄存器的值,高八位保留,低八位為重復計數器的值REP)之后,即重復計數器的值為 0 時,產生一次更新事件(UEV)。

如果禁用了重復計數器,第一次生成下溢事件之后立刻產生一次更新事件(UEV)。

(3)中心對齊模式(向上/向下計數)

在中心對齊模式中,計數器從 0 開始遞增計數到 ARR-1,同時產生上溢事件,然后從 ARR 開始遞減計數到 0 ,同時產生下溢事件,然后又從 0 開始計數。每次上溢事件和下溢事件都會產生更新事件。

3. 自動裝載寄存器

自動裝載寄存器 ARR 是用來存放與計數器 CNT 比較的值,如果兩個值相等就遞減重復計數器的值。

4. 重復次數寄存器

可參見STM32中文參考手冊13.3.3重復計數器

前面已經介紹過,向上計數模式下每次計數器上溢時,或向下計數模式下每次計數器下溢時,或中央對齊模式下每次上溢和每次下溢時,重復計數器的值會減 1。當寄存器的值為 0 時,會產生一次更新事件。

5. 影子寄存器

預分頻寄存器(TIMx_PSC)和自動裝載寄存器(TIMx_ARR)都有影子寄存器。影子寄存器起到一個緩沖的作用,它是起到真正作用的寄存器,但用戶無法看見、也無法對其讀寫操作;與之相對應的是自動預裝載寄存器,用戶可以進行讀寫操作。

影子寄存器是由TIMx_CR1寄存器的位ARPE控制的,配置成 0 為TIMx_ARR寄存器沒有緩沖(即影子寄存器不被使用),修改 ARR 的值馬上生效;配置成 1 為TIMx_ARR寄存器被裝入緩沖器(即影子寄存器被使用),只有在事件更新時才會把 ARR 的值賦值給影子寄存器。

為什么要弄一個影子寄存器呢?因為計數器在進行計數的時候可能會對預裝載寄存器寫入新的值,如果沒有影子寄存器(也就是 ARPE = 0),那么溢出事件就會發生在不恰當或者你不希望的時機。引入了影子寄存器后(也就是 ARPE = 1),即使再去修改預裝載的值,也不會影響到正在計數的計數器。說白了,這就是一個安全機制

四、輸入捕獲

可參見STM32中文參考手冊13.3.6輸入捕獲模式

輸入捕獲可對上升沿和下降沿或者雙邊沿進行捕獲,輸入捕獲最常見的應用是測量輸入信號的脈寬測量 PWM 信號輸入的頻率和占空比

PWM 是什么呢?學過模電的同學應該很熟悉了。脈寬調制(Pulse Width Modulation,PWM) 就是脈沖寬度調制,我們可以通過 PWM 改變周期和占空比(即正脈沖的持續時間與脈沖總周期的比值)達到控制充電電流的目的。

基本原理:當檢測到TIMx_CHy邊沿信號發生時,將計數器TIMx_CNT的值鎖存到捕獲/比較寄存器TIMx_CCRy里面,這就完成了一次捕獲。如果把前后兩次得到的 CCR 值進行相減,就可以算出頻率或者脈寬(指高電平持續的時間tON)。如果 tON 超過捕獲定時器的周期,就會發生溢出。

下圖為輸入捕獲的功能框圖:

image

1. 輸入通道

被測量的信號從輸入通道(或輸入信號)TIMx_CHy(y = 1,2,3,4),通常我們簡寫為TIy

2. 輸入濾波器和邊沿檢測器

如果輸入信號的頻率過高或者混雜有高頻干擾信號的話,我們就需要使用濾波器對輸入信號重新采樣,來達到降頻或者去除高頻干擾的目的。由TIMx_CCMRy寄存器的位ICxF[3:0]配置。關於濾波的采樣頻率與之前我們介紹的外部時鍾模式 1 和 2 是通用的。

邊沿檢測的極性可由TIMx_CCER寄存器的位CCxPCCxNP來配置。

3. 捕獲通道

圖中ICx(x = 1,2,3,4)是捕獲通道,每個捕獲通道對應不同捕獲/比較寄存器TIMx_CCRy,發生捕獲時計數器 CNT 的值就會鎖存到里面。

需要注意的是,一個輸入通道的信號可同時輸入兩個捕獲通道。比如圖中,輸入通道 TI1 經過濾波器后產生了 TI1FP1 和 TI1FP2,之后又分別輸入到捕獲通道 IC1 和 IC2,即 TI1 同時占用了兩個捕獲通道。

輸入通道和捕獲通道的映射關系由TIMx_CCMRy(y = 1,2)寄存器的位CCxS[1:0](x = 1,2,3,4)配置。

4. 預分頻器

ICx經過預分頻器,由TIMx_CCMRy(y = 1,2)寄存器的位ICxPSC[1:0](x = 1,2,3,4)配置。

如果希望捕獲輸入信號的每一個邊沿,則不需要分頻;如果需要每隔 1 個周期捕獲一次,則分頻系數為 2。

5. 捕獲寄存器

經過預分頻器得到的信號ICxPSC成為捕獲的最終信號,當發生第一次捕獲時,CNT 值會鎖存到 CCR 寄存器中,同時TIMx_SR寄存器的位CCxIF(捕獲/比較x中斷標記)置 1,通過軟件或通過讀取 CCR 的值進行清零。如果發生第二次捕獲,則TIMx_SR寄存器的位CCxOF(捕獲/比較x重復捕獲標記)置 1,只能通過軟件置0。

五、輸出比較

可參見STM32中文參考手冊13.3.9輸出比較模式

輸出比較是通過定時器的外部引腳對外輸出控制信號。由TIMx_CCMR1寄存器的位OCxM[2:0](輸出比較x模式)可知,輸出比較模式分為8種:

  • 凍結
  • 匹配時設置通道x為有效電平
  • 匹配時設置通道x為無效電平
  • 翻轉
  • 強制為無效電平
  • 強制為有效電平
  • PWM1(使用較多),在向上計數時,若寄存器的值 CNT = CCR,則 CH 為無效電平(OCxREF = 0),否則為有效電平(OCxREF = 1)
  • PWM2(使用較多),在向上計數時,若寄存器的值 CNT = CCR,則 CH 為有效電平(OCxREF = 1),否則為無效電平(OCxREF = 0)。因此 PWM1 和 PWM2 正好互補、互為反相

PWM 輸出信號頻率由自動重裝寄存器 ARR 的值決定,占空比由比較寄存器 CCR 的值決定。

下圖為輸出比較的功能框圖:

image

1. 輸出比較寄存器

當計數器 CNT 的值與捕獲/比較寄存器 CCR 的值相等時,輸出參考信號 OCxREF 的極性就會改變,並會產生比較中斷 CCxI,對應TIMx_SR寄存器的位CCxIF(捕獲/比較x中斷標記)置 1。OCxREF 可直接作為主輸出 OCx 和互補輸出 OCxN 信號(與主信號反相),亦可經過控制器后輸出信號。

2. 死區發生器

可以在參考波形 OCxREF 插入一段死區時間,由TIMx_BDTR(剎車和死區)寄存器的位DTG[7:0]死區發生器設置 (Dead-time generator setup)。關於死區持續時間(DT)的配置方法可見參考手冊。

死區時間是怎么來的呢?由於在使用 PWM 輸出時,上下橋 IGBT (絕緣柵雙極型晶體管)或 MOS 管並不是理想的開關器件,總有一段時間(一般為 us 級別)兩管同時導通,這樣就會造成電源直接接地,電流過大導致炸管。因此我們需要延遲一段時間避免這種情況發生,這段時間被稱為死區時間,如圖所示:

image

需要注意的是,死區的插入是以犧牲有效輸出為代價來保障驅動電路的安全性,所以沒有必要設置的過長。

3. 輸出控制

參考信號 OCxREF 經過死區控制器后來到輸出控制電路,在這里兵分兩路:一路是原始信號,另一路是反相信號,至於是否輸出信號由TIMx_CCER(捕獲/比較使能)寄存器來使能。

4. 輸出引腳

輸出通道分為原始信號 TIMx_CHy(y = 1,2,3,4)和互補信號 TIMx_CHyN(y = 1,2,3,需要注意沒有4)。

六、剎車斷路功能

剎車源既可以是剎車輸入引腳又可以是一個時鍾失敗事件(這時會啟動 CSS 時鍾安全系統)。

當使用剎車功能時,依據相應的控制位(TIMx_BDTR寄存器中的 MOE、OSSI 和 OSSR 位,TIMx_CR2寄存器中的 OISx 和 OISxN 位),輸出使能信號和無效電平都會被修改。但無論何時,OCx 和 OCxN 輸出不能在同一時間同時處於有效電平上。

附:PWM 波形的邊沿對齊和中心對齊

可參見STM32中文參考手冊13.3.10 PWM模式

PWM 邊沿對齊模式可分為向上計數和向下計數,主要用於直流電機。

image

PWM 中央對齊模式即向上/向下計數,主要用於交流電機。

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM