• 正文
    • 領(lǐng)悟
    • 效果
    • 優(yōu)缺點
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

洗衣時,領(lǐng)悟最強 PWM 捕獲功能,1 MHz

2021/08/30
427
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

起因

一直想通過定時器的捕獲通道捕獲 PWM,這種需求是非?;镜?。各種開發(fā)板例程也都有,但是精度不怎么樣,能捕獲的頻率也不是很高。對于高頻和高精度情況下明顯不適用。

有經(jīng)驗的工程師會選擇參考手冊中介紹的 PWM 輸入捕獲功能,但是該功能有一個很大的限制:

一個定時器有四個通道,但是只有兩個通道才可以使用  PWM 輸入捕獲,這極大的限制了可用通道,而在有些需求中,定時器可用通道當然是越多越好。

所以魚鷹一直在苦思冥想一個高精度的通用的 PWM 輸入捕獲程序。

領(lǐng)悟

一天晚上,魚鷹一邊洗衣,一邊思考,終于靈光一閃,既然編碼器功能可以借助兩組通道完成編碼器,為什么 PWM 輸入捕獲不能使用類似的機制呢?

手冊中的 PWM 輸入因為使用了 從模式 功能,才有上述限制,只要我不使用從模式,僅僅使用兩個通道的捕獲功能,就可以解除該限制了吧?

所以借助《如何高效的擴展定時/計數(shù)器?》里面介紹的知識,魚鷹頓悟了……

效果

左邊用邏輯分析儀設(shè)置的輸出參數(shù),右邊通過捕獲程序捕獲的結(jié)果。

STM32F103,主頻 72 Mhz,定時器時鐘頻率 72 MHz。 

我們從上圖可以知道,即使輸入 PWM 頻率高達 1 Mhz,我們的程序還是將其準確測量出來了。

當然在占空比計算方面,因為定時器頻率自身的原因,計算的并不精確,和實際的誤差比較大,不過在這么高的頻率下,只是 10% 的誤差,我認為還是可以接受的。

而頻率達到 3 MHz 時,頻率比較接近(4 % 誤差),但是占空比已經(jīng)出現(xiàn)了很大誤差,已經(jīng)不可用了(可能計算有點問題)。

100 K,占空比 5 % 的情況下,頻率測量誤差 0%,占空比誤差 1%!??!

優(yōu)缺點

由于時間與篇幅原因(花了很多時間做測試),本篇筆記不會介紹捕獲原理(魚鷹要寫的話,一定會盡可能的介紹清楚,所以字數(shù)會比較多,目前時間不足),主要是想通過本篇介紹 F103 72Mhz 的情況下所能達到的極致效果,讓各位在接任務(wù)時有一個概念,看是否能簡單通過 103 完成功能。

現(xiàn)在簡單介紹一下魚鷹這個方案的優(yōu)缺點:

優(yōu)點:

1、不占用 CPU 資源,使用 DMA 與定時器捕獲功能完成。    而如果使用中斷的方式,100KHz 下,10 us 就需要進入一次中斷,基本不用干其他事情了。一旦中斷被別的代碼短暫禁用,錯過了捕獲,那計算的結(jié)果可能就有問題了。

2、可以分時使用定時器的四個通道,不會被所謂的從模式所限制,但能達到和手冊介紹 PWM 輸入捕獲功能一樣的精度。

3、可以捕獲高頻信號(MHz),并且精度高。

4、精度和定時器時鐘頻率有很大關(guān)系(F1  1/72 us),如果 F4 的芯片,定時器頻率更高,那么可以達到更高的精度(可以算優(yōu)點,也可以算缺點)。

5、因為采用 DMA 傳輸 + 硬件(定時器)方式,計算的結(jié)果可以信任,不需要太多的處理(比如濾波)。

6、單個通道可以達到很高的捕獲率,甚至可以通過特定的算法進行實時捕獲,而對 CPU 本身的影響卻很?。床徽加?CPU 資源實時捕獲計算)。

7、解除STM32定時器只能捕獲上升沿或下降沿,而不能雙邊沿捕獲的限制。

缺點:

1、只能分時測量每個通道的 PWM,不能同時測量(如果頻率很高,幾十個微秒就能切換 一次測量,問題不大)。

2、占用 DMA 傳輸通道,導致對應的通道的外設(shè)不能使用(比如串口)

3、代碼很簡單,但是很難理解(下面的代碼計算了所有捕獲,實際上只要計算幾個就行,因為數(shù)據(jù)可以信任)。

uint32_t cal_duty_cycle(capture_buff_def *buff, uint32_t size){    assert_param(size > CCR_VALUE_BUFF);        for(int i = 0; i < size - 1; i++)    {        cycle_temp[(i << 1)]        = buff[i + 1].ccr1 - buff[i].ccr1;         cycle_temp[(i << 1) + 1]    = buff[i + 1].ccr2 - buff[i].ccr2;    }      for(int i = 0; i < size - 1; i++)    {        duty_cycle_temp[(i << 1)]     = /* cycle_temp[(i << 1)]  - */(buff[i].ccr1 - buff[i].ccr2);         duty_cycle_temp[(i << 1) + 1] = /* cycle_temp[(i << 1) + 1]  - */(buff[i].ccr1 - buff[i].ccr2);    }        cycle       = (1000 * 1000 * 72) / cycle_temp[20];     duty_cycle  = duty_cycle_temp[20] * 100 / cycle_temp[20];     return 0;}

咱們下期再見了!不出意外更新的應該就是本篇的續(xù)集了。

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

作者:魚鷹Osprey(emOsprey)

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄