有的傳感器會輸出脈沖信號,MCU需要統計脈沖輸入的個數,通常有如下實現方式:
1.GPIO中斷
原理很簡單,利用GPIO的上升沿或者下降沿中斷,進中斷的次數就是脈沖的個數。只需要在中斷服務函數里計數即可。
使用GPIO中斷需要注意:
脈沖信號的頻率不能太高,否則MCU可能處理不過來
GPIO中斷處理程序應盡可能短,否則影響處理速度
GPIO中斷優先級應高,否則會延遲對脈沖信號的處理
我們先用一個板子產生頻率為10Khz的PWM波,時長為100ms 。
下降沿的脈沖數理論為100ms/0.1ms=1000個,實際上因為有少許誤差,從上面邏輯分析儀可以看到實際脈沖數為1.009k,即1009個。
然后將PWM接到另外一個板子的GPIO引腳上,開啟下降沿中斷,在中斷服務函數中計數,可以看到實際值就是1009。
2.定時器輸入捕獲
輸入捕獲常用來測量脈沖寬度和頻率,它也可以用來對脈沖計數。
它的原理和上述GPIO中斷類似,只不過用的是定時器的輸入捕獲中斷。
3.定時器用作計數
定時器和計數器其實很相似,只不過定時器是對內部的時鐘脈沖進行計數,計數到一定數值時就可以根據頻率,計算出時間。
而計數器是對外部脈沖進行計數,即外部引腳每發生一次變化,計數器就計數一次。
可以將外部脈沖信號接入到MCU的TIMx_ETR引腳,就可以使用MCU的定時器來計數。
它的使用也很簡單,主要就是配置TIMx_SMCR寄存器(slave mode control register),具體可以參考芯片參考手冊。
可以看到定時器CNT的值就是脈沖的個數。
總結:
1)盡量使用TIMER ETR引腳通過計數器方式來實現脈沖計數,如果條件不允許,外部脈沖輸入頻率不是很高,也可以使用GPIO中斷來實現,不過還是要同時考慮高頻中斷對整體系統的影響。比如上面MCU主頻是48Mhz,將10Khz調整為100Khz,實測GPIO中斷還可以準確計數,但是當再繼續增大到1Mhz時,就處理不過來了,實測發出約50000個脈沖,GPIO中斷只測出了10206個,而使用計數器模式則可以準確的計數。
2)如果使用GPIO中斷計數,要特別注意GPIO上不能有接地的電容,否則會改變脈沖波形,導致錯誤的計數。
審核編輯:劉清
-
mcu
+關注
關注
146文章
17316瀏覽量
352507 -
脈沖信號
+關注
關注
6文章
400瀏覽量
37070 -
GPIO
+關注
關注
16文章
1216瀏覽量
52346 -
PWM波
+關注
關注
0文章
99瀏覽量
16939
原文標題:MCU如何實現對外部脈沖信號的計數功能?
文章出處:【微信號:TopSemic,微信公眾號:TopSemic嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論