加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

最強 PWM 輸入原理解析貼

2021/08/30
696
閱讀需 8 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

上一篇文章《領(lǐng)悟最強 PWM 捕獲功能,1 MHz 》魚鷹介紹了最強 PWM 一些基本特性,今天魚鷹從原理上介紹如何實現(xiàn)該功能。

介紹之前,首先介紹一下 STM32F103 TIM 的一些相關(guān)特性:

  1. 無法使用外部引腳中斷觸發(fā) DMA (有些型號可以)無法使用 TIM 同時捕獲上升沿和下降沿。你在庫里面看到的宏其實在使用時受到了限制,高級定時器1、8,通用定時器2、3、4、5都不行,而一般103 就只帶這些定時器。

3、高頻信號輸入時,中斷進入很頻繁,如果是 100 K 頻率,你需要 5 us 進入一次(高低電平各一次,還是在占空比為 50 % 情況下,其它占空比條件更為苛刻),如果采用中斷處理方式,你必須在中斷中完成很多操作(清標志、計算、翻轉(zhuǎn)極性等),同時你需要保證這兩次中斷不能被全局中斷禁止,或者被高優(yōu)先級中斷打斷,否則,你得到的可能就不是一次脈沖的高電平了,這樣你的占空比、頻率都將計算出錯。正因為有如上問題,而捕獲 PWM 脈沖又是比較常見的功能,所以需要一個高效的捕獲程序完成該工作。而魚鷹今天介紹的實現(xiàn)原理我認為就是最高效的。100K 頻率誤差 0%,占空比誤差1%!在嵌入式中,100 K 頻率已經(jīng)算比較高的了,當然是在關(guān)注占空比情況下,如果只關(guān)注頻率,那么可測量的頻率將更高??赡苡行┤藭Ц?,說,干嘛不使用 FPGA。魚鷹當然知道有比單片機更有效的捕獲器件,因為我自己買的邏輯分析儀(想買這個的可以找魚鷹預定,可以給一定的優(yōu)惠,預定人數(shù)需要10個以上)就可以捕獲很高的頻率、精度,但問題在于成本,在于有必要嗎?這個邏輯分析儀可是幾百大洋啊。閑話不多說,魚鷹首先介紹一下該捕獲方法的基本原理。很簡單,就是利用二進制溢出特性實現(xiàn)的。(2038問題-動圖)

 

這個特性魚鷹在筆記中也多次介紹了其中的應(yīng)用,比如無鎖隊列、擴展定時器、編碼器、延時等,今天就再加一個應(yīng)用,PWM 捕獲(本篇筆記不介紹這個特性原理,可以看歷史相關(guān)筆記)??梢哉f理解了這個特性,在各種整型數(shù)據(jù)處理中如虎添翼,再也不擔心數(shù)據(jù)溢出的問題,反而要利用該特性完成一些騷操作,比如今天 PWM 捕獲就是如此。另一個絕技就是使用 DMA 了,這是它高效可靠的原因。首先我們看看定時器的構(gòu)成框圖:

上面標注部分就是為什么 PWM 輸入模式只能使用通道 1 或通道 2 的原因。這里我們以TI1作為PWM輸入,兩個捕獲通道同時捕獲 TI1 為例說明?;九渲萌缦拢?/p>

  1. 捕獲通道 1 觸發(fā) DMA,同時設(shè)置捕獲上升沿,這樣,只要上升沿觸發(fā)了,可以自動完成捕獲并DMA傳輸至用戶緩存。通道 2 下降沿捕獲,不觸發(fā) DMA。配置DMA,傳輸外設(shè)地址不是某一個寄存器,而是 DMAR,同時設(shè)置傳輸數(shù)量,這一定是 2 的倍數(shù),因為一次需要傳輸兩次,32 位寬度。因為需要傳輸兩次 CCRx,所以需要正確設(shè)置 DCR 寄存器。

以上配置就是整個功能最為關(guān)鍵的部分。如果你理解了下面介紹的捕獲原理,你自然知道為什么需要這么設(shè)置了。我們首先看看 PWM 捕獲時基本工作過程:

 

另外還需要了解 TIM 一個很重要的DMA 傳輸特性:通過配置寄存器,可以一次觸發(fā),多次DMA連續(xù)傳輸,這個特性在這個功能中也被用上了。

如何利用這個功能呢?一般我們配置 DMA 傳輸時,比如串口,一般外設(shè)地址就是 DR 寄存器。而如果我們想傳輸 TIM 的捕獲值,我們可以設(shè)置成 CCR1 寄存器的地址。這樣也可以正常傳輸,但是只能在觸發(fā)時傳輸一個寄存器的值,如果需要把兩次捕獲值都傳輸,那么就需要配置兩個 DMA 通道完成,但這里又涉及到了兩個 DMA 通道同步的問題,因為你肯定希望每次采集的兩個數(shù)據(jù)都屬于同一個脈沖。所以 TIM 用了這兩個寄存器解決這個問題,通過 DMAR 中轉(zhuǎn),就可以完成一次觸發(fā),連續(xù)傳輸兩個 CCR 的值。想必看到這里,你應(yīng)該大概知道該捕獲的原理是什么了。

 

這里魚鷹再結(jié)合上圖描述一下。初始化(定時器、DMA、GPIO)完成后,定時器就準備好工作了,一旦有一個脈沖輸入,上升沿觸發(fā),此時因為設(shè)置了 DMA 觸發(fā),同時設(shè)置了連續(xù)傳輸兩個寄存器,所以它會把當前的 CCR1 和上一次捕獲的 CCR2(下降沿觸發(fā))傳輸?shù)接脩艟彺?,這是兩次 DMA 傳輸,所以DMA的計數(shù)器會遞減兩次。并且 CCR1 的值比 CCR2 的值大(不考慮溢出情況下,并且差值情況下,大小沒有意義)。這樣,上面的三次觸發(fā),我們可以得到三組捕獲數(shù)據(jù)。

通過 (uint16_t)(CCR1 – CCR2),我們可以得到低電平,而通過兩次CCR1 或者 CCR2 的差值,我們可以得到周期。這樣計算頻率和占空比就不是什么難事了。特別需要注意的是,三次上升沿捕獲期間,定時器不可以產(chǎn)生溢出現(xiàn)象,這可以通過定時器分頻實現(xiàn)。分頻系數(shù)越小,分辨率越高,但越容易溢出。

這里要注意的是,如果頻率比較高,建議多測量幾組數(shù)據(jù),然后取后面幾組數(shù)據(jù)進行簡單平均或中值計算(具體根據(jù)捕獲值來確定),這樣準確度更高一些,因為剛開始可能因為初始化的緣故,導致意外捕獲,這是可能的(剛開始不確定可以測個 64 組再說)。另外如果輸入 PWM 頻率或占空比會不斷變化,也需要根據(jù)情況多測幾組(或定時測),并進行簡單處理,這樣不容易剛好捕獲到變化的脈沖,保證脈沖計算的可靠性。

總之,怎么去讓你的程序更加可靠就是各位道友的事情了,魚鷹只是提供一個解決思路。另外魚鷹不準備提供源碼給各位道友,自由發(fā)揮吧。如果確實有需要的話,在本篇文章更新前的時間里,道友有過贊賞或者留言被置頂或轉(zhuǎn)發(fā)支持的情況,那么也可以主動聯(lián)系魚鷹,魚鷹可以給一份參考程序,僅供參考。

來源:公眾號【魚鷹談單片機】

作者:魚鷹Osprey(emOsprey)

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

六年開發(fā)經(jīng)驗,豐富的KEIL調(diào)試經(jīng)驗,STM32使用經(jīng)驗,C語言運用經(jīng)驗。