【智能车学习】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模式應用實例| PS | [2:0] | 001B | 配置預分頻系數ps為2(2^1),對總線時鐘進行二分頻(也就是對總線時鐘每記兩次后歸零) |
| CLKS | [4:3] | 01B | 時鐘源為系統時鐘(System Clock) |
| INIT | [15:0] | 0x0000 | 計數器無初始值(無初始相位偏移) |
| MOD | [15:0] | 0x0004 | PWM脈寬為?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模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦三国服务器每天维护几次,梦三国:都在抱
- 下一篇: matlab中subs赋值范围,[转载]