ftm模块linux驱动,飞思卡尔K60 FTM模块详解【二】
1.5.3 FTM功能詳解
1.
FTM模塊的時鐘
FTM模塊的核心是一個16位計數(shù)器,該計數(shù)器的時鐘來源可設置(由FTMx_SC寄存器中的CLKS設置),可來自總線時鐘(CLKS=01),也可來自MCG模塊的MCGFFCLK,對時鐘源可進行分頻(由FTMx_SC寄存器中的PS設置)。
如果使用固定頻率時鐘,即fixed
frenquency clock,也就是MCGFFCLK,則需要在MCG模塊中設置。MCG模塊提供的MCGFFCLK,可以為其它片上周邊設備提供時鐘,該時鐘可由內(nèi)部慢速參考時鐘提供或外部晶振,且由FLL分頻后提供。MCGFFCLK由C1_IREFS位設置來自內(nèi)部32K還是來自外部經(jīng)過FDIV分頻后的時鐘,輸出到MCGFFCLK還要2分頻一次。
MCGFFCLK用于局部總線時鐘同步,而且不得大于MCGOUTCLK的1/8。且該時鐘在MCG處于BLPI模式和STOP模式下無效。
。
一般情況下,只要不是對外部計數(shù)功能,我們都會采用Bus Clock為FTM提供時鐘。
2.
FTM模塊的計數(shù)模式
FTM模塊在時鐘確定后,計數(shù)器計數(shù),默認情況下,對分頻后輸入時鐘進行遞增無符號計數(shù)。計數(shù)器初始值由FTMx_CNTIN指定。當一直計數(shù)到達FTMx_MOD寄存器的設定值時,TOF置位。計數(shù)器回到初始值,循環(huán)往復。如下圖所示,計數(shù)器從0計數(shù)到3,循環(huán)計數(shù)。計數(shù)周期時鐘周期。
初始值也可是負數(shù),例如CNTIN=0xFFFC(補碼-4),MOD=4,則計數(shù)器從-4計數(shù)到4,循環(huán)計數(shù)。當CNTIN的最高位,即CNTIN[15]=1時,初始值作為負數(shù)對待,否則視為正數(shù)。
FTM計數(shù)時,建議MOD值必須大于CNTIN值,編程時需注意。如果MOD==CNTIN,則計數(shù)值一直保持MOD值,且TOF位一直置1。
當QUADEN=0(非正交解碼模式)且CPWMS=0(加法計數(shù))時,計數(shù)器為加法計數(shù),如果設置CPWMS=1,則進入先加后減計數(shù)模式。(中心對齊PWM必須將該位置1)。
在先加后減計數(shù)模式下,假設CNTIN=0,MOD=4,則計數(shù)過程如下
在該模式下,計數(shù)周期=2*(MOD-CNTIN),當計數(shù)值從MOD變?yōu)镸OD-1時,TOF置位。
如FTMEN=0,此時FTM模塊功能等同于S08的TPM模塊,此時無論MOD=0或者MOD=0XFFFF,此時計數(shù)器為一個自由運行的16位計數(shù)器。
如FTMEN=1,且QUADEN=0、CPWMS=0時,此時只有MOD=0xFFFF時,才可作為一個自由運行的計數(shù)器。
任何對FTM計數(shù)器的寫入操作,都會復位計數(shù)器,計數(shù)器的值重新回到CNTIN指定值。也可以使用FTM的同步功能,讓計數(shù)器重新回到初值,各通道輸出也回到初始值。
FTMx_CONF寄存器中的NUMOF[4:0]可設置TOF置位的頻率。默認情況下,即NUMOF[4:0]=0,每個計數(shù)周期,TOF置位一次,如果NUMOF=n,(n<32),則每n+1個周期,TOF置位一次。
3.
邊沿對齊PWM模式
PWM輸出實際上利用的就是FTM的輸出比較的功能。當QUADEN = 0,DECAPEN = 0,COMBINE= 0,CPWMS = 0,
MSnB = 1時,FTM工作在EPWM模式下,即邊沿對齊模式。可用于產(chǎn)生舵機和電機的PWM控制信號。在這個模式下,FTM計數(shù)器工作方式和計數(shù)模式相同,默認為加法計數(shù),計數(shù)到MOD值后自動返回CNTIN值。PWM信號的周期和計數(shù)器計數(shù)周期有關(guān),PWM周期=(MOD-CNTIN+1)*時鐘周期。
PWM信號高低電平切換的時刻,則由CnV值決定,當計數(shù)器累加計數(shù)到CnV值相等時,PWM信號則翻轉(zhuǎn)。直到計數(shù)到MOD值,一個周期結(jié)束,信號回到初始值。這種模式的原理和輸出比較模式是相同的,當比較成功時,也就是FTM計數(shù)值=CnV時,CHnF標志也會置1。PWM信號的輸出可以時左對齊(信號先高后低)也可以是右對齊(信號先低后高)。左右對齊由ELSnB:ELSnA決定,若ELSnB:ELSnA=10則是左對齊模式,若ELSnB:ELSnA=X1則是右對齊模式。以左對齊為例,高電平持續(xù)時間=(CnV-CNTIN)*時鐘周期。
在邊沿對齊PWM模式中,一般PWM周期不變,通過改變CnV的值以改變占空比,如改變CnV的值,則新的值并不會立刻生效,而是到一個周期結(jié)束,FTM計數(shù)器從MOD變?yōu)镃NTIN時,CnV值才生效。
EPWM例程如下,在該例程中,總線時鐘為60MHz,經(jīng)過FTM分頻到3.75MHz,FTM遞增計數(shù),周期10ms,高電平事件1.5ms。使用FTM0_CH3通道,由PTA6引腳輸出。
void FTM_Init(void)
{
PORTA_PCR6= PORT_PCR_MUX(3); // 設置引腳 A6引腳為FTM0_CH3功能
SIM_SCGC6|=SIM_SCGC6_FTM0_MASK;//使能FTM0時鐘
FTM0_MODE |=
FTM_MODE_WPDIS_MASK;//寫保護禁止
//設置通道0,工作在左邊沿對其PWM模式//MSB=1,ELSB:ELSA=10
FTM0_C3SC |= FTM_CnSC_ELSB_MASK;//ELSB=1,ELSA=0,左對齊,先高后低
FTM0_C3SC &= ~FTM_CnSC_ELSA_MASK;
FTM0_C3SC |= FTM_CnSC_MSB_MASK;//MSB=1,模式選擇邊沿對齊
FTM0_SC=0x0c;//中斷禁止,時鐘源來自總線時鐘60MHz,16分頻后得到3.75MHz,CLKS=01,PS=100,CPWMS=0,遞增計數(shù)
FTM0_MODE &= ~1;//FTM0使能
FTM0_OUTMASK=0XF7;//通道3輸出,屏蔽其它通道
FTM0_QDCTRL&=~FTM_QDCTRL_QUADEN_MASK;//禁止正交解碼模式
FTM0_COMBINE=0;//DECAPEN=0,雙邊沿捕捉禁止,COMBINE=0,不級聯(lián)
FTM0_CNTIN=0;//FTM0計數(shù)器初始值為0
FTM0_MOD=37499;//結(jié)束值,周期為(MOD-CNTIN+1)*時鐘周期=10ms
FTM0_C3V=5625;//高電平1.5ms
FTM0_CNT=0;
}
4.
中心對齊PWM模式
中心對齊PWM模式和邊沿對齊PWM模式唯一不同之處在于CPWMS = 1,即此時計數(shù)器工作模式為先加后減模式,計數(shù)器累加到CnV時,信號翻轉(zhuǎn),直到計數(shù)到MOD值后開始遞減計數(shù),再次到達CnV時,信號再次翻轉(zhuǎn),然后遞減到CNTIN值,一個周期結(jié)束。同樣的MOD、CNTIN、CnV,值,CPWM的周期是EPWM的兩倍,但占空比不變。
在中心對齊PWM模式下,ELSnB:ELSnA 的作用和EPWM相同,即ELSnB:ELSnA=10信號輸出先高后低,若ELSnB:ELSnA=X1信號輸出先低后高。
5.
輸入捕捉模式
FTM的輸入捕捉模式可捕捉外部信號的正跳變或負跳變,可替代外部中斷使用。和一般外部中斷不同的是,輸入捕捉功能不但可以在捕捉到特定的跳變時產(chǎn)生中斷,而且輸入引腳可以啟用濾波功能,關(guān)鍵是,輸入捕捉功能在捕捉到信號時,還可以記錄捕捉的時刻,即捕捉發(fā)生時,FTM計數(shù)器的值會記錄在CnV寄存器中。
輸入捕捉模式下,DECAPEN =
0(不啟用雙邊呀捕捉),COMBINE = 0(各通道獨立),CPWMS= 0(計數(shù)器累加計數(shù)),MSnB:MSnA = 0:0(輸入捕捉模式)。
此時,捕捉什么樣的信號則由ELSnB:ELSnA決定。
ELSnB:ELSnA=01:捕捉上升沿;
ELSnB:ELSnA=10:捕捉下降升沿;
ELSnB:ELSnA=11:捕捉上升沿或下降沿。
當對應的通道捕捉到設定的邊沿時,CHnF置位,如果對應的CHnIE=1,即中斷打開時,即可產(chǎn)生中斷。
在輸入捕捉模式下,當捕捉到設定的邊沿時,此時的FTM計數(shù)器的值將自動保存到CnV寄存器中,也就是在輸入捕捉模式下,CnV寄存器在程序中只可做讀出之用,寫入操作會被忽略。
每個FTM模塊的0~3通道可以啟用濾波功能,濾波原理是捕捉到邊沿時,延時若干個時鐘周期再置位CHnF。默認情況下,如不啟用濾波功能,則延時3個系統(tǒng)時鐘的上升沿。若啟用濾波功能,則延時可設置,但只有0~3通道可以設置。注意,捕捉模式下,CNTIN應為0。
當啟用濾波功能時,如果輸入端發(fā)生變化,則濾波器內(nèi)部的5bit計數(shù)器開始累加計數(shù),一旦溢出(溢出值由CHnFVAL[3:0]設定),輸入端變化才提交給邊沿檢測器。如果計數(shù)過程中,輸入端再次發(fā)生相反變化,則計數(shù)器會被復位并重新開始計數(shù),這樣一些比過濾時間短的脈沖則會被視為干擾且不會提交給邊沿計數(shù)器。
6.
輸出比較模式
當DECAPEN =
0(禁止雙邊沿檢測),COMBINE = 0(各通道獨立),CPWMS = 0(計數(shù)器累加),MSnB:MSnA = 0:1時,FTM工作在輸出比較模式下。
在輸出比較模式下,計數(shù)器工作在累加模式下,當FTM計數(shù)器值=CnV值,時,比較成功,對應通道的引腳輸出高電平、低電平或翻轉(zhuǎn)信號。通道輸出由ELSnB:ELSnA決定,ELSnB:ELSnA=01:輸出翻轉(zhuǎn),ELSnB:ELSnA=10:輸出低電平,ELSnB:ELSn=11:輸出高電平。同時,當比較成功時,對應CHnF置位,如CHnIE=1,則比較成功即引發(fā)中斷。
比較成功翻轉(zhuǎn)電平輸出,可用于輸出方波。實際上PWM波形的產(chǎn)生也是利用了輸出比較的功能實現(xiàn)的,輸出比較功能中如使用中斷且不輸出波形,也可實現(xiàn)定時中斷的功能。
7.
組合模式
以上幾種模式下,FTMEN=0即可,若要使用增強FTM的功能,即不同于PTM模塊功能,則必須FTMEN=1。組合模式就是其中一種,主要用于輸出非對稱PWM信號。
當FTMEN =
1(啟用增強功能)
,QUADEN =
0(不啟用正交解碼),DECAPEN = 0(不啟用雙邊沿捕捉),COMBINE = 1(相鄰通道組合使用)CPWMS = 0(計數(shù)器累加模式)時,FTM工作在組合模式下。
組合工作模式下,主要指的是偶數(shù)通道2n和相鄰的2n+1通道共同控制輸出PWM波形。PWM信號的周期和EPWM相同,但是高低電平的切換的時機則由C2nV和C2n+1V確定。電平第一次翻轉(zhuǎn)發(fā)生在通道2n比較成功,電平第二次翻轉(zhuǎn)發(fā)生在通道2n+1比較成功。在一個周期開始時,初始電平由ELSnB:ELSnA決定,這點和EPWM和CPWM相同。
在組合模式下,PWM信號的第一個邊沿只由C2nV決定,而第二個邊沿只由C2n+1V決定。兩個通道可獨立設置對應邊沿出現(xiàn)的位置,這就是非對稱的PWM輸出。
8.
互補模式
一般組合模式下,通道2n和通道2n+1輸出波形相同,如果啟用互補模式,則兩個通道輸出互為反向,在互補模式下,還可以啟用死區(qū)插入功能,這在某些兩路電機驅(qū)動的應用中是非常有用的。
當FTMEN =
1(啟用增強功能)
,QUADEN =
0(不啟用正交解碼),DECAPEN = 0(不啟用雙邊沿捕捉),COMBINE = 1(相鄰通道組合使用)CPWMS = 0(計數(shù)器累加模式)COMP = 1(啟用補償模式)時,FTM工作在補償模式下。在補償模式下,仍然是2n通道和2n+1通道組合使用,輸出PWM信號。和組合模式下不同的是,COMP=0時,2n通道和2n+1通道輸出信號相同,而補償模式下,2n+1通道輸出的信號和2n通道是相反的。
例程如下,該例程使用60MHz總線時鐘,分頻后3.75MHz,輸出引腳為C3和C4,分別對應FTM0_CH2和FTM0_CH3,注意由于FTMEN=1,相關(guān)寄存器更新采用軟件觸發(fā)的方式。在這個例子中,我們采用了死區(qū)插入,死區(qū)時間16*63個總線周期,時間大約16.8us。
void FTM0_Init(void)
{
PORTC_PCR3= PORT_PCR_MUX(4); // 設置引腳C3引腳為FTM0_CH2功能
PORTC_PCR4= PORT_PCR_MUX(4); // 設置引腳C4引腳為FTM0_CH3功能
SIM_SCGC6|=SIM_SCGC6_FTM0_MASK;//使能FTM0時鐘
FTM0_SC=FTM_SC_CLKS(1)|FTM_SC_PS(4);//中斷禁止,時鐘源來自總線時鐘60MHz,16分頻后得到3.75MHz,CLKS=01,PS=100,CPWMS=0,遞增計數(shù)
FTM0_MODE |= FTM_MODE_WPDIS_MASK;//寫保護禁止
FTM0_MODE |=FTM_MODE_FTMEN_MASK;//FTMEN=1
FTM0_QDCTRL&=~FTM_QDCTRL_QUADEN_MASK;//禁止正交解碼模式
FTM0_COMBINE|=FTM_COMBINE_COMBINE1_MASK;//FTM0通道2,3聯(lián)合使用
FTM0_COMBINE|=FTM_COMBINE_COMP1_MASK;//FTM0通道2,3互補輸出
FTM0_COMBINE|=FTM_COMBINE_SYNCEN1_MASK;//使能FTM0通道2,3 PWM同步
FTM0_COMBINE|=FTM_COMBINE_DTEN1_MASK;//死區(qū)插入
FTM0_DEADTIME=FTM_DEADTIME_DTPS(3)|FTM_DEADTIME_DTVAL(63);
FTM0_SYNCONF|=FTM_SYNCONF_SWWRBUF_MASK;//使能MOD,CNTIN,CV寄存器的軟件觸發(fā)同步
FTM0_SYNC=FTM_SYNC_CNTMIN_MASK|FTM_SYNC_CNTMAX_MASK;//設置load point
FTM0_C2SC |= FTM_CnSC_ELSB_MASK;//ELSB=1,ELSA=0,左對齊,先高后低
FTM0_C2SC &= ~FTM_CnSC_ELSA_MASK;
FTM0_C3SC |= FTM_CnSC_ELSB_MASK;//ELSB=1,ELSA=0,左對齊,先高后低
FTM0_C3SC &= ~FTM_CnSC_ELSA_MASK;
FTM0_OUTMASK=0XF3;//通道2,3輸出,屏蔽其它通道
FTM0_CNTIN=0;//FTM0計數(shù)器初始值為0
FTM0_MOD=37499;//結(jié)束值,周期為(MOD-CNTIN+1)*時鐘周期=10ms
FTM0_C2V=5625;//高電平1.5ms
FTM0_C3V=20000;
FTM0_CNT=0;
FTM0_SYNC|=FTM_SYNC_SWSYNC_MASK;//使能軟件觸發(fā)
}
在main函數(shù)的主循環(huán)中,我們可使用串口通信改變波形,通過示波器觀看,例程如下:
for(;;)
{
tom=
uart_getchar();
switch(tom)
{
case 'a':
FTM0_C3V+=50;
FTM0_SYNC|=FTM_SYNC_SWSYNC_MASK;//使能軟件觸發(fā)
break;
case 'd':
FTM0_C3V-=50;
FTM0_SYNC|=FTM_SYNC_SWSYNC_MASK;//使能軟件觸發(fā)
break;
case 'w':
FTM0_INVCTRL^=FTM_INVCTRL_INV1EN_MASK;//反轉(zhuǎn)
break;
default:break;
}
}
9.
正交解碼模式
當FTMEN=1,且QUADEN=1時,FTM工作在正交解碼模式。正交解碼模式使用A相和B相兩路輸入控制FTM計數(shù)器的加減。可作為A相和B相輸入的引腳如下,注意,FTM0沒有正交解碼功能,只有FTM1和FTM2具有該功能。
PTA8
PTA9
PTA10
PTA11
PTA12
PTA13
PTB18
PTB19
PTB0
PTB1
FTM1_QD_PHA
FTM1_QD_PHB
FTM2_QD_PHA
FTM2_QD_PHB
FTM1_QD_PHA
FTM1_QD_PHB
FTM2_QD_PHA
FTM2_QD_PHB
FTM1_QD_PHA
FTM1_QD_PHB
功能6
功能6
功能6
功能7
功能7
功能6
功能6
功能6
功能6
正交解碼模式可用于輸入旋轉(zhuǎn)編碼器的A相和B相信號,不但可以測量轉(zhuǎn)速,還可以測量旋轉(zhuǎn)的方向,一般旋轉(zhuǎn)編碼器的AB相輸出信號相位差90°,如下所示。
正交解碼模式中的細節(jié)設置需要通過FTMx_QDCTRL寄存器完成。
A相輸入和B相輸入也可以使用類似輸入捕捉的濾波功能。原理同輸入捕捉,濾波值通過FTMx_FILTER寄存器設置。
濾波的作用是為了在電機速度或位置控制時,由于電機振動造成的AB相輸出干擾信號造成計數(shù)錯誤。正常情況下,電機勻速轉(zhuǎn)動,編碼器輸出信號如圖所示。
如果出現(xiàn)電機振動,則會出現(xiàn)如下波形。
正交解碼系統(tǒng)框圖如下所示
在正交解碼模式下,計數(shù)器的時鐘源來自外部的A相和B相輸入。
A相和B相的極性確定以后,則通過QUADMODE位設置加減計數(shù)模式。
如果QUADMODE=1,B相輸入值用于指示計數(shù)方向,A相輸入用于計數(shù),FTM計數(shù)器在A相輸入的每個上升沿進行計數(shù),累加或遞減由B相電平?jīng)Q定。如下圖所示。如果采用旋轉(zhuǎn)編碼器,則B相信號可由編碼器輸出的AB相通過D觸發(fā)器后輸入。
QUADMODE=1時計數(shù)模式
如果QUADMODE=0,則計數(shù)方向由AB相之間的關(guān)系決定,計數(shù)頻率由A相B相輸入信號決定。當A相或B相的信號出現(xiàn)跳
變,即可觸發(fā)FTM計數(shù)器改變。在這種模式下,只需要把旋轉(zhuǎn)編碼器的AB相輸出直接接到FTM的AB相輸入即可。下圖即為編碼器正向旋轉(zhuǎn)的AB相的關(guān)系示意圖。
在QUADMODE=0時,只要滿足以下任何一個條件,計數(shù)器即加1
l
A相出現(xiàn)上升沿時,B相為低電平;
l
B相出現(xiàn)上升沿時,A相為高電平;
l
B相出現(xiàn)下降沿時,A相為低電平;
l
A相出現(xiàn)下降沿時,B相為高電平。
在QUADMODE=0時,只要滿足以下任何一個條件,計數(shù)器即減1
l
A相出現(xiàn)上升沿時,B相為高電平;
l
B相出現(xiàn)上升沿時,A相為低電平;
l
B相出現(xiàn)下降沿時,A相為高電平;
l
A相出現(xiàn)下降沿時,B相為低電平。
如果計數(shù)溢出,可能為正向溢出,也可能為反向溢出。正向溢出時,計數(shù)器累加計數(shù)到MOD后,即返回到CNTIN,這時TOF置位,而TOFDIR位也置1,表示正向溢出。反向溢出時,即計數(shù)器遞減計數(shù),從CNTIN變?yōu)镸OD時,TOF置1,但TOFDIR為0,表示反向溢出。
正交解碼模式初始化例程如下,該例程使用A10和A11引腳輸入作為旋轉(zhuǎn)編碼器的A相和B相輸入。
void
FTM2_QUAD_Iint(void)
{
PORTA_PCR10= PORT_PCR_MUX(6); // 設置引腳 A10引腳為FTM2_PHA功能
PORTA_PCR11= PORT_PCR_MUX(6); // 設置引腳 A11引腳為FTM2_PHB功能
SIM_SCGC3|=SIM_SCGC3_FTM2_MASK;//使能FTM2時鐘
FTM2_MODE |= FTM_MODE_WPDIS_MASK;//寫保護禁止
FTM2_QDCTRL|=FTM_QDCTRL_QUADMODE_MASK;//AB相同時確定方向和計數(shù)值
FTM2_CNTIN=0;//FTM0計數(shù)器初始值為0
FTM2_MOD=65535;//結(jié)束值
FTM2_QDCTRL|=FTM_QDCTRL_QUADEN_MASK;//啟用FTM2正交解碼模式
FTM2_MODE |=
FTM_MODE_FTMEN_MASK;//FTM2EN=1
FTM2_CNT=0;
}
在周期性定時中斷服務程序中,讀取FTM2_CNT的值并清0計數(shù)值即可得到當前的轉(zhuǎn)速,使用int變量保存,如為正數(shù)則為正轉(zhuǎn),負數(shù)則為反轉(zhuǎn)。定時中斷處理程序入下。
void pit0_isr(void)
{
uint32 c;
PIT_TFLG0=PIT_TFLG_TIF_MASK;
pulse=FTM2_CNT;
FTM2_CNT=0;
c=PIT_CVAL0;
}
總結(jié)
以上是生活随笔為你收集整理的ftm模块linux驱动,飞思卡尔K60 FTM模块详解【二】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网站死链怎么处理?
- 下一篇: 书城项目第三阶段及其源码