有的傳感器會(huì)輸出脈沖信號(hào),MCU需要統(tǒng)計(jì)脈沖輸入的個(gè)數(shù),通常有如下實(shí)現(xiàn)方式:
1.GPIO中斷
原理很簡(jiǎn)單,利用GPIO的上升沿或者下降沿中斷,進(jìn)中斷的次數(shù)就是脈沖的個(gè)數(shù)。只需要在中斷服務(wù)函數(shù)里計(jì)數(shù)即可。
使用GPIO中斷需要注意:
- 脈沖信號(hào)的頻率不能太高,否則MCU可能處理不過(guò)來(lái)GPIO中斷處理程序應(yīng)盡可能短,否則影響處理速度GPIO中斷優(yōu)先級(jí)應(yīng)高,否則會(huì)延遲對(duì)脈沖信號(hào)的處理
我們先用一個(gè)板子產(chǎn)生頻率為10Khz的PWM波,時(shí)長(zhǎng)為100ms 。
下降沿的脈沖數(shù)理論為100ms/0.1ms=1000個(gè),實(shí)際上因?yàn)橛猩僭S誤差,從上面邏輯分析儀可以看到實(shí)際脈沖數(shù)為1.009k,即1009個(gè)。然后將PWM接到另外一個(gè)板子的GPIO引腳上,開(kāi)啟下降沿中斷,在中斷服務(wù)函數(shù)中計(jì)數(shù),可以看到實(shí)際值就是1009。
2.定時(shí)器輸入捕獲
輸入捕獲常用來(lái)測(cè)量脈沖寬度和頻率,它也可以用來(lái)對(duì)脈沖計(jì)數(shù)。它的原理和上述GPIO中斷類(lèi)似,只不過(guò)用的是定時(shí)器的輸入捕獲中斷。
3.定時(shí)器用作計(jì)數(shù)
定時(shí)器和計(jì)數(shù)器其實(shí)很相似,只不過(guò)定時(shí)器是對(duì)內(nèi)部的時(shí)鐘脈沖進(jìn)行計(jì)數(shù),計(jì)數(shù)到一定數(shù)值時(shí)就可以根據(jù)頻率,計(jì)算出時(shí)間。
而計(jì)數(shù)器是對(duì)外部脈沖進(jìn)行計(jì)數(shù),即外部引腳每發(fā)生一次變化,計(jì)數(shù)器就計(jì)數(shù)一次。
可以將外部脈沖信號(hào)接入到MCU的TIMx_ETR引腳,就可以使用MCU的定時(shí)器來(lái)計(jì)數(shù)。
它的使用也很簡(jiǎn)單,主要就是配置TIMx_SMCR寄存器(slave mode control register),具體可以參考芯片參考手冊(cè)。
可以看到定時(shí)器CNT的值就是脈沖的個(gè)數(shù)。
總結(jié):
1)盡量使用TIMER ETR引腳通過(guò)計(jì)數(shù)器方式來(lái)實(shí)現(xiàn)脈沖計(jì)數(shù),如果條件不允許,外部脈沖輸入頻率不是很高,也可以使用GPIO中斷來(lái)實(shí)現(xiàn),不過(guò)還是要同時(shí)考慮高頻中斷對(duì)整體系統(tǒng)的影響。比如上面MCU主頻是48Mhz,將10Khz調(diào)整為100Khz,實(shí)測(cè)GPIO中斷還可以準(zhǔn)確計(jì)數(shù),但是當(dāng)再繼續(xù)增大到1Mhz時(shí),就處理不過(guò)來(lái)了,實(shí)測(cè)發(fā)出約50000個(gè)脈沖,GPIO中斷只測(cè)出了10206個(gè),而使用計(jì)數(shù)器模式則可以準(zhǔn)確的計(jì)數(shù)。
2)如果使用GPIO中斷計(jì)數(shù),要特別注意GPIO上不能有接地的電容,否則會(huì)改變脈沖波形,導(dǎo)致錯(cuò)誤的計(jì)數(shù)。
關(guān)注公眾號(hào),掃碼加入嵌入式交流群: