定時器是單片機中一個非常傳統且重要的外設,定時器的 本質其實就是一個計數器 ,只不過被計數的對象是定時器的時鐘源。定時器要正常工作,需要這幾個要點步驟: 有時鐘源輸入、計數器工作、有一個可以比較的值(自動重裝載值) 。其工作流程是這樣的:計數器會隨著時鐘源對時鐘源提供的脈沖進行計數,計數值不斷上漲(或下降),如果計數值和自動重裝載值一樣,那么計數器的值就會被硬件清零重新計數,這個清零重新計數被稱為定時器計數溢出,這個事情會觸發一個中斷,被叫做 定時器溢出中斷 ,也就是說,定時器依靠對穩定的時鐘源定次數計數來實現定時,并且每一個定時周期完成都會產生溢出中斷。
上面講述的就是任何一個定時器都會具備的功能,只要是個定時器就會有,程序上為了方便,關于上述功能的配置項都被以”base”命名,比如這樣:
看圖中的結構體,這個結構體的成員同樣對應了定時器相關的寄存器,由于定時器本質是一個計數器,所以根據時鐘源的選擇,定時器會有不同的工作模式,如外部計數模式、編碼器模式等。這里選擇定時器模式(就是開頭介紹的那種工作過程),之后定時器會自動選擇單片機自己工作使用的時鐘作為時鐘源,連續計數模式下,定時器會自動重復執行上述溢出中斷的過程,預分頻系數根據用戶需要進行配置,它和下面的重裝載值共同決定定時器的溢出周期。
以圖中的配置為例,該定時器的時鐘源是48MHz,現在需要一個50Hz(也就是周期為20ms)的定時器,該定時器會每20ms觸發一次定時器中斷。在不進行干涉的情況下,定時器每秒會計數48M次,預分頻系數設置成32之后,定時器每秒計數150萬次,將重裝載值設置為30000,定時器在每計數30000次之后觸發一次中斷,1秒觸發50次中斷,正好是需要的50Hz頻率。但是填入的時候不能直接填入30000,因為30000是人類從1開始計算第一個數字得出的結果,計算機的第一個數字是0,因此需要在最后減1。圖中的代碼直接列出了上述文字表達的公式,其中的50就是頻率。
隨后設置好中斷,完成必要的初始化,定時器的基本功能就可以使用了,中斷服務函數可以在函數列表中找到。
好的,你已經掌握了所有單片機定時器的基本用法,不過細心的小伙伴肯定想過:為什么CW32的定時器叫ATIM、GTIM和BTIM呢?TIM就是timer,也就是定時器,A是advanced的縮寫,ATIM就是高級定時器,GTIM是通用定時器,BTIM自然是基本定時器。這是根據功能對定時器資源進行劃分的,這么劃分的好處是不需要查手冊就能通過代碼直接看出來某個定時器具備什么功能,基本定時器只具備上述基本功能,通用定時器額外擁有捕獲/比較功能,高級定時器包含通用定時器所有的功能,而且還有更多其他功能。理論上來說這些附帶的功能都可以通過代碼來實現,但由于很多工業場景需要用到,所以做到硬件層面會更加穩定,也更方便。
本章使用的是通用定時器,下面介紹高級定時器的捕獲/比較功能,因為這個功能很常用。
首先需要著重聲明的一點是,捕獲比較功能大概率擁有多個通道,但是定時器,也就是上述的基礎功能只有一個,所以即使使用很多個捕獲比較通道,其所屬定時器的定時周期也是相同的。
下面就來看看通用定時器的結構框圖,初看這個圖可能會不知所措,我們可以先進行簡單的劃分,框圖上半部分的右側有一個16位計數器,計數器可以從左側選擇輸入的時鐘源,可以對輸入進行分頻。框圖下半部分展示了定時器的4個捕獲比較通道channel1~channel4,通道可以用來輸出也可以用來輸入,但同一時間只能使用輸入|輸出中的一個功能。筆者剛學習單片機的時候,不知道通道是什么,總是稀里糊涂的,通道就是讓信號走的路,放到這里就是說, 這個定時器擁有4個可以用來輸出|輸入的電信號道路 。那這個通道輸出的是什么東西呢?
我們都知道,對電平進行周期反轉就可以制造方波,而定時器基本功能就可以實現這個效果,只需要在中斷中反轉IO電平即可。但是這樣很不方便,比如我想要在不調整周期的情況下去控制方波的占空比,這種原始的辦法就會略顯麻煩,需要在中斷內修改定時器的設置來實現。為了避免這種麻煩,出現了一種帶輸出比較功能的定時器。理念也很簡單,定時器自己有一個在有限區間內周期性增長歸零的計數器,那我直接設置一個新的門限值:當這個自增的計數值小于門限時,輸出高電平;計數值大于門限時,輸出低電平。這就是定時器的輸出比較功能,對應上圖下半部分右側的輸出功能。這種方式可以便捷快速地輸出一個可輕松修改占空比的方波,而這種對信號的處理方式,也叫做 脈寬調制(Pulse-width modulation),簡稱PWM ,用這種方式輸出的方波也叫做PWM波。
現在來看使用PWM功能需要進行哪些操作。先思考,除去基本的定時器配置之外,PWM需要用到捕獲比較通道,那必然會有對比較捕獲功能相關寄存器的配置,它需要輸出一個波,那必定會有引腳相關的初始化。
下面看代碼:首先當然是對IO的初始化,相信經過對前幾章的閱讀,讀者必定是能輕松配置GPIO了,這里著重介紹對PWM輸出功能的配置。第一步當然是找到輸出比較功能的函數,輸出比較的英文是output compare,簡寫是OC,所以直接找到函數“通用定時器_輸出比較初始化”。這個函數有3個參數,按順序分別表示要初始化的定時器是哪個、要初始化的通道是哪個、以及這個通道的輸出模式。 輸出模式就是設定:當計數值大于|小于門限值的時候,是該輸出高電平還是低電平 。這里設定的是計數值小于門限時輸出高電平。第二步就是設置這個關鍵的門限值,我們可以直接找到“通用定時器_設置比較1”來設置門限值,這里我把門限值設定為重裝載值的一半,最后的效果就是輸出一個占空比50%的方波。
對占空比的修改不一定需要用到這個設置占空比的函數,我們可以直接修改寄存器來實現 。單片機中,存儲這個門限值的是一個叫做CCR的寄存器,所以為什么叫CCR?沒錯,他原名叫Capture Comparison Register,所以就簡寫為CCR。定時器的每一個通道都有一個自己的捕獲比較寄存器,所以CCR一共有四個,故而上圖那個設置門限值的函數也有4個,但是由于整個寄存器都只用來裝這一個值,所以我們修改的時候可以直接操作寄存器修改,就像這樣 CW_GTIM1->CCR1=0 ,我們也可以直接對這個賦值號左側的部分進行自增操作或是別的什么操作都可以,但是寫入操作僅限于作為輸出模式時使用。
下面就是緊張刺激的驗證環節了,筆者手上沒有可以接的用來發光的燈泡,所以直接用萬用表測量輸出引腳的電壓來驗證PWM功能,萬用表在測量方波時,會顯示該方波的平均值,所以如果PWM正常,萬用表的直流檔會顯示1.65V左右的電壓,交流檔會顯示3.3V的電壓,這里我為了使現象更明顯,在中斷中對PWM波的占空比進行周期性修改。
經過測量,占空比50%時,PA6輸出電壓為1.62V,算上誤差這個在預期結果內。而加入中斷的代碼后,萬用表示數會周期性跳變,符合預期結果,可以認定該配置下,PWM功能正常工作。
審核編輯 黃宇
-
寄存器
+關注
關注
31文章
5336瀏覽量
120230 -
PWM
+關注
關注
114文章
5181瀏覽量
213796 -
時鐘
+關注
關注
10文章
1733瀏覽量
131446 -
定時器
+關注
關注
23文章
3246瀏覽量
114719 -
CW32
+關注
關注
1文章
203瀏覽量
626
發布評論請先 登錄
相關推薦
評論