本章以CW32通用定時(shí)器為例介紹單片機(jī)定時(shí)器的用法。
定時(shí)器是單片機(jī)中一個(gè)非常傳統(tǒng)且重要的外設(shè),定時(shí)器的 本質(zhì)其實(shí)就是一個(gè)計(jì)數(shù)器 ,只不過(guò)被計(jì)數(shù)的對(duì)象是定時(shí)器的時(shí)鐘源。定時(shí)器要正常工作,需要這幾個(gè)要點(diǎn)步驟: 有時(shí)鐘源輸入、計(jì)數(shù)器工作、有一個(gè)可以比較的值(自動(dòng)重裝載值) 。其工作流程是這樣的:計(jì)數(shù)器會(huì)隨著時(shí)鐘源對(duì)時(shí)鐘源提供的脈沖進(jìn)行計(jì)數(shù),計(jì)數(shù)值不斷上漲(或下降),如果計(jì)數(shù)值和自動(dòng)重裝載值一樣,那么計(jì)數(shù)器的值就會(huì)被硬件清零重新計(jì)數(shù),這個(gè)清零重新計(jì)數(shù)被稱為定時(shí)器計(jì)數(shù)溢出,這個(gè)事情會(huì)觸發(fā)一個(gè)中斷,被叫做 定時(shí)器溢出中斷 ,也就是說(shuō),定時(shí)器依靠對(duì)穩(wěn)定的時(shí)鐘源定次數(shù)計(jì)數(shù)來(lái)實(shí)現(xiàn)定時(shí),并且每一個(gè)定時(shí)周期完成都會(huì)產(chǎn)生溢出中斷。
上面講述的就是任何一個(gè)定時(shí)器都會(huì)具備的功能,只要是個(gè)定時(shí)器就會(huì)有,程序上為了方便,關(guān)于上述功能的配置項(xiàng)都被以”base”命名,比如這樣:
看圖中的結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體的成員同樣對(duì)應(yīng)了定時(shí)器相關(guān)的寄存器,由于定時(shí)器本質(zhì)是一個(gè)計(jì)數(shù)器,所以根據(jù)時(shí)鐘源的選擇,定時(shí)器會(huì)有不同的工作模式,如外部計(jì)數(shù)模式、編碼器模式等。這里選擇定時(shí)器模式(就是開頭介紹的那種工作過(guò)程),之后定時(shí)器會(huì)自動(dòng)選擇單片機(jī)自己工作使用的時(shí)鐘作為時(shí)鐘源,連續(xù)計(jì)數(shù)模式下,定時(shí)器會(huì)自動(dòng)重復(fù)執(zhí)行上述溢出中斷的過(guò)程,預(yù)分頻系數(shù)根據(jù)用戶需要進(jìn)行配置,它和下面的重裝載值共同決定定時(shí)器的溢出周期。
以圖中的配置為例,該定時(shí)器的時(shí)鐘源是48MHz,現(xiàn)在需要一個(gè)50Hz(也就是周期為20ms)的定時(shí)器,該定時(shí)器會(huì)每20ms觸發(fā)一次定時(shí)器中斷。在不進(jìn)行干涉的情況下,定時(shí)器每秒會(huì)計(jì)數(shù)48M次,預(yù)分頻系數(shù)設(shè)置成32之后,定時(shí)器每秒計(jì)數(shù)150萬(wàn)次,將重裝載值設(shè)置為30000,定時(shí)器在每計(jì)數(shù)30000次之后觸發(fā)一次中斷,1秒觸發(fā)50次中斷,正好是需要的50Hz頻率。但是填入的時(shí)候不能直接填入30000,因?yàn)?0000是人類從1開始計(jì)算第一個(gè)數(shù)字得出的結(jié)果,計(jì)算機(jī)的第一個(gè)數(shù)字是0,因此需要在最后減1。圖中的代碼直接列出了上述文字表達(dá)的公式,其中的50就是頻率。
隨后設(shè)置好中斷,完成必要的初始化,定時(shí)器的基本功能就可以使用了,中斷服務(wù)函數(shù)可以在函數(shù)列表中找到。
好的,你已經(jīng)掌握了所有單片機(jī)定時(shí)器的基本用法,不過(guò)細(xì)心的小伙伴肯定想過(guò):為什么CW32的定時(shí)器叫ATIM、GTIM和BTIM呢?TIM就是timer,也就是定時(shí)器,A是advanced的縮寫,ATIM就是高級(jí)定時(shí)器,GTIM是通用定時(shí)器,BTIM自然是基本定時(shí)器。這是根據(jù)功能對(duì)定時(shí)器資源進(jìn)行劃分的,這么劃分的好處是不需要查手冊(cè)就能通過(guò)代碼直接看出來(lái)某個(gè)定時(shí)器具備什么功能,基本定時(shí)器只具備上述基本功能,通用定時(shí)器額外擁有捕獲/比較功能,高級(jí)定時(shí)器包含通用定時(shí)器所有的功能,而且還有更多其他功能。理論上來(lái)說(shuō)這些附帶的功能都可以通過(guò)代碼來(lái)實(shí)現(xiàn),但由于很多工業(yè)場(chǎng)景需要用到,所以做到硬件層面會(huì)更加穩(wěn)定,也更方便。
本章使用的是通用定時(shí)器,下面介紹高級(jí)定時(shí)器的捕獲/比較功能,因?yàn)檫@個(gè)功能很常用。
首先需要著重聲明的一點(diǎn)是,捕獲比較功能大概率擁有多個(gè)通道,但是定時(shí)器,也就是上述的基礎(chǔ)功能只有一個(gè),所以即使使用很多個(gè)捕獲比較通道,其所屬定時(shí)器的定時(shí)周期也是相同的。
下面就來(lái)看看通用定時(shí)器的結(jié)構(gòu)框圖,初看這個(gè)圖可能會(huì)不知所措,我們可以先進(jìn)行簡(jiǎn)單的劃分,框圖上半部分的右側(cè)有一個(gè)16位計(jì)數(shù)器,計(jì)數(shù)器可以從左側(cè)選擇輸入的時(shí)鐘源,可以對(duì)輸入進(jìn)行分頻??驁D下半部分展示了定時(shí)器的4個(gè)捕獲比較通道channel1~channel4,通道可以用來(lái)輸出也可以用來(lái)輸入,但同一時(shí)間只能使用輸入|輸出中的一個(gè)功能。筆者剛學(xué)習(xí)單片機(jī)的時(shí)候,不知道通道是什么,總是稀里糊涂的,通道就是讓信號(hào)走的路,放到這里就是說(shuō), 這個(gè)定時(shí)器擁有4個(gè)可以用來(lái)輸出|輸入的電信號(hào)道路 。那這個(gè)通道輸出的是什么東西呢?
我們都知道,對(duì)電平進(jìn)行周期反轉(zhuǎn)就可以制造方波,而定時(shí)器基本功能就可以實(shí)現(xiàn)這個(gè)效果,只需要在中斷中反轉(zhuǎn)IO電平即可。但是這樣很不方便,比如我想要在不調(diào)整周期的情況下去控制方波的占空比,這種原始的辦法就會(huì)略顯麻煩,需要在中斷內(nèi)修改定時(shí)器的設(shè)置來(lái)實(shí)現(xiàn)。為了避免這種麻煩,出現(xiàn)了一種帶輸出比較功能的定時(shí)器。理念也很簡(jiǎn)單,定時(shí)器自己有一個(gè)在有限區(qū)間內(nèi)周期性增長(zhǎng)歸零的計(jì)數(shù)器,那我直接設(shè)置一個(gè)新的門限值:當(dāng)這個(gè)自增的計(jì)數(shù)值小于門限時(shí),輸出高電平;計(jì)數(shù)值大于門限時(shí),輸出低電平。這就是定時(shí)器的輸出比較功能,對(duì)應(yīng)上圖下半部分右側(cè)的輸出功能。這種方式可以便捷快速地輸出一個(gè)可輕松修改占空比的方波,而這種對(duì)信號(hào)的處理方式,也叫做 脈寬調(diào)制(Pulse-width modulation),簡(jiǎn)稱PWM ,用這種方式輸出的方波也叫做PWM波。
現(xiàn)在來(lái)看使用PWM功能需要進(jìn)行哪些操作。先思考,除去基本的定時(shí)器配置之外,PWM需要用到捕獲比較通道,那必然會(huì)有對(duì)比較捕獲功能相關(guān)寄存器的配置,它需要輸出一個(gè)波,那必定會(huì)有引腳相關(guān)的初始化。
下面看代碼:首先當(dāng)然是對(duì)IO的初始化,相信經(jīng)過(guò)對(duì)前幾章的閱讀,讀者必定是能輕松配置GPIO了,這里著重介紹對(duì)PWM輸出功能的配置。第一步當(dāng)然是找到輸出比較功能的函數(shù),輸出比較的英文是output compare,簡(jiǎn)寫是OC,所以直接找到函數(shù)“通用定時(shí)器_輸出比較初始化”。這個(gè)函數(shù)有3個(gè)參數(shù),按順序分別表示要初始化的定時(shí)器是哪個(gè)、要初始化的通道是哪個(gè)、以及這個(gè)通道的輸出模式。 輸出模式就是設(shè)定:當(dāng)計(jì)數(shù)值大于|小于門限值的時(shí)候,是該輸出高電平還是低電平 。這里設(shè)定的是計(jì)數(shù)值小于門限時(shí)輸出高電平。第二步就是設(shè)置這個(gè)關(guān)鍵的門限值,我們可以直接找到“通用定時(shí)器_設(shè)置比較1”來(lái)設(shè)置門限值,這里我把門限值設(shè)定為重裝載值的一半,最后的效果就是輸出一個(gè)占空比50%的方波。
對(duì)占空比的修改不一定需要用到這個(gè)設(shè)置占空比的函數(shù),我們可以直接修改寄存器來(lái)實(shí)現(xiàn) 。單片機(jī)中,存儲(chǔ)這個(gè)門限值的是一個(gè)叫做CCR的寄存器,所以為什么叫CCR?沒(méi)錯(cuò),他原名叫Capture Comparison Register,所以就簡(jiǎn)寫為CCR。定時(shí)器的每一個(gè)通道都有一個(gè)自己的捕獲比較寄存器,所以CCR一共有四個(gè),故而上圖那個(gè)設(shè)置門限值的函數(shù)也有4個(gè),但是由于整個(gè)寄存器都只用來(lái)裝這一個(gè)值,所以我們修改的時(shí)候可以直接操作寄存器修改,就像這樣 CW_GTIM1->CCR1=0 ,我們也可以直接對(duì)這個(gè)賦值號(hào)左側(cè)的部分進(jìn)行自增操作或是別的什么操作都可以,但是寫入操作僅限于作為輸出模式時(shí)使用。
下面就是緊張刺激的驗(yàn)證環(huán)節(jié)了,筆者手上沒(méi)有可以接的用來(lái)發(fā)光的燈泡,所以直接用萬(wàn)用表測(cè)量輸出引腳的電壓來(lái)驗(yàn)證PWM功能,萬(wàn)用表在測(cè)量方波時(shí),會(huì)顯示該方波的平均值,所以如果PWM正常,萬(wàn)用表的直流檔會(huì)顯示1.65V左右的電壓,交流檔會(huì)顯示3.3V的電壓,這里我為了使現(xiàn)象更明顯,在中斷中對(duì)PWM波的占空比進(jìn)行周期性修改。
經(jīng)過(guò)測(cè)量,占空比50%時(shí),PA6輸出電壓為1.62V,算上誤差這個(gè)在預(yù)期結(jié)果內(nèi)。而加入中斷的代碼后,萬(wàn)用表示數(shù)會(huì)周期性跳變,符合預(yù)期結(jié)果,可以認(rèn)定該配置下,PWM功能正常工作。
審核編輯 黃宇
-
寄存器
+關(guān)注
關(guān)注
31文章
5372瀏覽量
121294 -
PWM
+關(guān)注
關(guān)注
114文章
5201瀏覽量
214976 -
時(shí)鐘
+關(guān)注
關(guān)注
11文章
1747瀏覽量
131865 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3256瀏覽量
115450 -
CW32
+關(guān)注
關(guān)注
1文章
218瀏覽量
752
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
【有那么點(diǎn)詳細(xì)的CW32學(xué)習(xí)筆記】單片機(jī)啟動(dòng)\庫(kù)函數(shù)構(gòu)成
![【<b class='flag-5'>有</b><b class='flag-5'>那么點(diǎn)</b><b class='flag-5'>詳細(xì)</b>的<b class='flag-5'>CW32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】單片機(jī)啟動(dòng)\庫(kù)函數(shù)構(gòu)成](https://file1.elecfans.com/web2/M00/90/03/wKgaomTUVG2ANVRbAA577myiy30508.png)
【應(yīng)用筆記】CW32 電容式觸摸按鍵設(shè)計(jì)指南
![【應(yīng)用<b class='flag-5'>筆記</b>】<b class='flag-5'>CW32</b> 電容式觸摸按鍵設(shè)計(jì)指南](https://file1.elecfans.com/web2/M00/8B/FA/wKgaomSjlZmABUOJAACkxMB3hDw147.png)
【有那么點(diǎn)詳細(xì)的CW32學(xué)習(xí)筆記】看手冊(cè)配置時(shí)鐘樹
![【<b class='flag-5'>有</b><b class='flag-5'>那么點(diǎn)</b><b class='flag-5'>詳細(xì)</b>的<b class='flag-5'>CW32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】看手冊(cè)配置時(shí)鐘樹](https://file1.elecfans.com/web2/M00/90/EA/wKgaomTdwDyAKxhFAAK8fsm0RSI617.png)
【有那么點(diǎn)詳細(xì)的CW32學(xué)習(xí)筆記】模數(shù)轉(zhuǎn)換器
![【<b class='flag-5'>有</b><b class='flag-5'>那么點(diǎn)</b><b class='flag-5'>詳細(xì)</b>的<b class='flag-5'>CW32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】模數(shù)轉(zhuǎn)換<b class='flag-5'>器</b>](https://file1.elecfans.com/web2/M00/C1/D0/wKgZomXe2xGACIsPAAORHVtF7mQ820.png)
STM32通用定時(shí)器學(xué)習(xí)筆記
【應(yīng)用筆記】CW32 自舉程序中使用的 ISP 協(xié)議
【CW32飯盒派開發(fā)板試用體驗(yàn)】+定時(shí)器操作初探討
STM32CubeMX學(xué)習(xí)筆記(23)——通用定時(shí)器接口使用(輸入捕獲測(cè)量脈寬)
![STM32CubeMX<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>(23)——<b class='flag-5'>通用</b><b class='flag-5'>定時(shí)器</b>接口使用(輸入捕獲測(cè)量脈寬)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32CubeMX學(xué)習(xí)筆記(5)——基本定時(shí)器接口使用
![STM32CubeMX<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>(5)——基本<b class='flag-5'>定時(shí)器</b>接口使用](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
應(yīng)用筆記-CW32 自舉程序中使用的 ISP 協(xié)議
【有那么點(diǎn)詳細(xì)的CW32學(xué)習(xí)筆記】通用異步收發(fā)器—發(fā)送篇
![【<b class='flag-5'>有</b><b class='flag-5'>那么點(diǎn)</b><b class='flag-5'>詳細(xì)</b>的<b class='flag-5'>CW32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】<b class='flag-5'>通用</b>異步收發(fā)<b class='flag-5'>器</b>—發(fā)送篇](https://file1.elecfans.com/web2/M00/B0/AC/wKgZomVXMlOAcHnhAAB6IPl3PBc244.jpg)
【有那么點(diǎn)詳細(xì)的CW32學(xué)習(xí)筆記】IIC接口-主機(jī)發(fā)送
![【<b class='flag-5'>有</b><b class='flag-5'>那么點(diǎn)</b><b class='flag-5'>詳細(xì)</b>的<b class='flag-5'>CW32</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】IIC接口-主機(jī)發(fā)送](https://file1.elecfans.com/web2/M00/BB/FE/wKgZomWeiQWAKEeBAACrG_jJKww287.jpg)
評(píng)論