新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > FTM的PWM、輸入捕獲、正交解碼

FTM的PWM、輸入捕獲、正交解碼

作者: 時間:2016-11-27 來源:網(wǎng)絡(luò) 收藏
FTM是一個神奇的模塊,他能輸出PWM,能輸入捕獲,能輸出比較還能正交解碼。英文全稱是FlexTimer Module,你可以理解為高級定時器模塊、易用定時器模塊等等。不僅僅在Kinetis 32位處理器中,F(xiàn)TM是個常用的模塊,在飛思卡爾的8位處理器中,他也是個常用的模塊,只不過名字叫TPM。FTM會用了,飛思卡爾的其他單片機的FTM、TPM你就都會用了。在OSKinetis固件庫中,我們可以用FTM模塊來實現(xiàn)PWM、輸入捕獲和正交解碼等常用功能,借用庫函數(shù)實現(xiàn)功能不難,難的是理解這些功能怎么用、什么原理才是最重要的,下面我們一一介紹這3個功能。當(dāng)然看完本文你就能用寄存器編寫FTM的各個功能嗎,呵呵,不可能的!否則要那1000多頁的技術(shù)文檔干什么用,但是我希望本文能起到拋磚引玉的功能,在你會用庫函數(shù)的基礎(chǔ)上,對他的內(nèi)部機制有一個了解。

介紹幾個小伙伴(FTM寄存器)

要想搞清楚FTM模塊,首先我們要介紹幾個重要的寄存器給大家,他們就像小伙伴一樣,好好利用可以幫大忙呢。

本文引用地址:http://butianyuan.cn/article/201611/322237.htm
  • FTMx_CNT小朋友(計數(shù)器寄存器),他負責(zé)喊號(計數(shù))。
  • FTMx_SC小朋友(狀態(tài)和控制寄存器),他負責(zé)……寄存器名字面意思,具體說就是決定CNT小朋友的喊號的快慢(計數(shù)頻率,包括時鐘源的選擇和分頻系數(shù))。他還負責(zé)其他一些雜事,比如計數(shù)溢出、中斷使能等等。
  • FTMx_MOD小朋友(模數(shù)寄存器),他負責(zé)記住一個數(shù)字,當(dāng)CNT小朋友喊道這個數(shù)字的時候,他就提醒相關(guān)人員干一些事情,比如產(chǎn)生溢出中斷標(biāo)志,比如讓CNT重新開始喊號。
  • FTMx_CNTIN小朋友(計數(shù)器初始值寄存器),他告訴CNT小朋友哪哪個數(shù)開始喊。
  • 其中x代表不同的FTM模塊的標(biāo)號,比如MK60D系列單片機,有3個FTM模塊,x就為0~2。

PWM輸出功能

PWM工作原理

PWM是什么,能做什么用,不是我們要講的,相信你也能百度到。這里我們主要講PWM在Kinetis的FTM模塊中是怎么工作的。還記得上面介紹的幾個小朋友嗎,他們只要一起干活,我們的PWM波就可以生成了,下面我來說說他們是怎么干活的。哦對了,說到PWM還有一個小朋友要介紹,就是FTMx_CnV(通道值寄存器)小朋友。其中n代表FTMx有n個這樣的小朋友,對于FTM0模塊來說,有8個。他們8個人負責(zé)PWM的脈寬(即占空比),他們每個人也會記住一個數(shù)字,當(dāng)CNT喊道這個數(shù)字的時候,他就讓PWM的輸出產(chǎn)生上升或下降沿。
PWM最重要參數(shù)就是頻率(周期的倒數(shù))和占空比,下面的兩個公式解釋了他們是怎么確定的:

PWM的周期=(MOD–CNTIN +1)x計數(shù)器周期
PWM的占空比=(CnV − CNTIN)/ PWM的周期

怎么樣,上面的公式結(jié)果都是由我們認(rèn)識的小朋友決定的吧。下面我來解說下這個工作流程,首先公式中的計數(shù)器周期是SC小朋友決定的,前面說了他負責(zé)喊號的快慢,因為他負責(zé)決定采用哪個頻率為輸入頻率,這些頻率候選有系統(tǒng)時鐘、固定頻率時鐘以及外部時鐘,他還負責(zé)這些輸入頻率的分頻系數(shù),總之SC小朋友決定了計數(shù)器周期,也就是CNT小朋友喊號的快慢。然后CNT小朋友從CNTIN小朋友那里知道了要喊的第一個數(shù),他按照SC決定的快慢一直喊道MOD告訴他的數(shù),喊完這些數(shù),一個PWM周期也就產(chǎn)生了!
那么PWM的脈寬是怎么決定的呢,首先假定CNT在喊第一個數(shù)的時候,PWM通道輸出高電平,當(dāng)CNT喊到CnV小朋友告訴他的號的時候,PWM輸出通道就會變?yōu)榈碗娖剑钡紺NT繼續(xù)喊道MOD的時候一個PWM周期結(jié)束,當(dāng)重新開始喊CNTIN的號的時候,PWM的輸出通道又變?yōu)榱烁唠娖剑@樣持續(xù)下去,就產(chǎn)生了PWM波形!
你以為一個FTMx模塊只能輸出一路PWM就錯了,我們剛才說了CnV根據(jù)x的不同,有n個通道可以輸出PWM,如果是x=0,那么FTM0就有8個CnV,C0V到C7V這8個小朋友,因此FTM0可以輸出8路不同占空比的PWM,但是由于負責(zé)喊號的CNT以及他的其他小伙伴在FTM0中僅僅各有1人,因此FTM0只能輸出一種頻率的PWM。

如果上面的描述讓你和你的小伙伴都驚呆了,那么就看看上面這幅圖,從技術(shù)文檔中的Figure 39-181截出來的。紅圈后面的波形就行PWM輸出通道輸出的波形。深綠色的圈代表CNT從CNTIN開始計數(shù),此時輸出高電平。當(dāng)計數(shù)到CnV的時候,淺綠色圈處,產(chǎn)生channel(n)match通道匹配事件,變?yōu)榈碗娖?。?dāng)整個計數(shù)周期完成,即藍圈的范圍,CNT計數(shù)到MOD時,一個波形輸出完成。

PWM例程講解

前面講了FTM中的幾個小伙伴的故事,目的是為了讓大家了解PWM的工作流程,下面我們來具體看看例程中,是如何利用庫函數(shù)來生成PWM的。首先看例程“LPLD_ServoControl”,這是一個控制舵機轉(zhuǎn)動的例程,我們知道舵機的控制PWM頻率一般是50Hz,其他的舵機有可能不同,因此我們的初始化函數(shù)初始化PWM頻率為50,定位pwm_init()函數(shù),看其代碼:

01
ftm_init_struct.FTM_Ftmx=FTM0;//使能FTM0通道
02
ftm_init_struct.FTM_Mode=FTM_MODE_PWM;//使能PWM模式
03
ftm_init_struct.FTM_PwmFreq=50;//PWM頻率50Hz
04
LPLD_FTM_Init(ftm_init_struct);
05
LPLD_FTM_PWM_Enable(FTM0,//使用FTM0
06
FTM_Ch0,//使能Ch0通道
07
angle_to_period(0),//初始化角度0度
08
PTC1,//使用Ch0通道的PTC1引腳
09
ALIGN_LEFT//脈寬左對齊
10
);

Line 1:使能FTM0通道。
Line 2:配置FTM_Mode成員變量,使用FTM的PWM輸出功能。
Line 3:配置PWM輸出的頻率為50Hz,你只要直接寫頻率的數(shù)值即可,至于剛才講的CNTIN、MOD、SC寄存器的值,庫函數(shù)會自動搞定。而且切記,每個FTMx只能產(chǎn)生一種頻率,這個頻率在初始化配置時就確定了,如果你想用第二種頻率,就使能再初始化FTM1或FTM2了。
Line 4:調(diào)用FTM通用初始化函數(shù)初始化該模塊。
Line 5:PWM通道輸出使能函數(shù),你光配置了FTM0的PWM輸出功能還不夠,還要決定用哪個PWM通道來輸出波形哦!其中FTM0有8個通道,這里使能通道0 FTM_Ch0,每個通道又可能有不同的物理輸出引腳,這里用CH0的PTC1引腳來輸出PWM,還要配置占空比,這里我們用了自定義函數(shù)angle_to_period()來將舵機的角度值轉(zhuǎn)化為函數(shù)需要的占空比值。最后一個參數(shù)是PWM脈寬的對其方式,默認(rèn)是左對齊。關(guān)于此函數(shù)的參數(shù)的具體范圍,請參考FTM模塊的在線函數(shù)手冊(點擊進入)。

初始化完成后的代碼如下所示:

1
delay(1000);
2
//初始化延時后改變角度為45度
3
LPLD_FTM_PWM_ChangeDuty(FTM0,FTM_Ch0,angle_to_period(45));

Line 1:在初始化完畢后,首先應(yīng)該延時一段時間,以保證舵機可以有足夠的時間歸位。
Line 3:調(diào)用LPLD_FTM_PWM_ChangeDuty()函數(shù)來改變CH0通道的占空比,該函數(shù)和PWM通道使能函數(shù)的個別參數(shù)一樣,使用時最好先參考在線函數(shù)手冊。

輸入捕獲功能

IC工作原理

IC就是Input Capture的英文縮寫,即輸入捕獲。很多新手不僅疑惑FTM,還疑惑他怎么還有這么多功能,更疑惑這么多功能中輸入捕獲到底干什么用。首先FTM為什么除了能生成PWM,還有其他功能,這都是因為他有這么多給力的小伙伴(寄存器),上面介紹那些小朋友不僅能生成PWM,還能利用自身特長,搖身一變成輸入捕獲功能。那么輸入捕獲有什么用呢,輸入什么?捕獲什么?他就像PWM的逆變一樣,通過輸入PWM方波,捕獲上升沿或者下降沿,來計算出PWM的頻率或者占空比。
那么這幾個小朋友是怎么工作,來實現(xiàn)輸入捕獲功能的呢,且聽我一一道來。首先CnV小朋友不再負責(zé)記住一個數(shù)了,而是隨時待命,隨時準(zhǔn)備記錄下CNT小朋友喊的數(shù)字。當(dāng)FTM的輸入通道產(chǎn)生一個上升沿或者下降沿的時候,就會產(chǎn)生一個中斷,這是CnV小朋友就會立刻記錄下CNT小朋友喊的數(shù)字,我們只要知道兩次中斷之間CnV小朋友記錄的計數(shù)的差,就可以間接計算出中斷間隔時間了,從而可以計算出PWM方波的頻率。當(dāng)然CNT小朋友喊號的頻率還是有SC小朋友決定的。假設(shè)我們知道CNT喊號的頻率為fCNT,CnV自從上次中斷后記錄的計數(shù)差為cv,配置捕獲上升沿時產(chǎn)生中斷,那么兩次中斷的時間差的倒數(shù)就是PWM方波的頻率:

輸入PWM頻率=fCNT/cv

同樣還是來看一下我從技術(shù)文檔中截下來的圖,原圖初出自Figure 39-175。紅框圈出來的是FTM的通道輸入,這個通道在物理引腳上和PWM的輸出通道是共用的,只不過隨著功能的不同,輸入輸出都可以。橙色圈代表的是判斷到底是上升沿還是下降沿來觸發(fā)沖斷。深色綠圈代表了CnV在這個事件來臨的時候記錄下CNT的數(shù)值,淺綠色是CNT計數(shù)器的值。藍色圈代表我們即將產(chǎn)生的中斷信號。

IC例程講解

打開例程“LPLD_InputCapture”,在這里例程中,我們利用FTM0生成一路PWM,用于測試他的頻率,用FTM1配置為輸入捕獲模塊,來采集PWM并計算他的頻率。pwm_init()初始化函數(shù)的代碼我們就不贅述了,相信大家都能看懂,直接看下輸入捕獲的初始化函數(shù)ic_init()的代碼:

1
ftm1_init_struct.FTM_Ftmx=FTM1;//使能FTM1通道
2
ftm1_init_struct.FTM_Mode=FTM_MODE_IC;//使能輸入捕獲模式
3
ftm1_init_struct.FTM_ClkDiv=FTM_CLK_DIV128;//計數(shù)器頻率為總線時鐘的128分頻
4
ftm1_init_struct.FTM_Isr=ic_isr;//設(shè)置中斷函數(shù)
5
LPLD_FTM_Init(ftm1_init_struct);
6
LPLD_FTM_IC_Enable(FTM1,FTM_Ch0,PTB0,CAPTURE_RI);
7
LPLD_FTM_EnableIrq(ftm1_init_struct);

Line 2:配置FTM1為輸入捕獲模式。
Line 3:設(shè)置計數(shù)器的分頻系數(shù)為128,剛才我們講過要計算PWM的頻率,就要知道CNT計數(shù)器的頻率,在OSKinetis固件庫中,CNT的時鐘源為總線時鐘,如果這里設(shè)置為FTM_CLK_DIV128,那么CNT的頻率就是總線頻率/128。
Line 4:設(shè)置FTM的中斷函數(shù),用于處理捕獲事件。
Line 6:使能輸入捕獲的輸入通道,和PWM的使能通道同理,這里要設(shè)置需要用到的通道號為FTM_Ch0,通道對應(yīng)的物理引腳為PTB0,捕獲邊緣為上升沿CAPTURE_RI。關(guān)于此函數(shù)的參數(shù)的具體范圍,請參考FTM模塊的在線函數(shù)手冊(點擊進入)。
Line 7:一定要記住使能中斷。


上一頁 1 2 下一頁

關(guān)鍵詞: FTMPWM輸入捕獲正交解

評論


技術(shù)專區(qū)

關(guān)閉