STM32之外設定時器
STM32F103系列的定時器有三類:
基本定時器(2個)
通用定時器(4個)
高級定時器(2個)
基本定時器:無對外輸入/輸出,常用作時基,實現基本的計數、定時功能。
通用定時器:除了基本定時器的時基功能外,還可對外做輸入捕捉、輸出比較以及連接其它傳感器接口【編碼器和霍爾傳感器】。
高級定時器:此類定時器的功能最為強大,除了具備通用定時器的功能外,還包含一些與電機控制和數字電源應用相關的功能,比方帶死區控制的互補信號輸出、緊急剎車關斷輸入控制。
基本定時器
(1-1)基本定時器框圖
i.基本定時器時鐘 TIMxCLK,即內部時鐘 CK_INT,經 APB1 預分頻器后分頻提供,如果 APB1 預分頻系數等于 1,則頻率不變,否則頻率乘以 2,庫函數中 APB1 預分頻的系數是 2,即 PCLK1=36M,所以定時器時鐘 TIMxCLK=36*2=72M。
ii.基本定時器時鐘經過 PSC 預分頻器之后,即 CK_CNT,用來驅動計數器計數。PSC 是一個 16 位的預分頻器,可以對定時器時鐘 TIMxCLK 進行 1~65536 之間的任何一個數進行分頻。具體計算方式為:CK_CNT=TIMxCLK/(PSC+1)。
iii.計數器 CNT 是一個 16 位的計數器,只能往上計數,最大計數值為 65535。當計數達 到自動重裝載寄存器的時候產生更新事件,并清零從頭開始計數。
iv.自動重裝載寄存器 ARR 是一個 16 位的寄存器,這里面裝著計數器能計數的最大數 值。當計數到這個值的時候,如果使能了中斷的話,定時器就產生溢出中斷。
v.定時器的定時時間等于計數器的中斷周期乘以中斷的次數。計數器在 CK_CNT 的驅動 下,計一個數的時間則是 CK_CLK 的倒數,等于:1/(TIMxCLK/(PSC+1)),產生一次中斷的時間則等于:1/(CK_CLK * ARR)。如果在中斷服務程序里面設置一個變量 time,用來 記 錄 中 斷 的 次 數 , 那 么 就 可 以 計 算 出 我 們 需 要 的 定 時 時 間 等 于 : 1/CK_CLK * (ARR+1)*time。
通用定時器
(1-2)通用定時器框圖
通用定時器框圖部分的內容與高級定時器其存在疊加部分,所以相關的描述見高級定時器的描述,如下:
高級定時器
(1-3)高級定時器框圖
i.高級控制定時器有四個時鐘源可選:
(1)內部時鐘源 CK_INT ——內部時鐘 CK_INT 即來自于芯片內部,等于 72M,一般情況下,我們都是使用內部時鐘。當從模式控制寄存器 TIMx_SMCR 的 SMS 位等于 000 時,則使用內部時鐘。
(2)外部時鐘模式 1:外部輸入引腳 TIx(x=1,2,3,4)——當使用外部時鐘模式 1 的時候,時鐘信號來自于定時器的輸入通道,總共有 4 個,分別為TI1/2/3/4,即TIMx_CH1/2/3/4。具體使用哪一路信號,由TIM_CCMRx的位CCxS[1:0]配置,其中 CCMR1 控制 TI1/2,CCMR2 控制 TI3/4。
(3)外部時鐘模式 2:外部觸發輸入 ETR ——當使用外部時鐘模式 2 的時候,時鐘信號來自于定時器的特定輸入通道 TIMx_ETR,只有 1 個。
(4)內部觸發輸入(ITRx)——內部觸發輸入是使用一個定時器作為另一個定時器的預分頻器。硬件上高級控制定時器和通用定時器在內部連接在一起,可以實現定時器同步或級聯。主模式的定時器可以對從模式定時器執行復位、啟動、停止或提供時鐘。
ii.高級控制定時器控制器部分包括觸發控制器、從模式控制器以及編碼器接口。觸發控制器用來針對片內外設輸出觸發信號,比如為其它定時器提供時鐘和觸發 DAC/ADC 轉換。
編碼器接口專門針對編碼器計數而設計。從模式控制器可以控制計數器復位、啟動、遞增/遞減、計數。
iii.高級控制定時器時基單元功能包括四個寄存器,分別是計數器寄存器(CNT)、預分頻器寄存器(PSC)、自動重載寄存器(ARR)和重復計數器寄存器(RCR)。其中重復計數器 RCR是高級定時器獨有,通用和基本定時器沒有。前面三個寄存器都是 16 位有效,TIMx_RCR寄存器是 8 位有效。
iv.輸入捕獲可以對輸入的信號的上升沿,下降沿或者雙邊沿進行捕獲,常用的有測量輸入信號的脈寬和測量 PWM 輸入信號的頻率和占空比這兩種。
輸入捕獲的大概的原理就是,當捕獲到信號的跳變沿的時候,把計數器 CNT 的值鎖存到捕獲寄存器 CCR 中,把前后兩次捕獲到的 CCR 寄存器中的值相減,就可以算出脈寬或者頻率。如果捕獲的脈寬的時間長度超過你的捕獲定時器的周期,就會發生溢出,這個我們需要做額外的處理。
v.輸出比較就是通過定時器的外部引腳對外輸出控制信號。(1)當計數器 CNT 的值跟比較寄存器 CCR 的值相等的時候,輸出參考信號 OCxREF 的信號的極性就會改變,其中 OCxREF=1(高電平)稱之為有效電平,OCxREF=0(低電平)稱之為無效電平,并且會產生比較中斷 CCxI,相應的標志位 CCxIF(SR 寄存器中)會置位。然后 OCxREF 再經過一系列的控制之后就成為真正的輸出信號 OCx/OCxN。(2)在生成的參考波形 OCxREF 的基礎上,可以插入死區時間(高級定時器所特有的),用于生成兩路互補的輸出信號 OCx 和 OCxN,死區時間的大小具體由 BDTR 寄存器的位 DTG[7:0]配置。死區時間的大小必須根據與輸出信號相連接的器件及其特性來調整。(3)在輸出比較的輸出控制中,參考信號 OCxREF 在經過死區發生器之后會產生兩路帶死區的互補信號 OCx_DT 和 OCxN_DT(通道 1~3 才有互補信號,通道 4 沒有,其余跟通道1~3 一樣),這兩路帶死區的互補信號然后就進入輸出控制電路,如果沒有加入死區控制,那么進入輸出控制電路的信號就直接是 OCxREF。(4)輸出比較的輸出信號最終是通過定時器的外部 IO 來輸出的,分別為 CH1/2/3/4,其中前面三個通道還有互補的輸出通道 CH1/2/3N。
vi.斷路功能就是電機控制的剎車功能,使能斷路功能時,根據相關控制位狀態修改輸出信號電平。在任何情況下,OCx 和 OCxN 輸出都不能同時為有效電平,這關系到電機控制常用的 H 橋電路結構原因。