第五章 STM32的定時(shí)器

套件包購(gòu)買(mǎi)鏈接:?

案例代碼及相關(guān)資料下載鏈接:
鏈接:https://pan.baidu.com/s/1hsIibEmsB91xFclJd-YTYA?pwd=jauj?
提取碼:jauj??
1?定時(shí)器綜述
1.1?定時(shí)器簡(jiǎn)介
TIM(Timer)定時(shí)器,最基本功能就是定時(shí)觸發(fā)中斷:對(duì)輸入的時(shí)鐘進(jìn)行計(jì)數(shù),并在計(jì)數(shù)值達(dá)到設(shè)定值時(shí)觸發(fā)中斷。由此可以得出定時(shí)器本身就是一個(gè)計(jì)數(shù)器,而當(dāng)輸入信號(hào)是一個(gè)準(zhǔn)確可靠的時(shí)鐘的時(shí)候,而當(dāng)它對(duì)這個(gè)基準(zhǔn)時(shí)鐘進(jìn)行計(jì)數(shù)的時(shí)候,就相當(dāng)于計(jì)時(shí)。
STM32單片機(jī)中的定時(shí)器有由16位計(jì)數(shù)器、預(yù)分頻器、自動(dòng)重裝寄存器的時(shí)基單元,在72MHz(在STM32單片機(jī)中,定時(shí)器的基準(zhǔn)時(shí)鐘是72MHz)計(jì)數(shù)時(shí)鐘下可以實(shí)現(xiàn)最大59.65s(計(jì)算公式如下:T=1/CK_CNT_OV = CK_PSC / (PSC + 1) / (ARR + 1))的定時(shí),同時(shí)定時(shí)器與定時(shí)器之間支持級(jí)聯(lián),兩個(gè)定時(shí)器級(jí)聯(lián)就可以有8000多年的計(jì)時(shí)。
STM32單片機(jī)中的定時(shí)器不僅具備基本的定時(shí)中斷功能,而且還包含內(nèi)外時(shí)鐘源選擇、輸入捕獲、輸出比較、編碼器接口、主從觸發(fā)模式等多種功能。而定時(shí)器也根據(jù)復(fù)雜度與應(yīng)用場(chǎng)景的不同分為以下三種類(lèi)型:

以上定時(shí)器的編號(hào)是STM32中所有系列的集合并不是所有型號(hào)都有以上八種定時(shí)器,例如本開(kāi)發(fā)板STM32F103C8T6定時(shí)器資源:TIM1、TIM2、TIM3、TIM4。所以定時(shí)器的具體資源要根據(jù)自身開(kāi)發(fā)板的數(shù)據(jù)手冊(cè)來(lái)看。并且從上表可得定時(shí)器的功能是向下兼容的,高一級(jí)的定時(shí)器擁有低一級(jí)定時(shí)器的全部功能。
?
1.2? 定時(shí)器的結(jié)構(gòu)
1.2.1??? 定時(shí)中斷結(jié)構(gòu)
?定時(shí)中斷時(shí)定時(shí)器最基本的功能,為了講解清楚,用基本定時(shí)器的結(jié)構(gòu)圖來(lái)講解(如下圖所示)

首先來(lái)了解接到時(shí)基單元是由計(jì)數(shù)器、預(yù)分頻器、自動(dòng)重裝寄存器這三個(gè)寄存器組成的,而定時(shí)器產(chǎn)生中斷的過(guò)程就是通過(guò)時(shí)基單元來(lái)完成的。首先時(shí)基單元的輸入是由內(nèi)部時(shí)鐘(也由外部時(shí)鐘會(huì)在內(nèi)外時(shí)鐘選擇時(shí)講到)直接輸入的,而內(nèi)部時(shí)鐘是RCC上的TIMXCLK給的,一般都為72MHz。
內(nèi)部時(shí)鐘進(jìn)入時(shí)基單元之后首先接PSC預(yù)分頻器,操作這個(gè)寄存器可以對(duì)輸入的內(nèi)部時(shí)鐘進(jìn)行預(yù)分頻,寄存器置0為不分頻,置1進(jìn)行二分頻,置2進(jìn)行三分頻。這個(gè)預(yù)分頻器是十六位寄存器(0~65535),所以最大可以進(jìn)行65536分頻。由此可以得到輸出頻率計(jì)算公式:輸出頻率=輸入頻率/n+1。而預(yù)分頻器分頻的作用就是為了得到自身需要的定時(shí)時(shí)間。
計(jì)數(shù)器:計(jì)數(shù)器是對(duì)PSC預(yù)分頻后的計(jì)數(shù)時(shí)鐘進(jìn)行計(jì)數(shù),(向上計(jì)數(shù)模式為例)計(jì)數(shù)時(shí)鐘每來(lái)一個(gè)上升沿計(jì)數(shù)器就加1,計(jì)數(shù)器也是一個(gè)16位的寄存器,所以計(jì)數(shù)器的計(jì)數(shù)范圍也是從0計(jì)到65535。如果加到65535再繼續(xù)加的話就會(huì)回到0重新往上加。而當(dāng)計(jì)數(shù)器的值達(dá)到設(shè)定的目標(biāo)的值時(shí)就會(huì)產(chǎn)生中斷,完成定時(shí)中斷的任務(wù)。
自動(dòng)重裝寄存器:這個(gè)寄存器就是用來(lái)存儲(chǔ)產(chǎn)生中斷的目標(biāo)值的,也是十六位寄存器,存的是寫(xiě)入的計(jì)數(shù)目標(biāo)(固定值),當(dāng)計(jì)數(shù)器加到這一固定值時(shí),就說(shuō)明計(jì)數(shù)達(dá)到目標(biāo)值,會(huì)給一個(gè)中斷標(biāo)志同時(shí)會(huì)清零計(jì)數(shù)器的值。如果是產(chǎn)生一個(gè)中斷,那么就會(huì)傳向NVIC,配置好NVIC后NVIC傳給CPU這樣定時(shí)器的更新中斷就會(huì)得到CPU的響應(yīng)。如果是更新事件就是會(huì)產(chǎn)生一個(gè)事件同時(shí)就不會(huì)產(chǎn)生中斷。
了解完以上定時(shí)中斷的工作模式來(lái)看一下部分寄存器工作時(shí)的時(shí)序圖:
預(yù)分頻工作的時(shí)序圖:

上圖為預(yù)分頻器的參數(shù)從1變成2時(shí)的時(shí)序圖,CK_PSC 為預(yù)分頻器的輸入時(shí)鐘,CNT_EN為計(jì)數(shù)器的使能,高電平時(shí)計(jì)數(shù)器正常運(yùn)行,低電平時(shí)計(jì)數(shù)器停止運(yùn)行。CK_CNT計(jì)數(shù)器時(shí)鐘是預(yù)分頻器的輸出時(shí)鐘也是計(jì)數(shù)器的輸入時(shí)鐘,這里最主要講的就是預(yù)分頻器的控制寄存器與緩沖寄存器,由時(shí)序圖可以看出當(dāng)預(yù)分頻控制器從0變成1時(shí)其他時(shí)序并未發(fā)生改變,只有當(dāng)預(yù)分頻的緩沖控制器改變后其他時(shí)序圖才開(kāi)始改變,這樣是為了讓一段計(jì)數(shù)周期的前半周期與后半周期的計(jì)數(shù)頻率相同,所以預(yù)分頻緩沖器是真正控制分頻的寄存器,而預(yù)分頻控制寄存器是來(lái)操作緩沖器的一個(gè)寄存器。
其他寄存器中也有類(lèi)似這樣的結(jié)構(gòu),大家可以自行去看手冊(cè)中的內(nèi)容來(lái)學(xué)習(xí)。
再補(bǔ)充一個(gè)關(guān)于計(jì)數(shù)器計(jì)數(shù)模式的知識(shí)點(diǎn):
向上計(jì)數(shù)模式:在向上計(jì)數(shù)模式中,計(jì)數(shù)器從0計(jì)數(shù)到自動(dòng)加載值(TIMx_ARR計(jì)數(shù)器的內(nèi)容),然后重新從0開(kāi)始 計(jì)數(shù)并且產(chǎn)生一個(gè)計(jì)數(shù)器溢出事件。
向下計(jì)數(shù)模式:在向下模式中,計(jì)數(shù)器從自動(dòng)裝入的值(TIMx_ARR計(jì)數(shù)器的值)開(kāi)始向下計(jì)數(shù)到0,然后從自動(dòng) 裝入的值重新開(kāi)始并且產(chǎn)生一個(gè)計(jì)數(shù)器向下溢出事件。
中央對(duì)齊模式:計(jì)數(shù)器從0開(kāi)始計(jì)數(shù)到自動(dòng)加載的值(TIMx_ARR寄存器)?1,產(chǎn)生一個(gè)計(jì)數(shù)器 溢出事件,然后向下計(jì)數(shù)到1并且產(chǎn)生一個(gè)計(jì)數(shù)器下溢事件;然后再?gòu)?開(kāi)始重新計(jì)數(shù)。 在這個(gè)模式,不能寫(xiě)入TIMx_CR1中的DIR方向位。它由硬件更新并指示當(dāng)前的計(jì)數(shù)方向。
1.2.2??? 定時(shí)器時(shí)鐘的選擇
對(duì)于內(nèi)部時(shí)鐘的選擇和上述定時(shí)器中斷基本一致就不再詳解,主要來(lái)看如何對(duì)外部時(shí)鐘進(jìn)行選擇,而外部時(shí)鐘定時(shí)器一共有兩種模式:外部時(shí)鐘源模式1和外部時(shí)鐘源模式2 。
外部時(shí)鐘源模式2:

放大的結(jié)構(gòu)圖如上所示,這個(gè)外部時(shí)鐘來(lái)自TIMx_ETR上的引腳,而TIMx_ETR引腳則是復(fù)用在了PA0這個(gè)GPIO口上,我們?cè)赑A0上接一個(gè)外部方波時(shí)鐘,然后再配置內(nèi)部的極性選擇,邊沿檢測(cè)和預(yù)分頻電路,再配置輸入濾波電路,這兩個(gè)電路時(shí)為了對(duì)外部時(shí)鐘輸入方波型號(hào)進(jìn)行整形(對(duì)輸入的波形進(jìn)行濾波,,它可以避免一些高頻的毛刺信號(hào)造成誤觸發(fā) )。然后通過(guò)ETRF進(jìn)入觸發(fā)控制器,再接著就可以選擇作為時(shí)基單元的時(shí)鐘了,如果想在ETR外部引腳提供時(shí)鐘,或者想對(duì)ETR時(shí)鐘進(jìn)行計(jì)數(shù),把這個(gè)定時(shí)器當(dāng)做計(jì)數(shù)器來(lái)使用的話,就可以配置這一路電路。在STM32中,這一路叫做外部時(shí)鐘模式2。
外部時(shí)鐘源模式1:


放大的結(jié)構(gòu)圖如上圖所示:結(jié)合本圖和通用定時(shí)器的結(jié)構(gòu)圖來(lái)看ETR引腳既可以接外部時(shí)鐘源模式1也可以接外部時(shí)鐘源模式2,外部時(shí)鐘模式1接ETR的作用與外部時(shí)鐘源模式2作用一致(具體如何接在外部時(shí)鐘源模式2中有寫(xiě))。外部時(shí)鐘源模式1也可以接ITR信號(hào)這一部分信號(hào)來(lái)自于其他定時(shí)器,從通用定時(shí)器結(jié)構(gòu)圖來(lái)看,主模式輸出的TRGO可以通向其他定時(shí)器,接其他定時(shí)器時(shí)引腳接到了定時(shí)器的ITR上,ITR0~ITR3是其他四個(gè)定時(shí)器的TRGO輸出。具體連接方式如下圖表78所示:

而這一路外部時(shí)鐘模式主要來(lái)實(shí)現(xiàn)定時(shí)器的級(jí)聯(lián)的功能。
1.2.3??? 定時(shí)器輸出比較
OC(Output Compare)輸出比較,輸出比較可以通過(guò)比較CNT與CCR寄存器值的關(guān)系,來(lái)對(duì)輸出電平進(jìn)行置1、置0或翻轉(zhuǎn)的操作,用于輸出一定頻率和占空比的PWM波形,定時(shí)器的輸出比較功能是通用定時(shí)器與高級(jí)定時(shí)級(jí)特有的,每個(gè)高級(jí)定時(shí)器和通用定時(shí)器都擁有4個(gè)輸出比較通道。注意高級(jí)定時(shí)器的前3個(gè)通道額外擁有死區(qū)生成和互補(bǔ)輸出的功能,這個(gè)主要用來(lái)驅(qū)動(dòng)三相無(wú)刷電機(jī),先暫不做了解,我們主要來(lái)學(xué)習(xí)通用定時(shí)器的輸出比較。
定時(shí)器輸出比較是對(duì)PWM的波形進(jìn)行控制的那么我們首先來(lái)了解一下什么是PWM:PWM(Pulse Width Modulation)脈沖寬度調(diào)制,在具有慣性(改變的瞬間不會(huì)消失而會(huì)暫時(shí)存留一段時(shí)間,就像跑步一樣從跑步狀態(tài)到立定狀態(tài)不會(huì)瞬間完成。)的系統(tǒng)中,可以通過(guò)對(duì)一系列脈沖的寬度進(jìn)行調(diào)制,來(lái)等效地獲得所需要的模擬參量,常應(yīng)用于電機(jī)控速等領(lǐng)域,而PWM信號(hào)就是一個(gè)數(shù)字輸出信號(hào),是由高低電平組成的,他是用來(lái)等效的輸出一個(gè)模擬信號(hào)。
PWM具體輸出信號(hào)如下圖所示:

PWM參數(shù):頻率 = 1 / TS(周期的倒數(shù)),占空比 = TON / TS(高電平時(shí)間與整個(gè)周期時(shí)間的比例),分辨率 = 占空比變化步距(占空比最小變化的跨度)。
輸出比較的具體結(jié)構(gòu)

在通用定時(shí)器中是標(biāo)紅這一部分:

在輸出比較的結(jié)構(gòu)圖里面,從最左邊開(kāi)始,輸出模式控制器這里接的是CNT計(jì)數(shù)器和CCR1的捕獲/比較寄存器。當(dāng)CNT > CCR1或者CNT = CCR1時(shí),會(huì)給輸出模式控制器傳輸一個(gè)信號(hào),輸出模式控制器就會(huì)改變它輸出OC1REF的高低電平,REF信號(hào)(相當(dāng)于一個(gè)參考信號(hào))指的就是輸出信號(hào)的高低電平,REF信號(hào)可以輸出到主模式控制器,把REF信號(hào)映射到由TRGO上,但是更多情況下是直接給到下面這個(gè)通道,這里有一個(gè)CC1P寄存器,是一個(gè)極性的選擇,當(dāng)寄這個(gè)寄存器置0時(shí),參考信號(hào)REF與輸出信號(hào)一致,當(dāng)寄這個(gè)寄存器置1時(shí),經(jīng)過(guò)一個(gè)非門(mén),給參考信號(hào)反轉(zhuǎn)一下,那么參考信號(hào)REF與輸出信號(hào)相反,最后輸出的信號(hào)會(huì)在GPIO口上顯示出,例如與PWM通道1復(fù)用的GPIO口是PA0。
輸出比較有以下幾種模式:凍結(jié)?????
(1)CNT=CCR時(shí),REF保持為原狀態(tài)
(2)匹配時(shí)置有效電平????? CNT=CCR時(shí),REF置有效電平
(3)匹配時(shí)置無(wú)效電平????? CNT=CCR時(shí),REF置無(wú)效電平
(4)匹配時(shí)電平翻轉(zhuǎn)?? CNT=CCR時(shí),REF電平翻轉(zhuǎn)
(5)強(qiáng)制為無(wú)效電平?? CNT與CCR無(wú)效,REF強(qiáng)制為無(wú)效電平
(6)強(qiáng)制為有效電平?? CNT與CCR無(wú)效,REF強(qiáng)制為有效電平
(7)PWM模式1?? 向上計(jì)數(shù):CNT<CCR時(shí),REF置有效電平,CNT≥CCR時(shí),REF置無(wú)效電平,向下計(jì)數(shù):CNT>CCR時(shí),REF置無(wú)效電平,CNT≤CCR時(shí),REF置有效電平(通過(guò)對(duì)CCR與CNT的控制就可以來(lái)控制占空比得到不同的PWM波形。)
(8)PWM模式2?? 向上計(jì)數(shù):CNT<CCR時(shí),REF置無(wú)效電平,CNT≥CCR時(shí),REF置有效電平,向下計(jì)數(shù):CNT>CCR時(shí),REF置有效電平,CNT≤CCR時(shí),REF置無(wú)效電平。
以上八種模式最常使用的是PWM輸出比較的模式,其他模式一般在特定場(chǎng)景中使用。
接下來(lái)是PWM的參數(shù)計(jì)算方法,在我們對(duì)輸出比較進(jìn)行配置時(shí)會(huì)經(jīng)常用到:

PWM模式1,采用向上計(jì)數(shù)法:的圖像化黃線:ARR(周期),紅線:CNT(計(jì)數(shù))藍(lán)線:CRR。(CNT<CCR時(shí),REF置有效電平(高電平),CNT≥CCR時(shí),REF置無(wú)效電平(低電平))。
PWM參數(shù)計(jì)算方法如下:
PWM頻率:???? Freq = CK_PSC(內(nèi)部時(shí)鐘預(yù)分頻) / (PSC + 1) / (ARR + 1)
PWM占空比: Duty = CCR / (ARR + 1)
PWM分辨率: Reso = 1 / (ARR + 1)
?1.2.4??? 定時(shí)器輸入捕獲
簡(jiǎn)介:
輸入捕獲,即Input Capture,英文縮寫(xiě)為IC。輸入捕獲模式下,當(dāng)通道輸入引腳出現(xiàn)指定電平跳變(可以定義為上升沿、下降沿)時(shí),當(dāng)前CNT的值將被鎖存到CCR中(這就是“捕獲”的含義),可用于測(cè)量PWM波形的頻率、占空比、脈沖間隔、電平持續(xù)時(shí)間等參數(shù)。每個(gè)高級(jí)定時(shí)器和通用定時(shí)器都擁有4各輸入捕獲通道,且二者沒(méi)有區(qū)別。
輸入捕獲模塊可以配置為PWMI(PWM輸入)模式和主從觸發(fā)模式。PWMI模式是專(zhuān)門(mén)用來(lái)同時(shí)測(cè)量PWM波形的頻率和占空比的。主從觸發(fā)模式可以實(shí)現(xiàn)對(duì)頻率或占空比的硬件的全自動(dòng)測(cè)量,不占用軟件資源,可以減輕CPU的壓力。
?
原理圖:
輸入捕獲的通道與輸出比較的通道是一致的,所以在通用定時(shí)器里的具體結(jié)構(gòu)與輸出比較一致。
來(lái)看輸入捕獲的具體原理圖:

輸入捕獲通道的工作原理:輸入信號(hào)首先進(jìn)入輸入濾波器和邊沿檢測(cè)器(輸入濾波器與邊沿檢測(cè)器前文有提到不再贅述),當(dāng)觸發(fā)指定的電平時(shí),邊沿檢測(cè)電路就會(huì)觸發(fā),然后用CC1P來(lái)選擇極性,最終得到TI1FP1觸發(fā)信號(hào)(也有TI1FP2de 觸發(fā)信號(hào)連接到通道2),通過(guò)數(shù)據(jù)選擇器進(jìn)入通道1的捕獲電路,進(jìn)入捕獲單元后,通過(guò)CCIS數(shù)據(jù)選擇器對(duì)數(shù)據(jù)進(jìn)行選擇,然后經(jīng)過(guò)一個(gè)ICPS來(lái)配置預(yù)分頻器,最后對(duì)CC1E進(jìn)行控制選擇輸出使能或失能,如果選擇使能就可以控制CCR對(duì)CNT進(jìn)行捕獲操作了。捕獲信號(hào)同時(shí)會(huì)觸發(fā)一個(gè)事件,這個(gè)事件會(huì)在狀態(tài)寄存器置標(biāo)志位,可以觸發(fā)中斷。CR對(duì)CNT進(jìn)行捕獲之后,需要對(duì)CNT進(jìn)行一次清0操作,這樣每次捕獲得到的值才是測(cè)周法(下文有講解)兩個(gè)上升沿(下降沿)之間的時(shí)間間隔。這個(gè)清0操作,就需要用到主從觸發(fā)模式來(lái)自動(dòng)完成。由輸入捕獲通道1的詳細(xì)框圖可得:經(jīng)過(guò)濾波和極性選擇的TI1FP1信號(hào)和經(jīng)過(guò)濾波的邊沿信號(hào)TI1F_ED都可以通向從模式控制器,之后便可以通過(guò)硬件電路自動(dòng)完成CNT的清0操作(用來(lái)測(cè)頻率)。
主從觸發(fā)模式:
即主模式、從模式和觸發(fā)源選擇三個(gè)功能的簡(jiǎn)稱(chēng),主模式可以將定時(shí)器內(nèi)部的信號(hào)映射到TRGO引腳,用于觸發(fā)其他外設(shè)的操作;從模式可以接收其他外設(shè)或自身外設(shè)的一些信號(hào),用于觸發(fā)自己的一些操作(定時(shí)器的運(yùn)行);觸發(fā)源選擇,即選擇從模式的觸發(fā)信號(hào)源功能,也可以認(rèn)為它是從模式的一部分。(如下圖所示)

下面是通過(guò)觸發(fā)源選擇來(lái)配置主模式功能:

還有配置觸發(fā)源信號(hào)來(lái)控制從模式:

本節(jié)會(huì)用到從模式的復(fù)位功能。
PWMI的基本結(jié)構(gòu):

首先,配置時(shí)基單元,啟動(dòng)寄存器,則CNT就會(huì)在時(shí)鐘驅(qū)動(dòng)下不斷自增。我們使用CNT來(lái)計(jì)數(shù),間接實(shí)現(xiàn)計(jì)時(shí)的功能。經(jīng)過(guò)預(yù)分頻后的時(shí)鐘頻率,就是測(cè)周法的標(biāo)準(zhǔn)頻率f c 。之后,GPIO輸入一個(gè)待測(cè)的方波信號(hào),經(jīng)過(guò)TI1FP1為上升沿觸發(fā),之后數(shù)據(jù)選擇器選擇直連通道,分頻器選擇不分頻。當(dāng)TI1FP1出現(xiàn)上升沿之后,CNT的值就會(huì)被CCR1捕獲;同時(shí)觸發(fā)源選擇模塊選擇TI1FP1為觸發(fā)信號(hào),從模式選擇復(fù)位操作。則TI1FP1信號(hào)完成兩個(gè)操作:先捕獲CNT的值到CCR1中然后清零CNT(與輸入捕獲基本一致),將一個(gè)引腳的信號(hào)映射到兩個(gè)輸入捕獲單元,將TI1FP2配置為下降沿觸發(fā),就可以同時(shí)測(cè)量PWM波形的頻率和占空比了,如下圖所示,占空比:
D u t y = C C R 2 /C C R 1 × 100 %

?
頻率測(cè)量有以下幾種方式:
測(cè)頻法:在閘門(mén)時(shí)間T內(nèi),對(duì)上升沿計(jì)次,得到N,則頻率? f_x=N?/?T(測(cè)量高頻信號(hào))。
測(cè)周法:兩個(gè)上升沿內(nèi),以標(biāo)準(zhǔn)頻率fc計(jì)次,得到N ,則頻率 f_x=f_c?/?N(測(cè)量低頻信號(hào))。
中界頻率:測(cè)頻法與測(cè)周法誤差相等的頻率點(diǎn)? f_m=√f_c?/?T
?
?1.2.5??? 定時(shí)器編碼器接口
簡(jiǎn)介:
Encoder Interface 編碼器接口
編碼器接口可接收增量(正交)編碼器的信號(hào),根據(jù)編碼器旋轉(zhuǎn)產(chǎn)生的正交信號(hào)脈沖,自動(dòng)控制CNT自增或自減(所以接到編碼器通道時(shí)不用時(shí)基單元部分來(lái)計(jì)數(shù)),從而指示編碼器的位置、旋轉(zhuǎn)方向和旋轉(zhuǎn)速度,每個(gè)高級(jí)定時(shí)器和通用定時(shí)器都擁有1個(gè)編碼器接口(資源較少),兩個(gè)輸入引腳借用了輸入捕獲的通道1和通道2(雖然借用但用Cube配置的時(shí)候不是配置輸入捕獲,到時(shí)候會(huì)教如何具體配置,如果用標(biāo)準(zhǔn)庫(kù)寫(xiě)的話就是配置輸入捕獲通道)。
從原理上看,編碼器接口輸出的信號(hào)就相當(dāng)于一個(gè)帶有方向控制的外部時(shí)鐘,同時(shí)控制CNT的計(jì)數(shù)時(shí)鐘和計(jì)數(shù)方向。這時(shí),CNT的值就代表了編碼器的位置。如果每隔一段時(shí)間將CNT的值取出并清0,我們就能得到編碼器在這一段時(shí)間內(nèi)的旋轉(zhuǎn)速度(注意,不是旋轉(zhuǎn)速率,這里的速度只與這段時(shí)間的長(zhǎng)短和始末位置有關(guān)),思路與測(cè)頻法測(cè)正交脈沖的頻率相似,只不過(guò)這里的計(jì)數(shù)器的計(jì)數(shù)方向由編碼器接口決定。
正交編碼器:

兩個(gè)輸出引腳輸出的方波信號(hào)相位相差90°的編碼器稱(chēng)為正交(增量)編碼器。一個(gè)方波信號(hào)相對(duì)于另一個(gè)方波信號(hào)超前或滯后90°代表正傳或反轉(zhuǎn)。
要測(cè)量編碼器的旋轉(zhuǎn)方向,還可以使用一個(gè)引腳輸出方波表示旋轉(zhuǎn)角度和速度,另一個(gè)引腳輸出旋轉(zhuǎn)方向:正傳輸出高電平,反轉(zhuǎn)輸出低電平。但相較于這一種方案,使用正交編碼器的優(yōu)勢(shì)在于:正交信號(hào)精度更高。正交信號(hào)的A、B相都可以計(jì)次,且相位相差90°,相當(dāng)于計(jì)次頻率(計(jì)數(shù)器的變化頻率)提高了一倍。
正交信號(hào)可以在一定程度上免除噪聲的干擾。對(duì)于正交信號(hào)而言,兩個(gè)信號(hào)必須交替跳變,CNT的值才會(huì)自增或自減。如果一個(gè)信號(hào)不變,另一個(gè)信號(hào)連續(xù)跳變,則CNT的值是不會(huì)變化的。
編碼接口的基本結(jié)構(gòu)與工作模式:

編碼器接口借用了定時(shí)器的CH1和CH2通道,與CH3和CH4無(wú)關(guān)。且輸入捕獲前端的輸入濾波和極性選擇部分也有使用。編碼器接口的輸出部分,相當(dāng)于一個(gè)從模式控制器,控制CNT的自增和自減。此時(shí)72Hz內(nèi)部時(shí)鐘和時(shí)基單元初始化時(shí)設(shè)置的計(jì)數(shù)方向都處于失效的狀態(tài),因?yàn)榇藭r(shí)的計(jì)數(shù)時(shí)鐘和計(jì)數(shù)方向都處于編碼器接口托管的狀態(tài)。 所以當(dāng)一個(gè)定時(shí)器被配置為編碼器接口模式,這個(gè)定時(shí)器就很難完成其他工作了,因?yàn)榫幋a器接口直接控制時(shí)基單元的時(shí)鐘來(lái)源。但是在編碼器接口模式下ARR是有效的,一般將ARR設(shè)置為最大量程,這樣利用補(bǔ)碼的特性,很容易得到負(fù)數(shù)。
編碼器接口的設(shè)計(jì)邏輯為:把A相和B相的所有邊沿作為計(jì)數(shù)器的計(jì)數(shù)時(shí)鐘,出現(xiàn)邊沿信號(hào)時(shí),就計(jì)數(shù)自增或自減,此時(shí)增減由另一相的狀態(tài)確定。當(dāng)然,也可以?xún)H在一相進(jìn)行計(jì)數(shù),忽略另一相,只不過(guò)這樣會(huì)犧牲一部分計(jì)數(shù)的精度。
計(jì)數(shù)方向與編碼器信號(hào)的關(guān)系:

以下是正轉(zhuǎn)時(shí)正交編碼器的信號(hào):

根據(jù)計(jì)數(shù)方向與編碼器信號(hào)的關(guān)系圖與此圖可以看出,當(dāng)正轉(zhuǎn)時(shí)計(jì)數(shù)器都是向上計(jì)數(shù)的,而反轉(zhuǎn)時(shí)正好相反,根據(jù)這些特性我們就可以有效的測(cè)出編碼的速度與方向。
具體例子:
在計(jì)數(shù)時(shí)如果極性選擇不反向的話TI1FP1和TI2FP2均不反相時(shí),計(jì)數(shù)器的操作實(shí)例如下圖所示。下圖同時(shí)也展示了編碼器接口的抗噪聲原理:當(dāng)一個(gè)信號(hào)不變,另一個(gè)信號(hào)連續(xù)跳變(非正交編碼器的信號(hào)),計(jì)數(shù)器就會(huì)來(lái)回加減擺動(dòng),最終計(jì)數(shù)值不變。(具體如下圖所示)

而反相的作用是當(dāng)編碼器模塊的使用過(guò)程中,如果數(shù)據(jù)的加減方向反了,就可以將任意一個(gè)引腳反相,反轉(zhuǎn)計(jì)數(shù)方向得到自身需要的計(jì)數(shù)模式:具體如下圖所列舉(TI1反向時(shí)):

定時(shí)器編碼器接口部分的介紹就到此為止,以上就是關(guān)于定時(shí)器的全部?jī)?nèi)容,接下來(lái)做具體實(shí)驗(yàn)來(lái)加深印象。
2?有關(guān)定時(shí)器的實(shí)驗(yàn)內(nèi)容
在寫(xiě)代碼之前先了解HAL中提供的關(guān)于定時(shí)器中斷的函數(shù):
?2.1? 定時(shí)器中斷:
實(shí)驗(yàn)內(nèi)容如下:
利用定時(shí)器中斷和OLED顯示屏來(lái)顯示計(jì)時(shí),每一秒記一次。
?接線圖如下:

?實(shí)物圖如下:

關(guān)于STM32CubeMX的配置如下:
?
在Timer中選擇定時(shí)器2來(lái)進(jìn)行配置,1時(shí)鐘源選擇內(nèi)部時(shí)鐘,2預(yù)分頻設(shè)置為分7200頻,3計(jì)數(shù)器模式設(shè)置為向上計(jì)數(shù)模式,4自動(dòng)重裝寄存器設(shè)置為10000,5內(nèi)部時(shí)鐘不分頻,6給計(jì)數(shù)器使能。
?

在NVIC里打開(kāi)定時(shí)器2的中斷
?

給NVIC的分組模式設(shè)為分組2,給OLED顯示屏的引腳設(shè)置為輸出模式,剩下配置不變生成工程即可。
代碼部分:
?Timer部分代碼:
?
??
主函數(shù)部分代碼:
寫(xiě)完這些代碼下載程序后發(fā)現(xiàn),秒表的計(jì)時(shí)是從1開(kāi)始而不是從0開(kāi)始,這是因?yàn)閹?kù)函數(shù)中初始化過(guò)程中為了要讓預(yù)分頻器立刻起作用要操控預(yù)分頻器的緩沖寄存器,庫(kù)函數(shù)中給了更新事件的代碼讓預(yù)分頻緩沖寄存器立刻起作用,同時(shí)也產(chǎn)生了中斷標(biāo)志位這樣就導(dǎo)致了CPU一開(kāi)始運(yùn)行就進(jìn)入了中斷,為了彌補(bǔ)這一操作,我們需要在TIM初始化的函數(shù)中給他把更新中斷的標(biāo)志清除,這樣單片機(jī)就會(huì),從主程序開(kāi)始執(zhí)行。具體操作如下:
?
光標(biāo)右鍵定時(shí)器初始化函數(shù)讓他跳轉(zhuǎn)到定義的.c文件里

在初始化函數(shù)的末尾加上__HAL_TIM_CLEAR_FLAG? ( &htim2, TIM_SR_UIF);//清除更新中斷標(biāo)志 即可。
?

2.2? 定時(shí)器外部時(shí)鐘
?實(shí)驗(yàn)內(nèi)容:
?用對(duì)射式紅外傳感器模塊來(lái)手動(dòng)模擬一個(gè)外部時(shí)鐘的信號(hào),然后每十個(gè)信號(hào)對(duì)其進(jìn)行一次計(jì)數(shù),來(lái)做一個(gè)計(jì)數(shù)器。實(shí)驗(yàn)現(xiàn)象:OLED屏幕上會(huì)顯示計(jì)數(shù)器的值與計(jì)次。
?接線圖如下:
?

實(shí)物圖如下:

首先配置STM32CubeMX
在Timer中選擇定時(shí)器2來(lái)進(jìn)行配置,1時(shí)鐘源選擇外部時(shí)鐘ETR,2預(yù)分頻設(shè)置為分1頻,3計(jì)數(shù)器模式設(shè)置為向上計(jì)數(shù)模式,4自動(dòng)重裝寄存器設(shè)置為10,5內(nèi)部時(shí)鐘不分頻,6給計(jì)數(shù)器使能。

剩余配置與2.1的配置相同,保存配置后打開(kāi)工程:
開(kāi)始手寫(xiě)代碼部分;
Timer部分代碼:
?
主函數(shù)部分代碼:
?這里同樣會(huì)遇到開(kāi)始計(jì)數(shù)時(shí)為1而不是0的現(xiàn)象,只需要給TIM初始化時(shí),給一個(gè)清除更新中斷的標(biāo)志即可。

做完兩個(gè)實(shí)驗(yàn)發(fā)現(xiàn)我們手寫(xiě)的代碼是一致的,這是由于Cube幫我們寫(xiě)好了初始化,實(shí)際上外部時(shí)鐘初始化的時(shí)候由于要用到GPIO口PA0所以我們要將PA0進(jìn)行初始化,不過(guò)Cube已經(jīng)幫我們配好,所以不需要配置,并且觀察定時(shí)器回調(diào)函數(shù)發(fā)現(xiàn),在HAL庫(kù)中我們不用清除中斷標(biāo)志,當(dāng)中斷執(zhí)行完成之后,會(huì)自動(dòng)回退到主程序,這也是Cube幫我們已經(jīng)寫(xiě)好了原因,所以Cube在幫助代碼這一塊體現(xiàn)了極大的便捷,但是我們也要明白這些是如何得來(lái)的,不然對(duì)學(xué)習(xí)的幫助不會(huì)很大。
?
2.3? PWM驅(qū)動(dòng)LED的呼吸燈
實(shí)驗(yàn)內(nèi)容:
通過(guò)定時(shí)對(duì)GPIO口來(lái)輸出PWM波形,通過(guò)不斷改變占空比來(lái)實(shí)現(xiàn)分辨率為1,頻率為1000Hz的LED呼吸燈,通過(guò)下面公式計(jì)算得到參數(shù)?????
PWM = CK_PSC(內(nèi)部時(shí)鐘預(yù)分頻) / (PSC + 1) / (ARR + 1)=1000 ,
PWM占空比: Duty = CCR / (ARR + 1)(CCR時(shí)刻改變)
PWM分辨率: Reso = 1 / (ARR + 1)=1。
?
接線圖如下:
?

實(shí)物圖如下 :
?

首先配置STM32CubeMX
在Timer中選擇定時(shí)器2來(lái)進(jìn)行配置,1時(shí)鐘源選擇內(nèi)部時(shí)鐘,2選定定時(shí)通道1,3預(yù)分頻設(shè)置為分720-1頻,4計(jì)數(shù)器模式設(shè)置為向上計(jì)數(shù)模式,5自動(dòng)重裝寄存器設(shè)置為100-1,6內(nèi)部時(shí)鐘不分頻,7給計(jì)數(shù)器使能。

接下來(lái)對(duì)PWM通道進(jìn)行設(shè)置給默認(rèn)即可Mode :PWM模式1,Pulse(占空比值) :0,F(xiàn)ast Mode PWM脈沖快速模式 :不使能,PWM 極性: 設(shè)置為高電平(有效電平)。

其他Cube工程的設(shè)置不變,如果想用OLED來(lái)進(jìn)行調(diào)試可以將PB8與PB9設(shè)置為輸出模式。
代碼部分:
PWM模塊代碼:
主函數(shù)模塊:
?
2.4? PWM驅(qū)動(dòng)舵機(jī)
硬件電路:
舵機(jī)是一種根據(jù)輸入PWM信號(hào)占空比來(lái)控制輸出角度的裝置
輸入PWM信號(hào)要求:周期為20ms,高電平寬度為0.5ms~2.5ms
實(shí)物圖如下:

拆分圖如下:

由上圖可以看出舵機(jī)主要由程序圖里面的這些零件組成,可以看出舵機(jī)并不是一種單獨(dú)的電機(jī),它內(nèi)部是由直流電機(jī)驅(qū)動(dòng)的。他里面還有個(gè)控制電路板,是一個(gè)電機(jī)的控制系統(tǒng),大概的執(zhí)行邏輯是PWM信號(hào)輸入到控制板,給控制板一個(gè)指定的目標(biāo)角度,如果大于目標(biāo)角度,電機(jī)就會(huì)反轉(zhuǎn),如果小于目標(biāo),電機(jī)就會(huì)正轉(zhuǎn),最終輸出輸出軸固定的在指定角度,這就是舵機(jī)輸出的具體工作流程,但不管怎么樣,我們只需要知道輸入一個(gè)PWM波形,輸出軸固定在一個(gè)角度就好。對(duì)于舵機(jī)的實(shí)際運(yùn)用通常是來(lái)控制機(jī)器人或者機(jī)械臂的關(guān)節(jié)。
電路圖如下所示:

具體實(shí)驗(yàn)如下:
實(shí)驗(yàn)內(nèi)容:通過(guò)按鍵來(lái)控制輸出不同的PWM信號(hào),改變信號(hào)的占空比將PWM信號(hào)給到舵機(jī)的控制板然后驅(qū)動(dòng)舵機(jī)轉(zhuǎn)動(dòng)。
接線圖如下:

實(shí)物圖如下:

首先配置STM32CubeMX
在Timer中選擇定時(shí)器2來(lái)進(jìn)行配置,1時(shí)鐘源選擇內(nèi)部時(shí)鐘,2選定定時(shí)通道2,3預(yù)分頻設(shè)置為分72-1頻,4計(jì)數(shù)器模式設(shè)置為向上計(jì)數(shù)模式,5自動(dòng)重裝寄存器設(shè)置為20000-1,6內(nèi)部時(shí)鐘不分頻,7給計(jì)數(shù)器使能。
?
接下來(lái)對(duì)PWM通道進(jìn)行設(shè)置給默認(rèn)即可Mode :PWM模式1,Pulse(占空比值)為0,F(xiàn)ast Mode PWM脈沖快速模式設(shè)置為不使能,PWM 極性設(shè)置為高電平(有效電平)與上述基本一致,本節(jié)實(shí)驗(yàn)需要用到按鍵和OLED所以要對(duì)按鍵和OLED顯示屏的GPIO繼續(xù)配置。(按鍵代碼和OLED的代碼可以移植以前的代碼拿來(lái)用,所以宏定義時(shí)與之前一致會(huì)更便捷的進(jìn)行代碼移植)。
代碼部分:
PWM代碼模塊:
Servo代碼模塊
主函數(shù)代碼模塊:
?
2.5? PWM驅(qū)動(dòng)直流電機(jī)
?硬件電路部分:
?直流電機(jī)是一種將電能轉(zhuǎn)換為機(jī)械能的裝置,有兩個(gè)電極,當(dāng)電極正接時(shí),電機(jī)正轉(zhuǎn),當(dāng)電極反接時(shí),電機(jī)反轉(zhuǎn)。
直流電機(jī)屬于大功率器件,GPIO口無(wú)法直接驅(qū)動(dòng),需要配合電機(jī)驅(qū)動(dòng)電路來(lái)操作TB6612是一款雙路H橋型的直流電機(jī)驅(qū)動(dòng)芯片,可以驅(qū)動(dòng)兩個(gè)直流電機(jī)并且控制其轉(zhuǎn)速和方向。(驅(qū)動(dòng)電壓5V,開(kāi)發(fā)板的VCC電壓為3.3V所以需要接到STlink上)。
?直流電機(jī)與驅(qū)動(dòng)電路TB6612實(shí)物圖如下:
?


具體接線電路如下:
?

以上名稱(chēng)的具體含義如下:
?

?
具體實(shí)驗(yàn)如下:
具體實(shí)驗(yàn)內(nèi)容:
通過(guò)按鍵來(lái)輸出不同的PWM信號(hào),改變占空比來(lái)實(shí)現(xiàn)對(duì)直流電機(jī)線圈轉(zhuǎn)速的操縱,同時(shí)可以控制正反轉(zhuǎn),控制正轉(zhuǎn)就是給輸入控制端的電平給一高一低即可,反轉(zhuǎn)給輸入控制段電平相比正轉(zhuǎn)而言設(shè)置相反的高低電平即可。
接線圖:

實(shí)物圖:
?

對(duì)于STM32的工程配置:
?
配置過(guò)程與上述過(guò)程基本一致,把PWM通道改成3即可,同時(shí)與直流電機(jī)相連的IO口配置為輸出模式,其他模式的配置與PWM驅(qū)動(dòng)舵機(jī)的配置基本一致。
?
代碼部分:
?PWM代碼模塊:
Motor模塊(直流電機(jī))
?
主函數(shù)模塊:
?
????
2.6? 輸入捕獲測(cè)定頻率與占空比
PWMI模式就是對(duì)輸入捕獲模式的進(jìn)一步配置,所以直接來(lái)配置PWMI模式來(lái)測(cè)頻率與占空,將PA0設(shè)置為輸出模式,輸出不同的PWM占空比,然后將PA6設(shè)置為PWMI來(lái)接收來(lái)自PA0的信號(hào),并且通過(guò)輸入捕獲模式來(lái)得到PA6端口具體的頻率與占空比,與PA0端口進(jìn)行比較觀察是否一致。
實(shí)驗(yàn)如下:
接線圖:

實(shí)物圖如下:

實(shí)驗(yàn)內(nèi)容如下:
配置STM32CubeMX工程
首先用定時(shí)器2來(lái)輸出一個(gè)PWM信號(hào):在Timer中選擇定時(shí)器2來(lái)進(jìn)行配置,1時(shí)鐘源選擇內(nèi)部時(shí)鐘,2選定定時(shí)通道2,3預(yù)分頻設(shè)置為分720-1頻,4計(jì)數(shù)器模式設(shè)置為向上計(jì)數(shù)模式,5自動(dòng)重裝寄存器設(shè)置為100-1,6內(nèi)部時(shí)鐘不分頻,7給計(jì)數(shù)器使能。(與上一節(jié)操作一致)
接下來(lái)用定時(shí)器來(lái)配置PWMI輸入捕獲通道(將PWM輸出的信號(hào))給輸入到這里來(lái):
1從模式配置為復(fù)位,2選擇內(nèi)部時(shí)鐘源,3打開(kāi)通道1與通道2配置為輸入捕獲模式,4(時(shí)基單元的配置)預(yù)分頻配置為72,自動(dòng)重裝寄存器配置為最大65536(防止計(jì)數(shù)溢出) , 5(輸入捕獲通道配置)通道1的邊沿觸發(fā)器選擇上升沿觸發(fā),分頻選擇不分頻,濾波器參數(shù)配置為0xf,通道2只需要將邊沿改為下降沿即可沿即可。

?

?

程序調(diào)試用OLED顯示屏來(lái)調(diào)試所以對(duì)于OLED的引腳要進(jìn)行配置(PB8與PB9改為輸出模式即可)。其余配置不變,保存配置生成工程即可。
代碼部分:
PWM部分代碼:
Inputcapture部分代碼:
?
主函數(shù)部分代碼:
對(duì)于主函數(shù)這部分代碼里改變PA0占空比和頻率的代碼可以放進(jìn)定時(shí)器里這樣可以實(shí)時(shí)檢測(cè)輸入信號(hào)的頻率和占空比的改變。
?
2.7? 編碼器接口測(cè)速
實(shí)驗(yàn)內(nèi)容:
利用定時(shí)器的編碼器接口,旋轉(zhuǎn)編碼按鈕,根據(jù)旋轉(zhuǎn)編碼器的正交信號(hào)來(lái)控制計(jì)數(shù)器的加減(正轉(zhuǎn)加反轉(zhuǎn)減),通過(guò)OLED顯示屏來(lái)獲取編碼器旋轉(zhuǎn)的速度與正反(正負(fù)號(hào)表示)。
?接線圖:

實(shí)物圖:

首先配置STM32CubeMX的工程:
本章節(jié)需要用到定時(shí)器定時(shí)中斷來(lái)測(cè)速,而當(dāng)定時(shí)器用作編碼器時(shí),其他功能不能照常使用,所以需要一個(gè)定時(shí)器用來(lái)做中斷,一個(gè)用來(lái)做編碼器接口:
給定時(shí)器2配置為每隔一秒進(jìn)一次中斷,記得在NVIC里打開(kāi)定時(shí)器2的中斷:

給定時(shí)器配置為編碼器接口:1模式配置為編碼器接口接收正交編碼的形式時(shí)基單元的配置維持默認(rèn)(預(yù)分頻為0,自動(dòng)重裝值為65535),
2采用A,B相都計(jì)數(shù)的模式(精度更高)。
3采用極性不反轉(zhuǎn)的模式(上升沿在這里的意思時(shí)極性不反轉(zhuǎn))。(通道1和2配置相同)
4濾波器的參數(shù)為0xF.(通道1和2配置相同)
這里截圖只截了通道1的,通道2也要配置。
?

其余配置不變,由于GPIO口引腳復(fù)用所以對(duì)于PA0,PA6與PA7不用專(zhuān)門(mén)配置,然后將OLED的數(shù)據(jù)線與時(shí)鐘線PB9與PB8配置為輸出模式即可。然后保存并打開(kāi)工程。
代碼部分:
Timer部分代碼:
Encoder部分代碼:
主函數(shù)部分代碼: