新聞中心

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

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

作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò) 收藏


輸入捕獲初始化完畢后,F(xiàn)TM1就會(huì)在PTB0有輸入PWM的時(shí)候產(chǎn)生中斷了,接下來(lái)看一下其中斷函數(shù)是怎么寫的:

本文引用地址:http://butianyuan.cn/article/201611/322237.htm

01
voidic_isr(void)
02
{
03
uint32cnt;
04
if(LPLD_FTM_IsCHnF(FTM1,FTM_Ch0))
05
{
06
cnt=LPLD_FTM_GetChVal(FTM1,FTM_Ch0);
07
Freq1=(g_bus_clock/LPLD_FTM_GetClkDiv(FTM1))/cnt;
08
LPLD_FTM_ClearCounter(FTM1);
09
LPLD_FTM_ClearCHnF(FTM1,FTM_Ch0);
10
}
11
}

Line 4:首先調(diào)用LPLD_FTM_IsCHnF()函數(shù)判斷是不是FTM1的Ch0通道產(chǎn)生的捕獲事件,因?yàn)槊總€(gè)FTMx的所有通道中斷都是公用一個(gè)中斷函數(shù)的,所以為了安全,必須在中斷中判斷是哪個(gè)通道產(chǎn)生的中斷。
Line 6:獲得Ch0通道的計(jì)數(shù)值,并存到臨時(shí)變量cnt中。這個(gè)值就是C0V小朋友在事件來(lái)臨的一瞬間,從CNT那里記錄下來(lái)的計(jì)數(shù)值。
Line 7:用上將講到的頻率計(jì)算公式來(lái)計(jì)算出PWM的頻率。這里L(fēng)PLD_FTM_GetClkDiv()可以得到我們初始化時(shí)設(shè)置的計(jì)數(shù)器分頻系數(shù),g_bus_clock變量是總線頻率的數(shù)值,用(g_bus_clock/LPLD_FTM_GetClkDiv(FTM1))就得到了計(jì)數(shù)器CNT的技術(shù)頻率,在除以cnt計(jì)數(shù)值,得到的就是輸入方波的頻率。
Line 8:用LPLD_FTM_ClearCounter()函數(shù)清空CNT小朋友的計(jì)數(shù)值,以便我們下次中斷獲取的值是從0開始的,方便計(jì)算。
Line 9:用LPLD_FTM_ClearCHnF()函數(shù)清除Ch0通道的中斷標(biāo)志。

正交解碼

正交解碼原理

講到正交解碼,其實(shí)并沒有什么神秘的,名字聽起來(lái)挺高端大氣上檔次的,其實(shí)實(shí)現(xiàn)起來(lái)非常簡(jiǎn)單,我覺得反而是FTM模塊中最簡(jiǎn)單的功能。首先要清楚正交解碼是干嘛用的,舉個(gè)栗子?霍爾編碼器是常用的電機(jī)測(cè)速傳感器,他不僅可以測(cè)速,還可以知道電機(jī)的正轉(zhuǎn)還是反轉(zhuǎn),靠的就是他能輸出兩路正交信號(hào),我們可以通過(guò)正交信號(hào)的相位差來(lái)識(shí)別出當(dāng)前電機(jī)的轉(zhuǎn)動(dòng)方向。因此有了FTM模塊,我們就可以將這兩路正交信號(hào)PhA和PhB輸入到FTM的正交輸入通道,通過(guò)正交解碼功能,直接讀取脈沖的計(jì)數(shù)值,這個(gè)計(jì)數(shù)值是有符號(hào)的,正數(shù)代表正轉(zhuǎn),負(fù)數(shù)則代表反轉(zhuǎn)。

具體到FTM內(nèi)部時(shí)怎樣工作的,還要提到CNT小朋友,在正交解碼模式下,他不再按照SC給定的規(guī)則喊號(hào)了,而是根據(jù)兩路PhA和PhB正交信號(hào)的狀態(tài)來(lái)計(jì)數(shù)。你也可以理解為CNT小朋友是一個(gè)解碼員,當(dāng)然具體是增計(jì)數(shù)還是減計(jì)數(shù),不是CNT說(shuō)了算,F(xiàn)TM內(nèi)部有一套復(fù)雜的機(jī)制決定。而且這個(gè)正交解碼功能有兩種解碼方法可以選擇,分別是計(jì)數(shù)和方向編碼、相位A和相位B編碼。他們的解碼方法如下面兩圖所示:
上圖是計(jì)數(shù)和方向編碼方法,紅框后面的波形是FTM輸入通道PhB的波形,它代表計(jì)數(shù)方向,籃框后面的波形是FTN輸入通道PhA的波形,它代表計(jì)數(shù)個(gè)數(shù),這是一種編碼方法,當(dāng)PhB為高電平時(shí),CNT加計(jì)數(shù),當(dāng)PhB低電平時(shí),CNT減計(jì)數(shù),計(jì)數(shù)頻率由PhA決定。從圖中還可以看出,CNTIN小朋友決定從什么數(shù)開始計(jì)數(shù),MOD小朋友決定計(jì)數(shù)到什么時(shí)候產(chǎn)生溢出中斷。
上圖是相位A和相位B編碼方法,這個(gè)是我們常用的正交解碼模式,也是霍爾編碼傳感器兩路波形輸出的方式。從圖中可以看到,當(dāng)PhA和PhB處于特定的電平和邊沿時(shí),他們的狀態(tài)共同決定了CNT是增還是減。具體原則如下:
CNT小朋友增計(jì)數(shù)時(shí)看到的是:
A上升沿,B邏輯低
B上升沿,A邏輯高
B下降沿,A邏輯低
A下降沿,B邏輯高
CNT小朋友減計(jì)數(shù)時(shí)看到的是:
A下降沿,B邏輯低
B下降沿,A邏輯高
B上升沿,A邏輯低
A上升沿,B邏輯高

正交解碼例程講解

要測(cè)試正交解碼例程,首先你要準(zhǔn)備兩路正交信號(hào),可以用霍爾編碼器的信號(hào)直接輸入。打開例程“LPLD_QuadratureDecoder”,看正交解碼初始化函數(shù)qd_init()的代碼:

1
ftm_init_struct.FTM_Ftmx=FTM1;//只有FTM1和FTM2有正交解碼功能
2
ftm_init_struct.FTM_Mode=FTM_MODE_QD;//正交解碼功能
3
ftm_init_struct.FTM_QdMode=QD_MODE_PHAB;//AB相輸入模式
4
LPLD_FTM_Init(ftm_init_struct);
5
LPLD_FTM_QD_Enable(FTM1,PTB0,PTB1);

Line 2:配置FTM1為正交解碼功能,這里需要注意的是,F(xiàn)TM中只有FTM1和FTM2具有正交解碼輸入通道,F(xiàn)TM0是沒有的。
Line 3:選擇解碼模式為AB相輸入模式解碼QD_MODE_PHAB。
Line 5:使能FTM1的正交解碼物理輸入引腳,調(diào)用LPLD_FTM_QD_Enable()函數(shù),第二個(gè)參數(shù)是PhA相的物理引腳,第三個(gè)參數(shù)的PhB的。關(guān)于此函數(shù)的參數(shù)的具體范圍,請(qǐng)參考FTM模塊的在線函數(shù)手冊(cè)(點(diǎn)擊進(jìn)入)。

正交解碼初始化完畢后,還要初始化定時(shí)中斷模塊,因?yàn)槲覀円诠潭ǖ拈g隔時(shí)間內(nèi)獲取計(jì)數(shù)值才能計(jì)算出頻率,所以就務(wù)必會(huì)用到PIT模塊。pit_init()函數(shù)是PIT初始化函數(shù),相信大家都能讀懂,這里我就不重復(fù)解釋了。下面直接看PIT的中斷函數(shù)代碼:

1
qd_result=LPLD_FTM_GetCounter(FTM1);
2
LPLD_FTM_ClearCounter(FTM1);

Line 1:LPLD_FTM_GetCounter()函數(shù)可以獲取當(dāng)前FTM計(jì)數(shù)器即CNT小朋友的計(jì)數(shù)值,當(dāng)然這個(gè)值是有符號(hào)的,可以正可以是負(fù)數(shù)。如果是正代表電機(jī)在正轉(zhuǎn),如果是負(fù),代表電機(jī)在反轉(zhuǎn)。
Line 2:為了下次方便計(jì)數(shù),情況CNT的計(jì)數(shù)值。
當(dāng)然,本例程只是簡(jiǎn)單的獲取計(jì)數(shù)值,如果你要計(jì)算頻率,還用通過(guò)你的定時(shí)中斷時(shí)間進(jìn)一步計(jì)算。

FTM拾遺補(bǔ)缺

PWM死區(qū)

PWM死去是在是PWM輸出時(shí),為了使H橋或半H橋的上下管不會(huì)因?yàn)槠骷旧淼拈_關(guān)速度問題導(dǎo)致同時(shí)導(dǎo)通而設(shè)置的一個(gè)保護(hù)時(shí)段。這個(gè)時(shí)間在Kinetis的FTM模塊也是可以設(shè)置的,當(dāng)然在庫(kù)函數(shù)使用時(shí)就更簡(jiǎn)單了,你只要在配置PWM輸出時(shí),配置FTM_PwmDeadtimeCfg和FTM_PwmDeadtimeDiv就可以了。這兩個(gè)成員變量的取值本文不再贅述,請(qǐng)參考在線函數(shù)手冊(cè)。

溢出中斷

除了輸入捕獲能產(chǎn)生中斷外,F(xiàn)TM內(nèi)部也會(huì)產(chǎn)生溢出中斷,這是你在使用輸入捕獲或者正交解碼時(shí)可能遇到的問題,那么什么是溢出中斷呢,它是當(dāng)CNT計(jì)數(shù)器計(jì)數(shù)到上限時(shí)產(chǎn)生的一種中斷。你可以在初始化FTM時(shí)配置是否使能該中斷,利用成員變量FTM_ToiEnable。


上一頁(yè) 1 2 下一頁(yè)

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

評(píng)論


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

關(guān)閉