電流回路控制長期以來一直在過程控制系統和自動化制造設施中發揮重要作用。為了滿足對更高性能伺服系統的需求,制造商需要在基于高速 FPGA 和昂貴信號鏈的復雜設計中實現更快的電流環路控制解決方案。
但是,本文將使用德州儀器(TI) 的實際解決方案展示,微控制器硬件和軟件功能的最新進展使得在不犧牲性能的情況下降低實施成本成為可能。
控制回路操作
在許多控制系統中,設計人員依靠比例積分 (PI) 控制回路來管理電流或其他性能特征。原則上,這些控制器很簡單。他們使用期望性能和測量性能之間的誤差,根據兩個錯誤處理路徑的輸出生成校正信號(圖 1)。比例 (P) 路徑將增益應用于誤差;積分 (I) 路徑對誤差進行積分并放大結果。
?
圖 1:比例積分 (PI) 控制回路生成校正信號,該信號將積分測量信號誤差輸出與將簡單比例增益應用于誤差信號的路徑相結合。(圖片來源:德州儀器)
與更簡單的控制應用不同,伺服電機的設計依賴于三個相互依賴的性能特征:位置、速度和電流。為了改變電機轉子的位置,它的速度需要改變。反過來,為了改變其速度,通過脈寬調制 (PWM) 施加到電機繞組的電流需要改變。伺服電機控制開發人員在級聯控制結構中反映了這種循環相互依賴關系,如圖 2 所示。
?
圖 2:級聯伺服控制系統使用嵌套反饋回路來快速響應性能偏差,而不是等待影響傳播到整個控制結構。(圖片來源:NCTU)
這種嵌套方法通過在潛在錯誤傳播之前糾正它們來固有地幫助穩定性。例如,在負載變化顯著影響速度和位置之前,最里面的電流回路可以獨立地修改扭矩以響應負載變化。
同時,這種嵌套方法意味著外部循環的性能只能與其底層的內部循環一樣好。在伺服系統中,如果內環缺乏支持外環性能預期的帶寬,那么提高位置和速度性能的努力將不可避免地落空。最終,內部電流環路的性能有效地定義了整個伺服系統的性能極限。
電流回路控制很好理解,概念上也很簡單。電流控制器修改驅動逆變器的 PWM 輸出,逆變器反過來為電機繞組(或電源設計中的變壓器)供電。使用快速模數轉換器 (ADC) 測量電機電流,控制器可以確定修改 PWM 輸出以實現所需電機性能所需的校正信號。
然而,在這個概念上簡單的過程的核心,數字控制系統中使用的磁場定向控制 (FOC) 算法可能會帶來巨大的計算負擔。FOC 算法操縱電流的矢量表示,使用 Park 和 Clarke 變換來達到最佳解決方案(圖 3)。
?
圖 3:為了根據測量的電機性能調整 PWM 輸出,電機控制回路使用復雜的向量空間表示,包括提出了重要處理要求的 Park 和 Clarke 變換。(圖片來源:德州儀器)
在軟件庫中實現的高性能 MCU 可以足夠快地生成電流環路,以滿足傳統伺服系統的要求。在這些系統中,PI 控制器通常將電流環路帶寬限制在 PWM 載波頻率的 10% 左右,該載波頻率通常在 10 kHz 左右運行。
更高的帶寬會導致復雜性和電源管理問題
為了提高內部環路帶寬,設計人員已將 PWM 載波頻率提升至 30 kHz 及以上。然而,在這些更高的頻率下,傳統的電流環路設計開始滯后,無法足夠快地完成控制算法。因此,希望提高內部環路帶寬的開發人員已轉向基于 FPGA 的專用子系統,這些子系統旨在在更高的載波頻率上執行控制算法的計算(圖 4)。
?
圖 4:在提高 PWM 載波頻率提高內環性能的同時,工程師需要使用高速 FPGA 和 ADC 構建更復雜的電流環控制設計。(圖片來源:德州儀器)
盡管使用這些專用子系統提高了性能,但它也顯著提高了電流環路實現的成本和復雜性。設計人員需要添加組件,包括通常不集成到 FPGA 本身中的高速、高分辨率 ADC 和模擬比較器。在電機和 MCU 與 FPGA 的接口處,工程師需要確保最大吞吐量,最大限度地減少可能在這個關鍵處理循環中阻礙性能的任何延遲。除了處理額外的硬件要求外,這些系統的設計人員還需要在開發過程中解決 FPGA 代碼編程和調試的額外要求,然后最終將生產代碼存儲在主機 MCU 中。
雖然使用 FPGA 會增加自己的一組額外的硬件和軟件要求,但使用更高的 PWM 頻率會從根本上影響設計。在更高頻率下運行可能意味著額外的逆變器開關損耗和對更高功率驅動器的需求。這反過來又轉化為對更大、更高輸出電源的要求。增加的功率水平導致需要更強大的熱管理。
除了增加設計復雜性、尺寸和成本之外,與基于 FPGA 的電流回路設計相關的額外要求可能會影響項目進度和最終交付。相比之下,德州儀器 (TI) 的專用 MCU 和軟件消除了基于 FPGA 的電流環路控制的復雜性。
優化的基于 MCU 的解決方案簡化了高性能環路設計
通過利用德州儀器TMS320F28379S單核和TMS320F28379D雙核 C2000 Delfino MCU 的特殊功能,TI 快速電流環路 (FCL) 軟件庫使伺服設計人員能夠在不增加 PWM 載波的情況下實現內部控制環路的高帶寬性能頻率。使用這種方法,開發人員可以使用熟悉的基于 MCU 的設計和軟件開發方法構建高度響應的伺服應用程序。
TI 的方法可在 500 納秒 (ns) 內完成 FOC 處理并執行 PWM 更新,從而允許子周期 PWM 更新,而不是等待整個控制環路周期通過。這種方法讓開發人員可以在 10 KHz PWM 載波頻率下實現超過 3 kHz 的控制環路帶寬,將控制環路帶寬增加三倍,而無需像基于 FPGA 的方法所要求的那樣將 PWM 載波頻率增加三倍。
這種更簡單的設計方法提高性能的關鍵在于專門的 C2000 MCU 結構與 FCL 軟件相結合,以提供與傳統的基于 FPGA 的控制回路相當的功能和性能(圖 5)。這些專用 MCU 基于 TI 的 32 位 C28x 浮點 CPU,將完整的模擬和數字外設與專用功能塊集成在一起。
?
圖 5:TI TMS320F28379S 和 TMS320F28379D C2000 Delfino MCU 中的集成外設和專用模塊提供與以前使用 FPGA 構建的控制回路元件相當的功能和性能,以實現快速電流回路性能。(圖片來源:德州儀器)
TI 設計的這些外設和模塊不僅具有片上特性的集合,而且集成度特別高,適合高速控制環路操作。例如,為了捕獲控制環路計算中使用的數據,MCU 集成了一個靈活的模擬信號鏈,其中包括一個比較器子系統 (CMPSS) 和四個高速 ADC。每個 CMPSS 都包括一個專用模擬信號路徑(圖 6),其輸出連接到集成交叉開關,連接到 GPIO 多路復用器、ADC 和 PWM 子系統。同樣,工程師可以使用交叉開關將 ADC 的輸出引導至 PWM 和其他模塊。
?
圖 6:TI 通過構建緊密集成的功能(例如在其基于 MCU 的控制環路解決方案的輸入端使用的比較器子系統)實現類似 FPGA 的控制環路性能。(圖片來源:德州儀器)
片上 Sigma-Delta 濾波器模塊 (SDFM) 包括四個獨立的比較器和四個獨立的濾波器,它們支持圖 5 所示控制回路中使用的 sinc 濾波器功能。在控制回路的輸出端,MCU 結合了其增強的具有高分辨率脈沖寬度調制器 (HRPWM) 的 PWM 子系統,步長分辨率為 150 皮秒 (ps)(典型值)。在 PWM 模塊中,跳閘子模塊響應各種故障或強制事件條件,以緩解短路或過流條件等問題。
除了這些先進的 I/O 子系統,MCU 還提供了完善對高速控制回路設計的支持所需的專用模塊。在這些塊中,集成的可配置邏輯塊 (CLB) 提供了實現邏輯功能所需的資源,否則這些邏輯功能需要額外的外部設備。對于開發人員,TI 提供了一系列配置 CLB 以支持特定類型功能的軟件資源。
特別是對于高速電流環路,TI 提供了使用 CLB 提供位置管理器功能的軟件,如圖 5 所示。在這種情況下,位置管理器支持行業標準的雙向編碼器接口,例如 EnDat 和 BiSS。
這些雙向編碼器接口專為傳輸位置和控制數據而設計,具有很高的性能要求。BiSS 解決方案通常基于 FPGA 或 ASIC,特別是用于實現連續模式 BiSS 或 BiSS-C。相反,TI 的 BiSS-C 位置管理器使用在 MCU 上運行的軟件和 MCU 硬件資源(包括 SPI 接口、交叉開關和 CLB)的組合來實現編碼器接口(圖 7)。
?
圖 7:TI 使用 MCU 可配置邏輯塊 (CLB) 和其他 MCU 功能來實現復雜邏輯,例如連續模式雙向串行同步 (BiSS-C) 編碼器接口。(圖片來源:德州儀器)
在提供高速電流環路解決方案時,TI 將這些資源與其 FCL 庫相結合,后者可處理前面提到的 FOC 計算。在這里,庫進一步利用了專門的 MCU 硬件,包括集成的三角數學單元 (TMU) 和控制律加速器 (CLA),它們可以從處理器內核中卸載數學密集型處理。例如,控制回路代碼可以使用 CLA 獨立處理編碼器反饋,并使用 TMU 以比基于處理器的計算快近一個數量級的速度執行 Park 和 Clarke 變換。
隱藏復雜性
也許最重要的是,FCL 庫隱藏了實現伺服回路控制所需的所有詳細操作的復雜性,使開發人員能夠專注于他們的獨特需求。FCL 應用程序編程接口 (API) 僅包含表 1 中所示的幾個功能。
API函數描述
Uint32 FCL_GetSwVersion(void);返回一個 32 位常量;對于此版本,返回的值為 0x00000002
無效 FCL_Complex_Ctrl(無效);作為 FCL 的一部分執行復雜控制
無效 FCL_PI_Ctrl(無效);作為 FCL 的一部分執行 PI 控制
無效 FCL_PI_CtrlWrap(無效);PI 控制模式下 FCL 完成時用戶應用程序調用的結束函數
無效 FLC_QEP_wrap(無效);由用戶應用程序調用以處理 QEP 反饋完成。該函數僅在 FCL_LEVEL2 中使用。
無效 FCL_Complex_CtrlWrap(無效);復雜控制模式下 FCL 完成時用戶應用程序調用的總結函數
無效 FCL_initPWM(易失性結構 EPWM_REGS *ePWM);為 FCL 操作初始化 PWM,此函數由用戶應用程序在初始化或設置過程中調用
無效 FCL_ControllerReset(無效);調用以重置 FCL 變量,當用戶想要停止和重新啟動電機時很有用
表 1:德州儀器快速控制庫 (FCL) 將基于 FOC 的電流環路控制的復雜性隱藏在一個簡短的 API 后面。(表格來源:德州儀器)
除了這些函數的 C 接口聲明外,FCL 頭文件還包括一些額外的包引用和一個關鍵的 C 結構,該結構包含與當前循環相關的少數必需參數(清單 1)。
復制
// ==============================================================
typedef struct currentLoopPars {
float32 CARRIER_MID, // Mid point value of carrier count
ADC_SCALE, // ADC conversion scale to pu
cmidsqrt3; // internal variable
float32 tSamp, // sampling time
Rd, // Motor resistance in D axis
Rq, // Motor resistance in Q axis
Ld, // Motor inductance in D axis
Lq, // Motor inductance in Q axis
Vbase, // Base voltage for the controller
Ibase, // Base current for the controller
wccD, // D axis current controller bandwidth
wccQ, // Q axis current controller bandwidth
Vdcbus, // DC bus voltage
BemfK, // Motor Bemf constant
Wbase; // Controller base frequency (Motor) in rad/sec
} FastCurrentLoopPars_t;
清單 1:德州儀器 (TI) 的集成控制回路解決方案意味著開發人員只需要幾個軟件結構,例如這個用于 TI controlSUITE軟件包中提供的控制回路參數的軟件結構。(代碼來源:德州儀器)
雖然 FCL 庫隱藏了設計基于 FOC 的電流環路的復雜性,但伺服控制操作的復雜性是不可避免的。為幫助開發人員評估性能并獲得伺服控制操作經驗,德州儀器 (TI) 提供了TMDXIDDK379D DesignDrive 開發套件,該套件提供了基于 TI FCL 庫的伺服控制設計的完整實現。除了硬件板,TI 還提供了一套完整的原理圖和制造數據,開發人員可以擴展這些數據來開發他們的定制伺服應用。
由于關鍵控制回路機制內置于底層 MCU 和 FCL 庫中,因此開發人員需要相對較少的附加組件來實現完整的伺服設計。如原理圖中詳述,設計可以使用幾個無源元件和三個 TI 器件實現 EnDat 或 BiSS 編碼器接口的硬件端:SN65HVD3088ED RS485 收發器;TXB0104DR電平轉換器;和TPS27082L高側負載開關(圖 8)。
?
圖 8:德州儀器 controlSUITE 包中包含的原理圖演示了簡單的硬件接口,例如這個最小的 EnDat-BiSS 接口,需要補充使用 MCU CLB 在片上實現的完整編碼器功能。(圖片來源:德州儀器)
與硬件設計一樣,TI 快速控制環路解決方案的軟件設計在概念上更為簡單。因為 MCU 的專用硬件和專用固件的組合完成了所有工作,所以軟件開發在很大程度上是一個設置 MCU 和配置平臺的過程。例如,TI 軟件包提供了一個簡單的main()例程,其中包含數百行代碼,這些代碼嚴格關注初始化 MCU 和 FCL 功能并配置其設置。實際的主例程只是一個空的等待循環(清單 2)。
//*****************************************************************************
void main(void)
{
// Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the F28M3Xx_SysCtrl.c file.
InitSysCtrl();
// Only used if running from FLASH
// Note that the variable FLASH is defined by the compiler
#ifdef _FLASH
// Call Flash Initialization to setup flash waitstates
// This function must reside in RAM
InitFlash(); // Call the flash wrapper init function
#endif //(FLASH)
// Enable Interrupt Generation from the PWM module
EPwm1Regs.ETSEL.bit.INTEN=1;
// This needs to be 1 for the INTFRC to work
EPwm1Regs.ETPS.bit.INTPRD=ET_1ST;
EALLOW;
PieVectTable.ADCC1_INT = &ResolverISR;
//PieVectTable.EPWM11_INT = &MotorControlISR;
// PieVectTable.ADCA1_INT = &MotorControlISR;
PieVectTable.EPWM1_INT = &MotorControlISR;
// PieVectTable.TIMER1_INT = &TimerISR;
// PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // Enable ADCA1INT in PIE group 1
// PieCtrlRegs.PIEIER3.bit.INTx11 = 1; // Enable PWM11INT in PIE group 3
PieCtrlRegs.PIEIER3.bit.INTx1 = 1; //// Enable PWM1INT in PIE group 3
#if POSITION_ENCODER == RESOLVER_POS_ENCODER
PieCtrlRegs.PIEIER1.bit.INTx3 = 1; // Enable ADCC1INT in PIE group 1
#endif
IER |= M_INT3; // Enable group 3 interrupts - EPWM1, 11 are here
// IER |= M_INT1; // Enable group 1 interrupts - ADCA, B are here
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
EDIS;
// ***************************************************************************
// Initializations COMPLETE
// - IDLE loop. Just loop forever
// ***************************************************************************
for(;;) //infinite loop
{
// State machine entry & exit point
//===========================================================
(*Alpha_State_Ptr)(); // jump to an Alpha state (A0,B0,。。.)
//===========================================================
}
} //END MAIN CODE
清單 2:德州儀器 controlSUITE 中軟件示例的這個片段演示了如何設置快速控制回路操作在很大程度上是一個初始化 MCU 和快速控制回路庫的過程;主程序本身就是一個簡單的等待循環。(代碼來源:德州儀器)
一旦在啟動時配置了 MCU,使用 TI 方法實現控制環路所需的大部分工作就是提供適當的中斷服務例程 (ISR) 來處理電機控制任務。TI 使用快速控制回路示例軟件模塊中提供的 MotorControlISR 功能演示了此類 ISR。在設置期間啟用(例如,PieVectTable.ADCC1_INT = &ResolverISR在清單 2 中),MotorControlISR 函數說明了軟件工程師如何使用 FCL API 來執行測量和生成輸出(清單 3)。
// =============================== FCL_LEVEL 3 ======================================
// Level 3 verifies the dq-axis current regulation performed by PID and speed
// measurement modules
// lsw=0: lock the rotor of the motor
// lsw=1: close the current loop
// NOTE:-
// 1. Iq loop is closed using actual QEP angle.
// Therefore, motor speed races to high speed with lighter load. It is better
// to ensure the motor is loaded during this test. Otherwise, the motor will
// run at higher speeds where it can saturate. It may be typically around the
// rated speed of the motor or higher.
// 2. clarke1.As and clarke1.Bs are not brought out from the FCL library
// as of library release version 0x02
// ==============================================================================
//TODO INCRBUILD 3
#if (BUILDLEVEL==FCL_LEVEL3)
#if (FCL_CNTLR == PI_CNTLR)
FCL_PI_Ctrl();
#endif
#if (FCL_CNTLR == CMPLX_CNTLR)
FCL_Complex_Ctrl();
#endif
// ------------------------------------------------------------------------------
// fcl_cycle_count calculations for debug
// customer can remove the below code in final implementation
// ------------------------------------------------------------------------------
get_FCL_time();
// ------------------------------------------------------------------------------
// Measure DC Bus voltage using SDFM Filter3
// ------------------------------------------------------------------------------
FCL_Pars.Vdcbus = (temp=SDFM1_READ_FILTER3_DATA_16BIT)*SD_VOLTAGE_SENSE_SCALE;
if (FCL_Pars.Vdcbus 《 1.0)
FCL_Pars.Vdcbus = 1.0;
// ------------------------------------------------------------------------------
// Fast current loop controller wrapper
// ------------------------------------------------------------------------------
#if (FCL_CNTLR == PI_CNTLR)
FCL_PI_CtrlWrap();
#endif
#if (FCL_CNTLR == CMPLX_CNTLR)
FCL_Complex_CtrlWrap();
#endif
// ------------------------------------------------------------------------------
// Alignment Routine: this routine aligns the motor to zero electrical angle
// and in case of QEP also finds the index location and initializes the angle
// w.r.t. the index location
// ------------------------------------------------------------------------------
if(!RunMotor)
{
lsw = 0;
pi_id.Ref = IdRef = 0;
FCL_ControllerReset();
}
else if (lsw == 0)
{
// alignment current
IdRef = IdRef_start; //IQ(0.1);
// set up an alignment and hold time for shaft to settle down
if (pi_id.Ref 》= IdRef)
{
if (++cntr 》= alignCnt)
{
cntr = 0;
// IdRef = IdRef_run;
#if POSITION_ENCODER==QEP_POS_ENCODER
lsw = 1; // for QEP, spin the motor to find the index pulse
#else
lsw = 2; // for absolute encoders no need for lsw=1
#endif
}
}
} // end else if (lsw=0)
else if (lsw == 2)
IdRef = IdRef_run;
// ------------------------------------------------------------------------------
// Connect inputs of the RMP module and call the ramp control macro
// ------------------------------------------------------------------------------
if(lsw==0) rc1.TargetValue = rc1.SetpointValue = 0;
else rc1.TargetValue = SpeedRef;
RC_MACRO(rc1)
// ------------------------------------------------------------------------------
// Connect inputs of the RAMP GEN module and call the ramp generator macro
// ------------------------------------------------------------------------------
rg1.Freq = rc1.SetpointValue;
RG_MACRO(rg1)
posEncElecTheta[POSITION_ENCODER] = qep1.ElecTheta;
speed1.ElecTheta = posEncElecTheta[POSITION_ENCODER];
SPEED_FR_MACRO(speed1)
//------------------------------------------------------------------------------
// Variable display on DACs B and C
//------------------------------------------------------------------------------
DacbRegs.DACVALS.bit.DACVALS = DAC_MACRO_PU(pi_iq.Ref); //rg1.Out*4096;
DaccRegs.DACVALS.bit.DACVALS = DAC_MACRO_PU(pi_iq.Fbk); //posEncElecTheta[POSITION_ENCODER]*4096;
// ------------------------------------------------------------------------------
// setup iqref for FCL
// ------------------------------------------------------------------------------
pi_iq.Ref = (lsw==0) ? 0 : IqRef;
// ------------------------------------------------------------------------------
// setup idref for FCL
// ------------------------------------------------------------------------------
pi_id.Ref = ramper(IdRef, pi_id.Ref, _IQ(0.00001));
// ------------------------------------------------------------------------------
// Connect inputs of the DATALOG module
// ------------------------------------------------------------------------------
DlogCh1 = posEncElecTheta[POSITION_ENCODER];
DlogCh2 = rg1.Out;
DlogCh3 = pi_iq.Ref;
DlogCh4 = pi_iq.Fbk;
#endif // (BUILDLEVEL==FCL_LEVEL3)
清單 3:德州儀器 controlSUITE 示例軟件展示了開發人員如何在很大程度上將控制循環實現代碼歸類為中斷服務例程,而中斷服務例程只需要對 TI 快速控制循環 (FCL) 庫進行幾次 API 調用。(代碼來源:德州儀器)
盡管演示套件和軟件有助于簡化開發,但對于經驗不足的工程師來說,伺服控制操作可能會讓人望而生畏。為了幫助設計人員更好地理解伺服控制,TI 開發套件讓他們可以通過一系列增量構建級別來探索其操作。在這里,開發人員只需通過設置來選擇構建級別BUILDLEVEL(例如,參見清單 3)。在演示了基本 PWM 信號輸出(級別 1)和開環操作(級別 2)之后,開發人員使用接下來的三個構建級別來仔細檢查全伺服控制設計的每個嵌套循環的操作(圖 9)。
?
圖 9:使用 TMDXIDDK379D DesignDrive 開發套件和 TI controlSUITE 軟件,開發人員可以在一系列階段探索伺服控制設計,首先評估最里面的電流控制環(綠色),然后添加速度環(藍色),最后添加完整伺服設計中的位置環(橙色)。(圖片來源:德州儀器)
BUILDLEVEL=FCL_LEVEL3例如,通過設置,開發人員可以探索內循環本身的操作。在這個級別內,開發人員甚至可以測試使用不同底層機制或參數的效果。例如,通過設置FCL_CNTLR 3 級 ISR(參見清單 3),開發人員可以選擇使用 PI 控制器 ( FCL_CNTLR=PI_CNTLR) 或復雜控制器 ( FCL_CNTLR=CMPLX_CNTLR) 來操作循環。如清單 3 所示,基于FCL_CNTLR設置的條件編譯只會調用相應的 FCL API 例程(參見表 1)。使用這種方法,開發人員可以逐步沉浸在完整伺服控制設計的操作中,最終在 TI 開發套件的基礎上構建自己的高速伺服應用。
結論
在伺服回路中,內部電流控制回路的性能有效地定義了整個伺服控制應用的局限性。過去,希望增強內環的開發人員不得不提高 PWM 載波頻率,并通過使用 FPGA 和高速 ADC 構建的子系統支持更高的頻率。
開發人員無需面對與此方法相關的成本和可能的延遲,而是可以利用 TI 結合了專用 MCU 和軟件庫的更簡單的解決方案。使用這種方法,開發人員可以創建伺服控制應用程序,僅使用基于 FPGA 的專門設計就可以實現內環性能,而時間和成本只是其中的一小部分。
評論