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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【智能车学习】FTM模块

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

目錄

什么是PWM?

FTM模塊(FlexTimer Module)

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

代碼

實例

正交解碼模式(Quadrature Decoder mode)

代碼


今天突然遇到一個問題,所以決定還是把智能車里用到的FTM模塊好好來理一下吧。

什么是PWM?

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

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

? ? ? ?這里有一個點值得提及,那就是他的適用范圍:具有慣性的環節。這就是為什么伺服機構可以用PWM控制,因為它是慣性環節,這點很重要。

FTM模塊(FlexTimer Module

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

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

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

FTMx_CnSC 寄存器的配置

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

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

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

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

技術手冊里EPWM模式的描述

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

CNTIN必須設置為0

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

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

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

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

代碼

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

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

實例

? ? ? ? 我們以手冊里典型實例來舉個例子:

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

? ? ? ?現在,我們假設系統時鐘(System Clock)為120Mhz
? ? ? ?則總線時鐘(Bus Clock)為系統時鐘一半60Mhz
? ? ? ?經過預分頻計數器后頻率再降低一半為30Mhz
? ? ? ?配置MOD寄存器為4,脈寬為5,則PWM頻率等價為1/5=6Mhz
? ? ? ?配置CnV寄存器為2,則占空比為2/5=40%

? ? ? ?當然,這只是個例子,智能車里的伺服機構:電機、舵機是用不到這么高的頻率的,舵機一般均為50Hz,電機一般5~20 KHz不等,其設置的依據主要是其是否會對電磁信號產生影響,具體可以自己配置。

正交解碼模式(Quadrature Decoder mode)

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

編碼器輸出脈沖

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

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

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

? ? ? ?計數/方向編碼模式:B相輸入值用于指示計數方向,A相輸入用于計數,FTM計數器在A相輸入的每個上升沿進行計數,累加或遞減由B相電平決定。

計數/方向編碼模式? ? Count and direction encoding mode

? ? ? AB相編碼模式:計數方向由AB相之間的關系決定,計數頻率由A相B相輸入信號決定。當A相或B相的信號出現跳變,即可觸發FTM計數器改變。

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

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

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

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

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

代碼

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

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

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

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

如有疑問或錯誤,歡迎和我私信交流指正。
W.By ChenYX,未經授權,請勿轉載!

over~

總結

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

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