k60的FTM模块:配置电机、编码器、舵机
FTM模塊既可以用于PWM模式來產生PWM波控制電機和舵機,也可以用于正交解碼模式用于讀取編碼器的脈沖數,從而實現測速。對于有兩個電機的智能車,兩個電機需要4路PWM波即對應著4個FTM通道(根據底層庫文檔:FTM0有8個通道,而FTM1、FTM2都只有2個通道,因此最好用FTM0來控制兩個電機),兩個編碼器也需要4路通道來解碼(用掉了FTM1和FTM2),剩下的舵機則只能用PIT定時器來模擬出一個PWM波了
觀察上圖,一旦你選定FTM模塊號(FTM0、1、2)和對應的通道號,那么引腳也就確定下來了。或者,即使你仍舊還是配置了對應的GPIO口,那么這些GPIO口必須與用到的這些FTM通道對應的引腳一致
一、電機配置
只需配置對應的額FTM模塊即可,在畫原理圖時電機需要接和FTM通道所對應的的那幾個引腳。接下來是配置FTM來驅動電機
FTM結構體:
1.聲明FTM的配置結構體
static FTM_InitTypeDef FTM_Init;2.選擇FTM模塊號(0、1、2共三個,區別在于通道數不同,對應的引腳有差別)
FTM_Init.FTM_Ftmx = FTM0;//選擇FTM0號3.選擇FTM的工作模式——選擇PWM模式。產生PWM波可以驅動電機,正交解碼主要用于編碼器計脈沖數來測速
FTM_Init.FTM_Mode = FTM_MODE_PWM;//PWM模式4.在PWM模式下需要確定輸出頻率。即一個周期最多有多少份,占空比不同,則控制電機的轉速不同
FTM_Init.FTM_PwmFreq = 15000;//總共15000份5.死區設置。防止同一個電機下的兩路同時導通造成破壞,因此,4路共需要2個死區。
FTM_Init.FTM_PwmDeadtimeVal = 2;//死區個數為2 FTM_Init.FTM_PwmDeadtimeCfg = DEADTIME_CH45 | DEADTIME_CH67;//在通道4、5之間,6、7之間各插入一個死區6.初始化或者使能
LPLD_FTM_Init(FTM_Init);//配置初始化//使能,并且可以選定通道和引腳的對應關系 LPLD_FTM_PWM_Enable(FTM0, FTM_Ch4, 0, PTD4, ALIGN_LEFT);//FTM0的通道ch4和引腳PTD4對應 LPLD_FTM_PWM_Enable(FTM0, FTM_Ch5, 0, PTD5, ALIGN_LEFT); LPLD_FTM_PWM_Enable(FTM0, FTM_Ch6, 0, PTD6, ALIGN_LEFT); LPLD_FTM_PWM_Enable(FTM0, FTM_Ch7, 0, PTD7, ALIGN_LEFT);使能過程確定了很多配置:模塊號、通道號、初始占空比、通道號對應的引腳號、脈沖對齊方式
7.控制電機的轉動
8.進一步的,在中斷中調用電機占空比的修改函數,這樣就涉及到了定時器PIT的配置以及對應的中斷優先級的配置,以下簡單說明:
8.1 PIT的配置
PIT模塊號有0、1、2、3,共4個定時器
定時周期T:每隔T時間就會觸發一次定時器中斷,調用對應的中斷函數
中斷函數:周期調用此函數,故可以把電機輸出函數放在這里從而實現周期控制電機輸出而不是一直控制,造成資源浪費
8.2 PIT中斷優先級的配置
static NVIC_InitTypeDef NVIC_InitStructure;//聲明NVIC配置結構體 NVIC_InitStructure.NVIC_IRQChannel = PIT0_IRQn;//要配置的那個中斷號即配置PIT0中斷 NVIC_InitStructure.NVIC_IRQChannelGroupPriority = NVIC_PriorityGroup_2;//中斷分組 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//配置搶占式優先級為最高級 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//配置響應式優先級為次高級 LPLD_NVIC_Init(NVIC_InitStructure);//初始化NVIC8.3 編寫中斷函數
void pit0_isr() {//每5ms修改一次電機轉速MotorOut(&PWM); }8.4 另外,上面這些函數顯然不能都放在一個.c文件中,由此又涉及到了多個.c文件之間的協調,主要就在對應的.h文件的編寫
8.5 PWM[ ]數組來自于根據速度偏差和PID算法計算出來的,在初期可先用常數值控制讓小車勻速運動,然后再添加控制程序
二、編碼器配置
編碼器用的是FTM的正交解碼模式,這里配置了一個編碼器
1.配置GPIO口,這些GPIO口和FTM正交解碼通道對應
2.配置FTM為正交解碼模式
static FTM_InitTypeDef Init_FTM_Struct;//聲明結構體 Init_FTM_Struct.FTM_Ftmx = FTM2;//選擇模塊號 Init_FTM_Struct.FTM_Mode = FTM_MODE_QD;//正交解碼模式 Init_FTM_Struct.FTM_QdMode = QD_MODE_PHAB;//AB相解碼模式,和編碼器類型有關 LPLD_FTM_Init(Init_FTM_StructR); LPLD_FTM_QD_Enable(FTM2, PTB18, PTB19);//使能,將模塊號和引腳對應3 . 獲取編碼器數值
4 . 定時器周期調用GetSpeed()函數,先配置PIT(同前面),然后放在PIT中斷函數中以實現周期調用
5 . 由編碼器脈沖數推測速度和行駛距離。設調用周期是T,行駛1m所產生的脈沖數是C,在T時間內調用GetSpeed()函數得到的脈沖數是L_count,則1s內產生的脈沖數應該是 L_count / T,對應的距離應該是(L_count / T)/ C,也就是1s內的行駛距離即速度
6 .根據測的當前速度和設定目標速度求速度偏差,然后通過PID算法算出應該輸出的PWM占空比值,輸出到電機
三、舵機控制
1.需配置舵機信號線 —— GPIO口
2 . PIT模擬產生PWM波。先是定時調用舵機輸出即信號線拉高,然后用這個PIT定時再把舵機輸出拉低,需要兩個PIT
2.1 配置PIT0來定時調用舵機輸出
void pit0_isr() {//定時調用舵機輸出ServOut(pwm); }2.2 配置PIT1來定時拉低舵機PWM從而實現模擬PWM波
static PIT_InitTypeDef Servo_pit; Servo_pit.PIT_Isr = Servo_pit_isr;//中斷函數 Servo_pit.PIT_PeriodUs = 200000;//200ms,隨便寫的,不影響 Servo_pit.PIT_Pitx = PIT1;//模塊號 LPLD_PIT_Init(Servo_pit); LPLD_PIT_EnableIrq(Servo_pit);PIT->CHANNEL[1].TCTRL &= ~PIT_TCTRL_TEN_MASK;//停止計時。然后過了20ms再通過PIT1中斷函數開始計時,實現了每20ms反轉一次電平 // 上面是配置舵機的程序片段//PIT1的中斷函數 void Servo_pit_isr() {PTD12_O = 0;//拉低PIT->CHANNEL[1].TCTRL &= ~PIT_TCTRL_TEN_MASK;//修改寄存器的值以停止計時 }//舵機輸出,每20ms調用一次,由PIT0的中斷函數調用 void ServOut(pwm) {PIT->CHANNEL[1].LDVAL = pwm*(g_bus_clock / 1000000) - 1;//把PID計算出的打角轉成占空比加載到PIT的LDVAL寄存器中PTD12_O = 1;//信號線電平拉高PIT->CHANNEL[1].TCTRL |= PIT_TCTRL_TEN_MASK;//開始計時即CVAL寄存器開始自減,減到0則觸發PIT1的中斷,//對應的中斷函數Servo_pit_isr中執行的是把電平拉低并停止計時 }//上面是兩個PIT配合形成的PWM波LDVAL寄存器:存放計數值,自減,當減到0時,PIT就會觸發中斷。但真正自減的并不是這個寄存器而是另外一個即CVAL寄存器,當CVAL減到0,PIT重新把LDVAL的值加載到CVAL寄存器
CVAL寄存器:真正在自減的寄存器,減到0則觸發中斷
TCTRL寄存器:2位可用,一位決定定時器是否開始工作即CVAL寄存器是否開始自減,一位決定是否產生定時中斷
過程圖示為:
觀察發現:
Servout()函數調用周期是20ms(由PIT0決定),而且主要負責拉高電平和給PIT1的LVDAL賦值即決定PIT1的中斷周期,這時PIT1的中斷周期不再是配置時的那個200ms了。當LVDAL加載的時間用盡而觸發了PIT1的中斷,調用對應的Servo_pit_isr()中斷函數再把舵機信號線電平拉低并且停止計時,等待下一次給LVDAL裝載值,而這個下一次給LVDAL裝載值就是下一次調用Servout()函數(此時距上次過去了20ms)
至于為什么是20ms,這和舵機基準信號的周期是20ms有關,可參考這篇介紹:https://blog.csdn.net/weixin_38907560/article/details/81546006
通過兩個PIT的配合,我們模擬出了一個PWM波,其中PIT0負責拉高和決定高電平持續時間,PIT1負責拉低電平
總結一下:
1.電機:FTM的PWM工作模式,一個電機有兩路分別控制正反轉,不能同時導通,需要配置死區,使能的時候把通道號與引腳號對應起來,通過底層庫函數修改占空比值來控制電機轉速,最好在中斷中調用
2.編碼器:FTM的正交解碼模式,一個編碼器有兩路(AB相或者方向計數),可通過庫函數直接讀取對應FTM的值即編碼器的值,同樣最好是在中斷中調用,并介紹了如何由編碼器計數值來推測小車的速度和行駛的距離
3.舵機:舵機的基準信號的周期是20ms,因此調用舵機輸出函數的周期也是20ms(是為了配合模擬PWM波),一個函數負責拉高信號線電平和決定高電平持續時間,一個負責拉低電平
以上是我關于電機、編碼器、舵機方面配置的總結
總結
以上是生活随笔為你收集整理的k60的FTM模块:配置电机、编码器、舵机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 临时文件_在Java中使用临时
- 下一篇: S32K144之SDK版:FTM定时器(