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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【智能车学习】FTM模块

發(fā)布時(shí)間:2023/12/16 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【智能车学习】FTM模块 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

什么是PWM?

FTM模塊(FlexTimer Module)

EPWM模式(Edge-Aligned PWM (EPWM) mode)

代碼

實(shí)例

正交解碼模式(Quadrature Decoder mode)

代碼


今天突然遇到一個(gè)問題,所以決定還是把智能車?yán)镉玫降腇TM模塊好好來理一下吧。

什么是PWM?

? ? ? ?PWM全稱是脈沖寬度調(diào)制,是現(xiàn)代電力電子控制里不可或缺的一項(xiàng)技術(shù),其基本原理大家都懂,不懂得的隔壁左轉(zhuǎn)百度。這里只貼一下定義:

? ? ? ?采樣控制理論中有一個(gè)重要結(jié)論:沖量相等而形狀不同的窄脈沖加在具有慣性的環(huán)節(jié)上時(shí),其效果基本相同。PWM控制技術(shù)就是以該結(jié)論為理論基礎(chǔ),對半導(dǎo)體開關(guān)器件的導(dǎo)通和關(guān)斷進(jìn)行控制,使輸出端得到一系列幅值相等而寬度不相等的脈沖,用這些脈沖來代替正弦波或其他所需要的波形。按一定的規(guī)則對各脈沖的寬度進(jìn)行調(diào)制,既可改變逆變電路輸出電壓的大小,也可改變輸出頻率。

? ? ? ?這里有一個(gè)點(diǎn)值得提及,那就是他的適用范圍:具有慣性的環(huán)節(jié)。這就是為什么伺服機(jī)構(gòu)可以用PWM控制,因?yàn)樗菓T性環(huán)節(jié),這點(diǎn)很重要。

FTM模塊(FlexTimer Module

? ? ? ?FTM全稱FlexTimer Module (柔性定時(shí)器模塊),它的工作框圖如下:

? ? ? ?FTM模塊的核心是一個(gè)16位計(jì)數(shù)器,該計(jì)數(shù)器的時(shí)鐘來源可設(shè)置(由FTMx_SC寄存器中的CLKS設(shè)置),既可來自系統(tǒng)時(shí)鐘System Clock,外部時(shí)鐘 External Clock,也可來自MCG模塊的 MCGFFCLK(MCG fixed frenquency clock)。一般情況下,只要不是對外部計(jì)數(shù)功能,我們都會(huì)采用系統(tǒng)時(shí)鐘的 Bus Clock 為FTM提供時(shí)鐘。
? ? ? ?FTM的時(shí)鐘源可進(jìn)行分頻(由FTMx_SC寄存器中的PS設(shè)置):

? ? ? ?作為一個(gè)高級單片機(jī)里的定時(shí)器模塊,FTM模塊具有多種功能供用戶使用,例如輸入捕獲,輸出比較,PWM比較,PWM輸出,AB相正交解碼等等,他們通過FTMx_CnSC寄存器進(jìn)行配置,如下圖:

FTMx_CnSC 寄存器的配置

? ? ? ?值得注意的是,這個(gè)寄存器是每個(gè)通道都有的,意味著單個(gè)FTM模塊的不同通道可以工作在不同模式下

? ? ? ?這其中我們用到的就是PWM輸出(電機(jī)、舵機(jī))和正交解碼(編碼器),下面分別介紹。

EPWM模式(Edge-Aligned PWM (EPWM) mode)

? ? ? ? EPWM模式全稱為邊緣對齊PWM模式,也就是輸出依照邊沿對齊,與之對應(yīng)的是中心對齊模式(CPWM),在這里我們選擇使用EPWM模式。

技術(shù)手冊里EPWM模式的描述

? ? ? ?該模式下計(jì)數(shù)值主要依據(jù)(FTMx_CNV)計(jì)數(shù)值寄存器和(FTMx_MOD)系數(shù)值寄存器兩者進(jìn)行控制,也就是通過分別配置MOD和CnV來控制。其中EPWM周期由(MOD-CNTIN+0x0001)決定,脈沖寬度(占空比)由(CnV-CNTIN)決定。

CNTIN必須設(shè)置為0

? ? ? ?CNTIN這個(gè)系數(shù)在使用EPWM模式時(shí)必須設(shè)置為0,因此周期和脈寬就分別由:(MOD+1)(CnV)決定。

? ? ? ??那么問題來了?模塊下各個(gè)通道間PWM頻率是否可以不同?

? ? ? ? 答案是不能,一組FTM模塊下的各個(gè)通道如果輸出PWM可以有不同的占空比,但不可以有不同的頻率。原因是因?yàn)楦鱾€(gè)通道可以配置自己獨(dú)立的 Channel Value(FTMx_CNV) 寄存器,但是他們只有一個(gè)公用的 Modulo(FTMx_MOD) 寄存器:

每組FTM模塊公用一個(gè)Modulo寄存器,各個(gè)通道都有各自的Channel Value寄存器

代碼

? ? ? ? 當(dāng)使用這個(gè)模式時(shí),應(yīng)該首先將上圖對應(yīng)通道的狀態(tài)控制寄存器(FTMx_CnSC)對應(yīng)位按上圖配置。然后再配置時(shí)鐘和分頻。最后寫入對應(yīng)的計(jì)數(shù)值完成計(jì)數(shù)。具體代碼如下(如果看不懂可以看下面的實(shí)例):

//@Src By ChenYX /******************** 選擇輸出模式為 邊沿對齊PWM *******************/ //通道狀態(tài)控制,根據(jù)模式來選擇 邊沿或電平 FTM_CnSC_REG(ftmn, ch) &= ~FTM_CnSC_ELSA_MASK; FTM_CnSC_REG(ftmn, ch) = FTM_CnSC_MSB_MASK | FTM_CnSC_ELSB_MASK;/******************** 配置時(shí)鐘和分頻 ********************/ FTM_SC_REG(ftmn) = ( 0| FTM_SC_PS(3) //分頻2^FTM_SC_PS,頻率為 bus clock/8| FTM_SC_CLKS(1) //時(shí)鐘選擇,bus時(shí)鐘 = system clock/2); /******************** 單個(gè)通道PWM頻率 ********************/ /*********** EPWM的周期為 :MOD - CNTIN + 0x0001 *********/ /*********** EPWM的占空比為 : CnV-CNTIN *****************/FTM_MOD_REG(ftmn) = mod; //PMW頻率=系統(tǒng)頻率/2/(2^FTM1_SC_PS)/FTMn_MOD FTM_CNTIN_REG(ftmn) = 0; //計(jì)數(shù)器初始化值CNTIN設(shè)置為0。 FTM_CnV_REG(ftmn, ch) = cv; //寫入計(jì)數(shù)值,設(shè)置脈沖寬度:CnV. FTM_CNT_REG(ftmn) = 0; //計(jì)數(shù)器開啟(寫任何值到此寄存器,都會(huì)加載 CNTIN 的值)

實(shí)例

? ? ? ? 我們以手冊里典型實(shí)例來舉個(gè)例子:

典型的EPWM模式應(yīng)用實(shí)例 寄存器名稱位所屬位范圍設(shè)置值作用FTMx_SCFTMx_CNTINFTMx_MODFTMx_CnV
PS[2:0]001B配置預(yù)分頻系數(shù)ps為2(2^1),對總線時(shí)鐘進(jìn)行二分頻(也就是對總線時(shí)鐘每記兩次后歸零)
CLKS[4:3]01B時(shí)鐘源為系統(tǒng)時(shí)鐘(System Clock)
INIT[15:0]0x0000計(jì)數(shù)器無初始值(無初始相位偏移)
MOD[15:0]0x0004PWM脈寬為?MOD + 1 = 4 + 1 =?5
VAL[15:0]0x0002高電平寬度為 VAL = 2

? ? ? ?現(xiàn)在,我們假設(shè)系統(tǒng)時(shí)鐘(System Clock)為120Mhz
? ? ? ?則總線時(shí)鐘(Bus Clock)為系統(tǒng)時(shí)鐘一半60Mhz
? ? ? ?經(jīng)過預(yù)分頻計(jì)數(shù)器后頻率再降低一半為30Mhz
? ? ? ?配置MOD寄存器為4,脈寬為5,則PWM頻率等價(jià)為1/5=6Mhz
? ? ? ?配置CnV寄存器為2,則占空比為2/5=40%。

? ? ? ?當(dāng)然,這只是個(gè)例子,智能車?yán)锏乃欧C(jī)構(gòu):電機(jī)、舵機(jī)是用不到這么高的頻率的,舵機(jī)一般均為50Hz,電機(jī)一般5~20 KHz不等,其設(shè)置的依據(jù)主要是其是否會(huì)對電磁信號產(chǎn)生影響,具體可以自己配置。

正交解碼模式(Quadrature Decoder mode)

? ? ? ?在現(xiàn)如今的比賽中,我們使用的大部分都是兩相輸出的增量型旋轉(zhuǎn)編碼器。這種編碼器輸出A、B兩相脈沖,這兩組脈沖不僅能夠表示轉(zhuǎn)速,還能表示方向,如圖所示,A相和B相脈沖數(shù)均表示轉(zhuǎn)數(shù),但當(dāng)A相信號相位超前時(shí),表示正轉(zhuǎn);B相信號相位超前時(shí),表示反轉(zhuǎn):

編碼器輸出脈沖

? ? ? ?編碼器輸出的兩相脈沖需要靠單片機(jī)進(jìn)行解碼才能讀取轉(zhuǎn)速信息,FTM模塊就提供了正交解碼這種工作模式。通過這種模式,它可以將輸入的A、B兩相脈沖解碼后得到計(jì)數(shù)值,進(jìn)而我們就可以獲得轉(zhuǎn)速信息進(jìn)行閉環(huán)控制。

? ? ? ?這張圖簡述了FTM正交解碼的簡單流程,輸入的信號先經(jīng)過同步器,再經(jīng)過配置濾波后,兩相信號會(huì)被送入FTM方向計(jì)數(shù)器,計(jì)算出方向后會(huì)再送入FTM計(jì)數(shù)器進(jìn)行帶方向的計(jì)數(shù)。

? ? ? ?正交解碼模式下可以通過 Quadrature Decoder Control And Status(FTMx_QDCTRL)寄存器進(jìn)行相關(guān)功能的配置。在該模式下有計(jì)數(shù)/方向編碼模式(Count and direction encoding mode)和 AB相編碼模式(Phase A and phase B encoding mode)。

? ? ? ?計(jì)數(shù)/方向編碼模式:B相輸入值用于指示計(jì)數(shù)方向,A相輸入用于計(jì)數(shù),FTM計(jì)數(shù)器在A相輸入的每個(gè)上升沿進(jìn)行計(jì)數(shù),累加或遞減由B相電平?jīng)Q定。

計(jì)數(shù)/方向編碼模式? ? Count and direction encoding mode

? ? ? AB相編碼模式:計(jì)數(shù)方向由AB相之間的關(guān)系決定,計(jì)數(shù)頻率由A相B相輸入信號決定。當(dāng)A相或B相的信號出現(xiàn)跳變,即可觸發(fā)FTM計(jì)數(shù)器改變。

AB相編碼模式? ? ? Phase A and phase B encoding mode

? ? ? ?大家是不是都覺得我們應(yīng)該使用的是第二種方式來計(jì)數(shù)呢?其實(shí)恰恰相反,我們的增量式編碼器輸出的信號是兩相同值信號,采用的是圖一的計(jì)數(shù)/方向編碼模式。:

? ? ? ?這里肯定有個(gè)疑問,明明增量式編碼器輸出的是A、B兩相信號,判斷方向依靠的是相位前后,為什么還要用計(jì)數(shù)/方向模式呢?別急,我把上面的圖標(biāo)記一下:

? ? ? ?明白了嗎?當(dāng)我們采用A方案時(shí),如果將B相信號用來計(jì)數(shù),A相信號用來表示方向的話。如果正轉(zhuǎn),A相信號一直超前于B相信號,所以每當(dāng)B相上升沿捕獲的時(shí)候,表示方向的A相都為1,則記為正傳,計(jì)數(shù)器+1。反之,當(dāng)反轉(zhuǎn)時(shí),每當(dāng)B相信號上升沿時(shí),A相滯后均為0,所以為反轉(zhuǎn),計(jì)數(shù)器-1。

? ? ? ?那為什么不用AB相編碼模式呢?道理也很簡單,如圖所示,A、B相信號只要有一個(gè)出現(xiàn)跳變時(shí)就會(huì)計(jì)數(shù),那么最后獲得的結(jié)果自然不是我們所需要的,不考慮臨界情況的會(huì)是我們實(shí)際脈沖的兩倍。

代碼

? ? ? ?當(dāng)使用正交解碼模式時(shí),我們只需要使能正交解碼和FTM模塊即可,下面是具體的代碼:

//@Src By ChenYX FTM_MODE_REG(ftmn) |= FTM_MODE_WPDIS_MASK; //寫保護(hù)禁止(不取消寫保護(hù)無法使能FTM) FTM_QDCTRL_REG(ftmn) |= FTM_QDCTRL_QUADMODE_MASK; //使用計(jì)數(shù)/方向編碼模式 FTM_CNTIN_REG(ftmn) = 0; //初始計(jì)數(shù)值為0 FTM_MOD_REG(ftmn) = FTM_MOD_MOD_MASK; //將MOD容器設(shè)置為最大,用于正交解碼 FTM_QDCTRL_REG(ftmn) |= FTM_QDCTRL_QUADEN_MASK; //使能正交解碼模式 FTM_MODE_REG(ftmn) |= FTM_MODE_FTMEN_MASK; //使能FTM FTM_CNT_REG(ftmn) = 0; //計(jì)數(shù)器開啟(寫任何值到此寄存器,都會(huì)加載 CNTIN 的值)

? ? ? ?如果我們需要獲得編碼器的數(shù)值,那我們需要設(shè)置PIT中斷,并在中斷里讀取 FTMx_CNT 寄存器里的COUNT數(shù)值,并在讀取后將其清零:

//@Src By ChenYX int16 val; val = FTM_CNT_REG(ftmn); //讀取寄存器里的計(jì)數(shù)值 FTM_CNT_REG(ftmn) = 0; //寄存器數(shù)值清空,為下一個(gè)周期脈沖計(jì)數(shù)做準(zhǔn)備 return val;

如有疑問或錯(cuò)誤,歡迎和我私信交流指正。
W.By ChenYX,未經(jīng)授權(quán),請勿轉(zhuǎn)載!

over~

總結(jié)

以上是生活随笔為你收集整理的【智能车学习】FTM模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。