新聞中心

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

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

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

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

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

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

        PWM輸出功能

        PWM工作原理

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

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

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

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

        PWM例程講解

        前面講了FTM中的幾個(gè)小伙伴的故事,目的是為了讓大家了解PWM的工作流程,下面我們來(lái)具體看看例程中,是如何利用庫(kù)函數(shù)來(lái)生成PWM的。首先看例程“LPLD_ServoControl”,這是一個(gè)控制舵機(jī)轉(zhuǎn)動(dòng)的例程,我們知道舵機(jī)的控制PWM頻率一般是50Hz,其他的舵機(jī)有可能不同,因此我們的初始化函數(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//脈寬左對(duì)齊
        10
        );

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

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

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

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

        輸入捕獲功能

        IC工作原理

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

        輸入PWM頻率=fCNT/cv

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

        IC例程講解

        打開(kāi)例程“LPLD_InputCapture”,在這里例程中,我們利用FTM0生成一路PWM,用于測(cè)試他的頻率,用FTM1配置為輸入捕獲模塊,來(lái)采集PWM并計(jì)算他的頻率。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;//計(jì)數(shù)器頻率為總線時(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è)置計(jì)數(shù)器的分頻系數(shù)為128,剛才我們講過(guò)要計(jì)算PWM的頻率,就要知道CNT計(jì)數(shù)器的頻率,在OSKinetis固件庫(kù)中,CNT的時(shí)鐘源為總線時(shí)鐘,如果這里設(shè)置為FTM_CLK_DIV128,那么CNT的頻率就是總線頻率/128。
        Line 4:設(shè)置FTM的中斷函數(shù),用于處理捕獲事件。
        Line 6:使能輸入捕獲的輸入通道,和PWM的使能通道同理,這里要設(shè)置需要用到的通道號(hào)為FTM_Ch0,通道對(duì)應(yīng)的物理引腳為PTB0,捕獲邊緣為上升沿CAPTURE_RI。關(guān)于此函數(shù)的參數(shù)的具體范圍,請(qǐng)參考FTM模塊的在線函數(shù)手冊(cè)(點(diǎn)擊進(jìn)入)。
        Line 7:一定要記住使能中斷。


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

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

        評(píng)論


        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 法库县| 迭部县| 平舆县| 叙永县| 栾川县| 穆棱市| 三穗县| 清水县| 商都县| 金门县| 靖西县| 长武县| 虹口区| 永丰县| 都昌县| 罗源县| 青神县| 新丰县| 铅山县| 松溪县| 屯留县| 南开区| 日喀则市| 纳雍县| 靖安县| 化隆| 黄平县| 南丰县| 太谷县| 张掖市| 明溪县| 视频| 佛冈县| 交口县| 诸城市| 同仁县| 乌海市| 晋江市| 潢川县| 丰都县| 清远市|