硬體:stm32f103c8t6
平台: arm-mdk v5.11
前面一篇文章講過如何利用定時器測量訊號的頻率(見[stm32f10x] 利用定時器測量頻率),使用的是定時器的捕獲/比較單元(capture/compare),它也可以測量輸入訊號的脈衝寬度。
利用定時器測量脈衝寬度有兩種方法。
方法1:
在捕獲中斷函式裡改變捕獲訊號的觸發沿(上公升沿觸發改為下降沿觸發,或者下降沿觸發改為上公升沿觸發),通過兩次觸發得到的計數器的差值,來計算出脈衝寬度。這種
方法需要定時器的配置和[stm32f10x] 利用定時器測量頻率方法是一樣的,不同的地方在中斷函式裡修改觸發沿,以tim2, 捕獲通道2為例:
if(capstate ==0)else
if(capstate ==1)
else
capstate = 0;
}
當然,在第一次捕獲的時候將計數器清零,然後第二次捕獲直接讀取捕獲值也是乙個不錯的選擇,如下,
if(capstate == 0)
else
if(capstate == 1
)
觸發沿的配置在ccer這個暫存器裡面,這裡直接對暫存器進行操作,具體請查閱stm32f10x的參考說明書。
方法2:
利用定時器的pwm輸入模式(pwm input mode)。所謂的pwm模式,其實就是利通了定時器捕獲單元對映功能,定時器捕獲單元1(ic1)和捕獲單元2(ic2)可以對映
到同乙個捕獲通道,乙個捕獲單元配置成捕獲上公升沿訊號,另乙個捕獲單元配置成捕獲下降沿訊號,那麼兩個捕獲值的差就是脈衝寬度的值。還是以tim2, 捕獲通道2
為例,配置**如下:
1void captureconfig(void)2
各行**的意思:
l2: 指定捕獲單元的對映方式,tim_icselection_indirectti 說明捕獲單元1(ic1)和捕獲單元2(ic2)對映到捕獲通道2(ti2,這裡是指捕獲通道2,區別
定時器tim2),假如該值為tim_icselection_directti,則捕獲單元1(ic1)和捕獲單元2(ic2)對映到捕獲通道1(ti1)。
l8, l9: 指定捕獲單元觸發的訊號沿(上公升沿還是下降沿)。tim_channel_1對應捕獲單元1(ic1),tim_channel_2對應捕獲單元2(ic2)注意這裡
只需要指定乙個捕獲單元,另乙個捕獲單元將會在呼叫初始化函式tim_pwmicconfig時設定為相反的邊沿。
l16: 允許捕獲單元1和捕獲單元2的中斷。
這樣,當捕獲通道2(ti2)檢測到上公升沿時,捕獲單元1(ic1)將會記錄下計數器的值,同時捕獲單元1的中斷標誌位(cc1if)將置位;
當捕獲通道2(ti2)檢測到下降沿時,捕獲單元2(ic2)將會記錄下計數器的值,同時捕獲單元2的中斷中斷標誌位(cc2f)將置位。
中斷處理函式示例**如下:
if(tim_getitstatus(demod_capture_tim, tim_it_cc1) ==set)else
if(tim_getitstatus(demod_capture_tim, tim_it_cc2) ==set)
總結:
stm32f10x系列的定時器是乙個很靈活的東西,想靈活應用它首先要理解它的原理和運作的過程。定時器的捕獲單元和捕獲通道是比較容易混淆的兩個東西
簡單來說,stm32f10x的每個通用定時器有4個捕獲通道(ti1, ti2, ti3, ti4, 對應4個gpio口),每個捕獲通道對應乙個捕獲單元,即ic1, ic2, ic3, ic4,
其中捕獲單元1和捕獲單元2可以對映到同乙個捕獲通道,ti1或者ti2。
STM32F10x 學習筆記之基本定時器
大容量的stm32f101xx stm32f103xx系列和互聯型產品中包含了兩個基本定時器,tim6和tim7。這兩個定時器功能非常簡單,基本上和systick 定時器相當。但是我在使用的時候確是費了一番周折才除錯通過,所以還是應該將這兩個定時器的使用方法好好的寫一寫。基本定時器tim6和tim7...
STM32F10x系列 中斷
概念問題 中斷與事件有什麼聯絡與區別?stm32之中斷與事件 中斷與事件的區別 簡單概括下。中斷 cpu單執行緒情況下只能處理單一任務,在有零時任務需要處理時,可以暫時放下當前任務,優先處理零時任務,再回過來處理之前的任務。多個中斷可以進行巢狀,比如產生了多個零時任務,那麼就可以按照優先順序處理這多...
STM32F10X入門 流水燈
2019 3 16 2019 3 19 core cm32.c stdin.h中定義了字元型 stm32f10x.h stm32f10x conf.h中定義了引用的外設標頭檔案 庫檔案之間的依賴呼叫關係 pngstm32f10x.h檢視位址對映 比如define gpioa base apb2per...