日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

ftm模块linux驱动,飞思卡尔K60 FTM模块详解【二】

發布時間:2023/12/16 linux 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ftm模块linux驱动,飞思卡尔K60 FTM模块详解【二】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.5.3 FTM功能詳解

1.

FTM模塊的時鐘

FTM模塊的核心是一個16位計數器,該計數器的時鐘來源可設置(由FTMx_SC寄存器中的CLKS設置),可來自總線時鐘(CLKS=01),也可來自MCG模塊的MCGFFCLK,對時鐘源可進行分頻(由FTMx_SC寄存器中的PS設置)。

如果使用固定頻率時鐘,即fixed

frenquency clock,也就是MCGFFCLK,則需要在MCG模塊中設置。MCG模塊提供的MCGFFCLK,可以為其它片上周邊設備提供時鐘,該時鐘可由內部慢速參考時鐘提供或外部晶振,且由FLL分頻后提供。MCGFFCLK由C1_IREFS位設置來自內部32K還是來自外部經過FDIV分頻后的時鐘,輸出到MCGFFCLK還要2分頻一次。

MCGFFCLK用于局部總線時鐘同步,而且不得大于MCGOUTCLK的1/8。且該時鐘在MCG處于BLPI模式和STOP模式下無效。

一般情況下,只要不是對外部計數功能,我們都會采用Bus Clock為FTM提供時鐘。

2.

FTM模塊的計數模式

FTM模塊在時鐘確定后,計數器計數,默認情況下,對分頻后輸入時鐘進行遞增無符號計數。計數器初始值由FTMx_CNTIN指定。當一直計數到達FTMx_MOD寄存器的設定值時,TOF置位。計數器回到初始值,循環往復。如下圖所示,計數器從0計數到3,循環計數。計數周期時鐘周期。

初始值也可是負數,例如CNTIN=0xFFFC(補碼-4),MOD=4,則計數器從-4計數到4,循環計數。當CNTIN的最高位,即CNTIN[15]=1時,初始值作為負數對待,否則視為正數。

FTM計數時,建議MOD值必須大于CNTIN值,編程時需注意。如果MOD==CNTIN,則計數值一直保持MOD值,且TOF位一直置1。

當QUADEN=0(非正交解碼模式)且CPWMS=0(加法計數)時,計數器為加法計數,如果設置CPWMS=1,則進入先加后減計數模式。(中心對齊PWM必須將該位置1)。

在先加后減計數模式下,假設CNTIN=0,MOD=4,則計數過程如下

在該模式下,計數周期=2*(MOD-CNTIN),當計數值從MOD變為MOD-1時,TOF置位。

如FTMEN=0,此時FTM模塊功能等同于S08的TPM模塊,此時無論MOD=0或者MOD=0XFFFF,此時計數器為一個自由運行的16位計數器。

如FTMEN=1,且QUADEN=0、CPWMS=0時,此時只有MOD=0xFFFF時,才可作為一個自由運行的計數器。

任何對FTM計數器的寫入操作,都會復位計數器,計數器的值重新回到CNTIN指定值。也可以使用FTM的同步功能,讓計數器重新回到初值,各通道輸出也回到初始值。

FTMx_CONF寄存器中的NUMOF[4:0]可設置TOF置位的頻率。默認情況下,即NUMOF[4:0]=0,每個計數周期,TOF置位一次,如果NUMOF=n,(n<32),則每n+1個周期,TOF置位一次。

3.

邊沿對齊PWM模式

PWM輸出實際上利用的就是FTM的輸出比較的功能。當QUADEN = 0,DECAPEN = 0,COMBINE= 0,CPWMS = 0,

MSnB = 1時,FTM工作在EPWM模式下,即邊沿對齊模式。可用于產生舵機和電機的PWM控制信號。在這個模式下,FTM計數器工作方式和計數模式相同,默認為加法計數,計數到MOD值后自動返回CNTIN值。PWM信號的周期和計數器計數周期有關,PWM周期=(MOD-CNTIN+1)*時鐘周期。

PWM信號高低電平切換的時刻,則由CnV值決定,當計數器累加計數到CnV值相等時,PWM信號則翻轉。直到計數到MOD值,一個周期結束,信號回到初始值。這種模式的原理和輸出比較模式是相同的,當比較成功時,也就是FTM計數值=CnV時,CHnF標志也會置1。PWM信號的輸出可以時左對齊(信號先高后低)也可以是右對齊(信號先低后高)。左右對齊由ELSnB:ELSnA決定,若ELSnB:ELSnA=10則是左對齊模式,若ELSnB:ELSnA=X1則是右對齊模式。以左對齊為例,高電平持續時間=(CnV-CNTIN)*時鐘周期。

在邊沿對齊PWM模式中,一般PWM周期不變,通過改變CnV的值以改變占空比,如改變CnV的值,則新的值并不會立刻生效,而是到一個周期結束,FTM計數器從MOD變為CNTIN時,CnV值才生效。

EPWM例程如下,在該例程中,總線時鐘為60MHz,經過FTM分頻到3.75MHz,FTM遞增計數,周期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,遞增計數

FTM0_MODE &= ~1;//FTM0使能

FTM0_OUTMASK=0XF7;//通道3輸出,屏蔽其它通道

FTM0_QDCTRL&=~FTM_QDCTRL_QUADEN_MASK;//禁止正交解碼模式

FTM0_COMBINE=0;//DECAPEN=0,雙邊沿捕捉禁止,COMBINE=0,不級聯

FTM0_CNTIN=0;//FTM0計數器初始值為0

FTM0_MOD=37499;//結束值,周期為(MOD-CNTIN+1)*時鐘周期=10ms

FTM0_C3V=5625;//高電平1.5ms

FTM0_CNT=0;

}

4.

中心對齊PWM模式

中心對齊PWM模式和邊沿對齊PWM模式唯一不同之處在于CPWMS = 1,即此時計數器工作模式為先加后減模式,計數器累加到CnV時,信號翻轉,直到計數到MOD值后開始遞減計數,再次到達CnV時,信號再次翻轉,然后遞減到CNTIN值,一個周期結束。同樣的MOD、CNTIN、CnV,值,CPWM的周期是EPWM的兩倍,但占空比不變。

在中心對齊PWM模式下,ELSnB:ELSnA 的作用和EPWM相同,即ELSnB:ELSnA=10信號輸出先高后低,若ELSnB:ELSnA=X1信號輸出先低后高。

5.

輸入捕捉模式

FTM的輸入捕捉模式可捕捉外部信號的正跳變或負跳變,可替代外部中斷使用。和一般外部中斷不同的是,輸入捕捉功能不但可以在捕捉到特定的跳變時產生中斷,而且輸入引腳可以啟用濾波功能,關鍵是,輸入捕捉功能在捕捉到信號時,還可以記錄捕捉的時刻,即捕捉發生時,FTM計數器的值會記錄在CnV寄存器中。

輸入捕捉模式下,DECAPEN =

0(不啟用雙邊呀捕捉),COMBINE = 0(各通道獨立),CPWMS= 0(計數器累加計數),MSnB:MSnA = 0:0(輸入捕捉模式)。

此時,捕捉什么樣的信號則由ELSnB:ELSnA決定。

ELSnB:ELSnA=01:捕捉上升沿;

ELSnB:ELSnA=10:捕捉下降升沿;

ELSnB:ELSnA=11:捕捉上升沿或下降沿。

當對應的通道捕捉到設定的邊沿時,CHnF置位,如果對應的CHnIE=1,即中斷打開時,即可產生中斷。

在輸入捕捉模式下,當捕捉到設定的邊沿時,此時的FTM計數器的值將自動保存到CnV寄存器中,也就是在輸入捕捉模式下,CnV寄存器在程序中只可做讀出之用,寫入操作會被忽略。

每個FTM模塊的0~3通道可以啟用濾波功能,濾波原理是捕捉到邊沿時,延時若干個時鐘周期再置位CHnF。默認情況下,如不啟用濾波功能,則延時3個系統時鐘的上升沿。若啟用濾波功能,則延時可設置,但只有0~3通道可以設置。注意,捕捉模式下,CNTIN應為0。

當啟用濾波功能時,如果輸入端發生變化,則濾波器內部的5bit計數器開始累加計數,一旦溢出(溢出值由CHnFVAL[3:0]設定),輸入端變化才提交給邊沿檢測器。如果計數過程中,輸入端再次發生相反變化,則計數器會被復位并重新開始計數,這樣一些比過濾時間短的脈沖則會被視為干擾且不會提交給邊沿計數器。

6.

輸出比較模式

當DECAPEN =

0(禁止雙邊沿檢測),COMBINE = 0(各通道獨立),CPWMS = 0(計數器累加),MSnB:MSnA = 0:1時,FTM工作在輸出比較模式下。

在輸出比較模式下,計數器工作在累加模式下,當FTM計數器值=CnV值,時,比較成功,對應通道的引腳輸出高電平、低電平或翻轉信號。通道輸出由ELSnB:ELSnA決定,ELSnB:ELSnA=01:輸出翻轉,ELSnB:ELSnA=10:輸出低電平,ELSnB:ELSn=11:輸出高電平。同時,當比較成功時,對應CHnF置位,如CHnIE=1,則比較成功即引發中斷。

比較成功翻轉電平輸出,可用于輸出方波。實際上PWM波形的產生也是利用了輸出比較的功能實現的,輸出比較功能中如使用中斷且不輸出波形,也可實現定時中斷的功能。

7.

組合模式

以上幾種模式下,FTMEN=0即可,若要使用增強FTM的功能,即不同于PTM模塊功能,則必須FTMEN=1。組合模式就是其中一種,主要用于輸出非對稱PWM信號。

當FTMEN =

1(啟用增強功能)

,QUADEN =

0(不啟用正交解碼),DECAPEN = 0(不啟用雙邊沿捕捉),COMBINE = 1(相鄰通道組合使用)CPWMS = 0(計數器累加模式)時,FTM工作在組合模式下。

組合工作模式下,主要指的是偶數通道2n和相鄰的2n+1通道共同控制輸出PWM波形。PWM信號的周期和EPWM相同,但是高低電平的切換的時機則由C2nV和C2n+1V確定。電平第一次翻轉發生在通道2n比較成功,電平第二次翻轉發生在通道2n+1比較成功。在一個周期開始時,初始電平由ELSnB:ELSnA決定,這點和EPWM和CPWM相同。

在組合模式下,PWM信號的第一個邊沿只由C2nV決定,而第二個邊沿只由C2n+1V決定。兩個通道可獨立設置對應邊沿出現的位置,這就是非對稱的PWM輸出。

8.

互補模式

一般組合模式下,通道2n和通道2n+1輸出波形相同,如果啟用互補模式,則兩個通道輸出互為反向,在互補模式下,還可以啟用死區插入功能,這在某些兩路電機驅動的應用中是非常有用的。

當FTMEN =

1(啟用增強功能)

,QUADEN =

0(不啟用正交解碼),DECAPEN = 0(不啟用雙邊沿捕捉),COMBINE = 1(相鄰通道組合使用)CPWMS = 0(計數器累加模式)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,相關寄存器更新采用軟件觸發的方式。在這個例子中,我們采用了死區插入,死區時間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,遞增計數

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聯合使用

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;//死區插入

FTM0_DEADTIME=FTM_DEADTIME_DTPS(3)|FTM_DEADTIME_DTVAL(63);

FTM0_SYNCONF|=FTM_SYNCONF_SWWRBUF_MASK;//使能MOD,CNTIN,CV寄存器的軟件觸發同步

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計數器初始值為0

FTM0_MOD=37499;//結束值,周期為(MOD-CNTIN+1)*時鐘周期=10ms

FTM0_C2V=5625;//高電平1.5ms

FTM0_C3V=20000;

FTM0_CNT=0;

FTM0_SYNC|=FTM_SYNC_SWSYNC_MASK;//使能軟件觸發

}

在main函數的主循環中,我們可使用串口通信改變波形,通過示波器觀看,例程如下:

for(;;)

{

tom=

uart_getchar();

switch(tom)

{

case 'a':

FTM0_C3V+=50;

FTM0_SYNC|=FTM_SYNC_SWSYNC_MASK;//使能軟件觸發

break;

case 'd':

FTM0_C3V-=50;

FTM0_SYNC|=FTM_SYNC_SWSYNC_MASK;//使能軟件觸發

break;

case 'w':

FTM0_INVCTRL^=FTM_INVCTRL_INV1EN_MASK;//反轉

break;

default:break;

}

}

9.

正交解碼模式

當FTMEN=1,且QUADEN=1時,FTM工作在正交解碼模式。正交解碼模式使用A相和B相兩路輸入控制FTM計數器的加減。可作為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

正交解碼模式可用于輸入旋轉編碼器的A相和B相信號,不但可以測量轉速,還可以測量旋轉的方向,一般旋轉編碼器的AB相輸出信號相位差90°,如下所示。

正交解碼模式中的細節設置需要通過FTMx_QDCTRL寄存器完成。

A相輸入和B相輸入也可以使用類似輸入捕捉的濾波功能。原理同輸入捕捉,濾波值通過FTMx_FILTER寄存器設置。

濾波的作用是為了在電機速度或位置控制時,由于電機振動造成的AB相輸出干擾信號造成計數錯誤。正常情況下,電機勻速轉動,編碼器輸出信號如圖所示。

如果出現電機振動,則會出現如下波形。

正交解碼系統框圖如下所示

在正交解碼模式下,計數器的時鐘源來自外部的A相和B相輸入。

A相和B相的極性確定以后,則通過QUADMODE位設置加減計數模式。

如果QUADMODE=1,B相輸入值用于指示計數方向,A相輸入用于計數,FTM計數器在A相輸入的每個上升沿進行計數,累加或遞減由B相電平決定。如下圖所示。如果采用旋轉編碼器,則B相信號可由編碼器輸出的AB相通過D觸發器后輸入。

QUADMODE=1時計數模式

如果QUADMODE=0,則計數方向由AB相之間的關系決定,計數頻率由A相B相輸入信號決定。當A相或B相的信號出現跳

變,即可觸發FTM計數器改變。在這種模式下,只需要把旋轉編碼器的AB相輸出直接接到FTM的AB相輸入即可。下圖即為編碼器正向旋轉的AB相的關系示意圖。

在QUADMODE=0時,只要滿足以下任何一個條件,計數器即加1

l

A相出現上升沿時,B相為低電平;

l

B相出現上升沿時,A相為高電平;

l

B相出現下降沿時,A相為低電平;

l

A相出現下降沿時,B相為高電平。

在QUADMODE=0時,只要滿足以下任何一個條件,計數器即減1

l

A相出現上升沿時,B相為高電平;

l

B相出現上升沿時,A相為低電平;

l

B相出現下降沿時,A相為高電平;

l

A相出現下降沿時,B相為低電平。

如果計數溢出,可能為正向溢出,也可能為反向溢出。正向溢出時,計數器累加計數到MOD后,即返回到CNTIN,這時TOF置位,而TOFDIR位也置1,表示正向溢出。反向溢出時,即計數器遞減計數,從CNTIN變為MOD時,TOF置1,但TOFDIR為0,表示反向溢出。

正交解碼模式初始化例程如下,該例程使用A10和A11引腳輸入作為旋轉編碼器的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相同時確定方向和計數值

FTM2_CNTIN=0;//FTM0計數器初始值為0

FTM2_MOD=65535;//結束值

FTM2_QDCTRL|=FTM_QDCTRL_QUADEN_MASK;//啟用FTM2正交解碼模式

FTM2_MODE |=

FTM_MODE_FTMEN_MASK;//FTM2EN=1

FTM2_CNT=0;

}

在周期性定時中斷服務程序中,讀取FTM2_CNT的值并清0計數值即可得到當前的轉速,使用int變量保存,如為正數則為正轉,負數則為反轉。定時中斷處理程序入下。

void pit0_isr(void)

{

uint32 c;

PIT_TFLG0=PIT_TFLG_TIF_MASK;

pulse=FTM2_CNT;

FTM2_CNT=0;

c=PIT_CVAL0;

}

總結

以上是生活随笔為你收集整理的ftm模块linux驱动,飞思卡尔K60 FTM模块详解【二】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。