stm32高級定時器
高級定時器時基單元:
包含一個16位自動重裝載寄存器 ARR
一個16位的計數器CNT,可向上/下計數
一個16位可編程預分頻器PSC,預分頻器時鍾源有多種可選,有內部的時鍾、外部時鍾。
一個8位的重復計數器 RCR,最高可實現40位的可編程定時。
STM32F103ZET6的高級/通用定時器的IO分配:
高級控制定時器有四個時鍾源:
內部時鍾源 CK_INT
外部時鍾模式1:外部輸入引腳TIx(x=1,2,3,4)
外部時鍾模式 2:外部觸發輸入ETR
內部觸發輸入(ITRx)
CK_INT來自於芯片內部,72M,
模式控制寄存器TIMx_SMCR的SMS位=000時,使用內部時鍾。
時鍾信號輸入引腳:
時鍾信號來自於定時器的輸入通道,共4個,分別為TI1/2/3/4,即TIMx_CH1/2/3/4。
使用哪一路信號由TIM_CCMRx的位CCxS[1:0]配置,CCMR1控制TI1/2,CCMR2控制TI3/4。
濾波器:
來自外部的時鍾信號頻率過高、混雜有高頻干擾信號,需要用濾波器對信號重新采樣,達到降頻、去除高頻干擾的目的。
由 TIMx_CCMRx 的位 ICxF[3:0]配置。
邊沿檢測:
輸入信號來自於濾波器的輸出,成為觸發信號前,要進行邊沿檢測,決定是上升沿有效還是下降沿有效。
由 TIMx_CCER 的位 CCxP 和 CCxNP 配置。
觸發選擇:
使用外部時鍾模式1時,有兩個觸發源,濾波后的定時器輸入 1(TI1FP1)、濾波后的定時器輸入2(TI2FP2)。
由 TIMxSMCR 的位 TS[2:0]配置。
從模式選擇:
選則了觸發源信號,需把信號連接到TRGI引腳,讓觸發信號成為外部時鍾模式1的輸入,最終等於CK_PSC,然后驅動計數器CNT計數。
配置TIMx_SMCR的位SMS[2:0]=000,可選擇外部時鍾模式1。
使能計數器:
使能計數器開始計數,外部時鍾模式1的配置完成。
使能計數器由TIMx_CR1的位CEN配置。
時鍾信號輸入引腳:
時鍾信號來自於定時器的輸入通道TIMx_ETR,僅有1個。
外部觸發極性:
來自ETR引腳的輸入信號可選擇為上升沿或者下降沿有效。
由TIMx_SMCR位ETP配置。
外部觸發預分頻器:
ETRP信號的頻率不能超過TIMx_CLK(72M)的1/4。
觸發信號的頻率很高的情況下,須使用分頻器降頻。
由TIMx_SMCR的位ETPS[1:0]配置。
濾波器:
ETRP信號的頻率過高或、混雜有高頻干擾信號,要用濾波器對ETRP信號重新采樣。
由TIMx_SMCR位ETF[3:0]配置。
fDTS由內部時鍾CK_INT分頻得到,由TIMx_CR1位CKD[1:0]配置。
從模式選擇:
經濾波器濾波的信號,連接到ETRF引腳,觸發信號成為外部時鍾模式2的輸入。
最終等於 CK_PSC,驅動計數器CNT計數。
TIMx_SMCR的位ECE為1,即可選擇外部時鍾模式2。
接下來配置TIMx_CR1的位CEN,使能計數器開始計數,完成外部時鍾模式2的配置。
使用一個定時器作為另一個定時器的預分頻器
高級控制定時器和通用定時器在內部連接在一起。
可實現定時器同步或級聯。
主模式定時器可對從模式定時器執行復位、啟動、停止、提供時鍾。
包括觸發控制器、從模式控制器、編碼器接口。
觸發控制器:
對片內外設輸出觸發信號,為其它定時器提供時鍾、觸發DAC/ADC轉換。
從模式控制器:
控制計數器復位、啟動、遞增/遞減、計數。
編碼器接口:
編碼器計數。
時基單元包括四個寄存器:
計數器寄存器(CNT)、預分頻器寄存器(PSC)、自動重載寄存器(ARR)、重復計數器寄存器(RCR)。前三個寄存器16位有效,TIMx_RCR寄存器8位有效。
輸入時鍾CK_PSC,輸出時鍾CK_CNT。
輸出時鍾CK_CNT用來驅動計數器CNT計數。
設置預分頻器PSC的值可得到不同的CK_CNT。
fCK_CNT=fCK_PSC/(PSC[15:0]+1),實現1至65536分頻。
三種計數模式:
遞增計數模式、遞減計數模式、遞增/遞減(中心對齊)計數模式。
遞增計數模式:
計數器從0開始計數,每來一個CK_CNT脈沖,計數器加1,直到計數器的值=自動重載寄存器 ARR的值,計數器從0開始計數並生成計數器上溢事件。
若禁用重復計數器,計數器生成上溢事件時生成更新事件(UEV)。
若使能重復計數器,生成一次上溢事件,重復計數器內容減1,直到重復計數器內容=0 ,才會生成更新事件。
遞減計數模式:
從自動重載寄存器ARR的值開始計數。
每來一個CK_CNT脈沖,計數器減1,直到計數器值=0。
然后,計數器又從自動重載寄存器ARR的值開始遞減,並生成計數器下溢事件。
若禁用重復計數器,計數器生成下溢事件時生成更新事件(UEV)。
若使能重復計數器,生成一次下溢事件,重復計數器內容減1,直到重復計數器內容=0 ,才會生成更新事件。
遞增/遞減(中心對齊)計數模式:
從0開始遞增計數,直到計數值=(ARR-1)值,生成計數器上溢事件。然后,從ARR值開始遞減計數,直到計數值=1,生成計數器下溢事件。
然后又從0開始計數,循環。
每次發生上溢、下溢事件,都會生成更新事件。
存放與計數器CNT比較的值。
兩個值相等就遞減重復計數器。
TIMx_CR1寄存器的ARPE位,控制自動重載影子寄存器功能。
ARPE位=1,自動重載影子寄存器有效。在事件更新時,才把TIMx_ARR值賦給影子寄存器。
ARPE位=0,修改TIMx_ARR值馬上有效。
基本/通用定時器,發生上/下溢事件時,直接生成更新事件。
高級控制定時器多出了重復計數器。
定時器發生上溢、下溢事件時,遞減重復計數器的值。
當重復計數器為0時,才會生成更新事件。
發生N+1個上溢、下溢事件(N 為 RCR 的值)時,產生更新事件。
可以對輸入的信號的上升沿、下降沿、雙邊沿進行捕獲。
測量輸入信號的脈寬、測量PWM輸入信號的頻率和占空比。
捕獲到信號的跳變沿時,把計數器CNT的值鎖存到捕獲寄存器CCR中。
將前后兩次捕獲到的CCR寄存器中的值相減,可以算出脈寬或頻率。
捕獲的脈寬的時間長度超過捕獲定時器的周期,會發生溢出。
需要被測量的信號,從定時器外部引腳TIMx_CH1/2/3/4進入,通常叫TI1/2/3/4。
輸入的信號存在高頻干擾,需要對輸入信號進行濾波,進行重新采樣。
采樣的頻率必須大於等於兩倍的輸入信號。
輸入信號為1M,設置采樣頻率為2M,可以在采樣到有效信號的基礎上,把高於2M的高頻干擾信號過濾掉。
由CR1寄存器的位CKD[1:0]和CCMR1/2的位ICxF[3:0]配置濾波器。
采樣頻率fSAMPLE可以由fCK_INT和fDTS分頻后的時鍾提供。
fCK_INT是內部時鍾,fDTS是fCK_INT經過分頻后得到的頻率。
分頻因子由CKD[1:0]決定,可以是不分頻,2 分頻、4分頻。
邊沿檢測器,設置信號在捕獲的時候是什么邊沿有效,上升沿、下降沿、雙邊沿。
由CCER寄存器位CCxP和CCxNP決定。
捕獲通道是圖中的IC1/2/3/4,每個捕獲通道都有對應的捕獲寄存器CCR1/2/3/4。
發生捕獲的時候,計數器CNT的值就會被鎖存到捕獲寄存器中。
輸入通道,用來輸入信號。
捕獲通道,用來捕獲輸入信號的通道。
一個輸入通道的信號可以同時輸入給兩個捕獲通道。
輸入通道TI1的信號,經過濾波邊沿檢測器之后的TI1FP1和TI1FP2,可以進入到捕獲通道IC1和IC2,這就是PWM輸入捕獲,一路輸入信號(TI1)占用兩個捕獲通道(IC1和IC2)。
只需測量輸入信號的脈寬時,用一個捕獲通道。
輸入通道和捕獲通道的映射關系,由寄存器CCMRx的位CCxS[1:0]配置。
ICx的輸出信號經過一個預分頻器,決定發生多少個事件時進行一次捕獲。
由寄存器CCMRx的位ICxPSC配置。
如果要捕獲信號的每一個邊沿,則不分頻。
經過預分頻器的信號ICxPS是最終被捕獲的信號。
發生捕獲時(第一次),計數器CNT的值會被鎖存到捕獲寄存器CCR中,產生CCxI中斷。
相應的中斷位CCxIF(在 SR 寄存器中)被置位,通過軟件或者讀取CCR中的值可以將CCxIF清0。
發生第二次捕獲(即重復捕獲:CCR寄存器中已捕獲到計數器值且CCxIF標志已置1)。
捕獲溢出標志位CCxOF(在SR寄存器中)會被置位,CCxOF只能通過軟件清零。
通過定時器的外部引腳,對外輸出控制信號。
有凍結、將通道X(x=1,2,3,4)設置為匹配時輸出有效電平、匹配時輸出無效電平、翻轉、強制變為無效電平、強制變為有效電平、PWM1、PWM2八種模式。
具體使用哪種模式,由寄存器CCMRx的位OCxM[2:0]配置。
計數器CNT的值跟比較寄存器CCR的值相等時,輸出參考信號OCxREF的信號的極性就會改變。
OCxREF=1(高電平)稱之為有效電平,OCxREF=0(低電平)稱之為無效電平。
並且產生比較中斷CCxI,相應的標志位CCxIF(SR 寄存器中)置位。
然后,OCxREF再經過一系列的控制,成為真正的輸出信號OCx/OCxN。
在生成的參考波形OCxREF的基礎上,插入死區時間,用於生成兩路互補的輸出信號OCx 、OCxN。
死區時間的大小,由BDTR寄存器的位DTG[7:0]配置。
死區時間的大小,必須根據與輸出信號相連接的器件及其特性來調整。
帶死區的PWM信號的應用,以半橋驅動電路為例。
半橋驅動電路中,Q1導通,Q2截止。
如果讓Q1截止Q2導通,需要先讓Q1截止一段時間后,再等一段時間才讓Q2導通。
這段等待的時間就稱為死區時間。
Q1關閉需要時間(由MOS管的工藝決定)。
Q1關閉之后,馬上打開Q2,此時(一 段時間內)相當於Q1和Q2都導通了,電路會短路。
所以需要死區時間。
帶死區插入的互補輸出,死區時間要根據MOS管的工藝來調節。
參考信號OCxREF經過死區發生器之后,產生兩路帶死區的互補信號OCx_DT、OCxN_DT。
(通道1 ~ 3才有互補信號,通道4沒有,其余跟通道1 ~ 3一樣)
然后,兩路帶死區的互補信號進入輸出控制電路。
如果沒有加死區控制,進入輸出控制電路的信號是OCxREF。
進入輸出控制電路的信號,被分成兩路。
一路是原始信號,一路是被反向的信號。
由寄存器CCER的位CCxP、CCxNP控制。
經過極性選擇的信號,是否由OCx引腳輸出到外部引腳CHx/CHxN,由寄存器CCER的位 CxE/CxNE 配置。
如果加入斷路(剎車)功能,斷路和死區寄存器BDTR的MOE、OSSI、OSSR這三個位會共同影響輸出的信號。
輸出比較的輸出信號,最終通過定時器的外部IO輸出,分別為CH1/2/3/4。
前面三個通道還有互補的輸出通道CH1/2/3N。
斷路功能是電機控制的剎車功能。
使能斷路功能時,根據相關控制位狀態,修改輸出信號電平。
在任何情況下,OCx和OCxN輸出都不能同時為有效電平,這與電機控制常用的H橋電路結構有關。
斷路源可以是時鍾故障事件,由內部復位時鍾控制器中的時鍾安全系統(CSS)生成。
也可以是外部斷路輸入IO,兩者是或運算關系。
系統復位啟動都默認關閉斷路功能。
斷路和死區寄存器(TIMx_BDTR)的BKE位置1,使能斷路功能。
可通過TIMx_BDTR寄存器的BKP位,設置斷路輸入引腳的有效電平,設置為1時,輸入 BRK為高電平有效,否則低電平有效。
發送斷路時,將產生以下效果:
TIMx_BDTR寄存器中,主輸出模式使能(MOE)位被清零,輸出處於無效、空閑或復位狀態;
根據相關控制位狀態,控制輸出通道引腳電平;
當使能通道互補輸出時,會根據情況自動控制輸出通道電平;
將TIMx_SR寄存器中的BIF位置1,並可產生中斷和DMA傳輸請求。
如果TIMx_BDTR寄存器中的自動輸出使能(AOE)位置1,則MOE位會在發生下一個UEV事件時自動再次置1。
脈寬/頻率測量示意圖
捕獲通道TIx上出現上升沿時,發生第一次捕獲。
計數器CNT的值,被鎖存到捕獲寄存器CCR中,進入捕獲中斷。
在中斷服務程序中記錄一次捕獲(可以用一個標志變量來記錄),並把捕獲寄存器中的值讀取到value1中。
當出現第二次上升沿時,發生第二次捕獲。
計數器CNT的值,再次被鎖存到捕獲寄存器CCR中,再次進入捕獲中斷。
在捕獲中斷中,把捕獲寄存器的值讀取到value3中,清除捕獲記錄標志。
利用value3和value1的差值,可以算出信號的周期(頻率)。
當捕獲通道TIx上出現上升沿時,發生第一次捕獲。
計數器CNT的值,被鎖存到捕獲寄存器CCR中,進入捕獲中斷。
在中斷服務程序中記錄一次捕獲(用一個標志變量來記錄),並把捕獲寄存器中的值讀取到value1中。
然后,把捕獲邊沿改變為下降沿捕獲,目的是捕獲后面的下降沿。
當下降沿到來的時候,發生第二次捕獲。
計數器CNT的值會再次被鎖存到捕獲寄存器CCR中,再次進入捕獲中斷。
在捕獲中斷中,把捕獲寄存器的值讀取到value3中,並清除捕獲記錄標志。
然后把捕獲邊沿設置為上升沿捕獲。
在測量脈寬過程中,需要來回切換捕獲邊沿的極性。
如果測量的脈寬時間比較長,定時器就會發生溢出。
溢出的時候,會產生更新中斷,可以在中斷里面對溢出進行記錄處理。
可以使用PWM輸入模式測量脈寬和頻率。
該模式是輸入捕獲的特例,只能使用通道1和通道2,通道3和通道4無法使用。
與上面只使用一個捕獲寄存器測量脈寬和頻率的方法相比,PWM輸入模式需占用兩個捕獲寄存器。
使用PWM輸入模式時,一個輸入通道(TIx)會占用兩個捕獲通道(ICx),所以,一個定時器使用PWM輸入的時候最多只能使用兩個輸入通道(TIx)。
以輸入通道TI1工作在PWM輸入模式為例:
PWM信號由輸入通道TI1進入,因為是PWM輸入模式,信號被分為兩路。
一路是TI1FP1,另一路是TI2FP2。
其中一路是周期,另一路是占空比。
作為觸發輸入的那一路信號,對應的就是周期,另一路對應占空比。
作為觸發輸入的那一路信號,還需設置極性,上升沿還是下降沿捕獲。
設置好觸發輸入的極性,另外一路硬件就會自動配置為相反的極性捕獲,無需軟件配置。
總之,選定輸入通道,確定觸發信號,設置觸發信號的極性。
因為是PWM輸入,另一路信號由硬件配置,無需軟件配置。
當使用PWM輸入模式時,必須將從模式控制器配置為復位模式(配置寄存器 SMCR 的位 SMS[2:0]來實現),當啟動觸發信號,開始進行捕獲時,把計數器CNT復位清零。
PWM輸入模式時序圖如下。
PWM信號由輸入通道TI1進入,配置TI1FP1為觸發信號,上升沿捕獲。
當上升沿的時候,IC1、IC2同時捕獲,計數器CNT清零。
下降沿的時候,IC2捕獲,計數器CNT的值,被鎖存到捕獲寄存器CCR2中,到了下一個上升沿的時候,IC1捕獲,計數器CNT的值,被鎖存到捕獲寄存器CCR1中。
CCR2+1測量的是脈寬,CCR1+1測量的是周期。
CCR2和CCR1的值在計算占空比和頻率時,都必須加1。
因為計數器是從0開始計數的。
從軟件上來說,用PWM 輸入模式測量脈寬和周期更容易,代價是需要占用兩個捕獲寄存器。
輸出比較模式共有8種,由寄存器CCMRx的位OCxM[2:0]配置。
PWM 輸出,就是對外輸出脈寬(即占空比)可調的方波信號,信號頻率由自動重裝寄 存器ARR的值決定,占空比由比較寄存器CCR的值決定。
PWM模式分為兩種,PWM1、PWM2。
以PWM1模式為例。
以計數器CNT計數的不同方向,分為邊沿對齊模式、中心對齊模式。
PWM信號主要用來控制電機,一般的電機控制用的是邊沿對齊模式,FOC電機一般用中心對齊模式。
下面分析這兩種模式信號波形的區別。
邊沿對齊模式PWM1波形如下(ARR=8)
遞增計數模式下,計數器從0計數到自動重裝載值(TIMx_ARR寄存器的內容),然后重新從0開始計數,生成計數器上溢事件。
邊沿對齊模式下,計數器CNT只工作在一種模式,遞增或者遞減模式。
這里以CNT工作在遞增模式為例,上圖,ARR=8,CCR=4,CNT從0開始計數.
當CNT<CCR,OCxREF為有效的高電平,同時,比較中斷寄存器CCxIF置位。
CCR<=CNT<=ARR,OCxREF為無效的低電平。CNT又從0開始計數,並生成計數器上溢事件,循環往復。
中心對齊模式PWM1波形如下(ARR=8)。
中心對齊模式,計數器CNT工作在遞增/遞減模式下。
開始時,計數器CNT從0開始,計數到自動重載值減1(ARR-1),生成計數器上溢事件;
然后從自動重載值開始,向下計數到1,生成計數器下溢事件。
然后從0開始重新計數。
上圖,ARR=8,CCR=4。
第一階段,計數器CNT工作在遞增模式下,從0開始計數。
當CNT<CCR的值時,OCxREF為有效的高電平。
CCR<=CNT<ARR,OCxREF為無效的低電平。
第二階段,計數器CNT工作在遞減模式,從ARR的值開始遞減。
CNT>CCR時,OCxREF為無效的低電平。
CCR=>CNT>=1時,OCxREF為有效的高電平。
把波形分為兩個階段,第一個階段1,2是計數器CNT工作在遞增模式的波形。
第二個階段3,4是計數器CNT工作在遞減模式的波形。
中心對齊模式下的波形特征:
1,3階段的時間相等,2,4階段的時間相等。
中心對齊模式又分為中心對齊模式1/2/3。
由寄存器CR1位CMS[1:0]配置。
區別在於中斷標志位CCxIF置1的條件。
模式1在CNT遞減計數時置1,模式2在CNT遞增計數時置1,模式3在CNT遞增和遞減計數時都置1。