FOC(空間矢量控制)算法在永磁同步電機(jī)驅(qū)動(dòng)中應(yīng)用十分廣泛,在家電行業(yè)中無(wú)感FOC控制算法的應(yīng)用更加廣發(fā),通過軟件算法估算壓機(jī)轉(zhuǎn)速和位置,實(shí)現(xiàn)無(wú)感FOC的控制。
我會(huì)以產(chǎn)品開發(fā)的角度,將軟件開發(fā)過程進(jìn)行拆分,從系統(tǒng)架構(gòu)、軟件流程圖、狀態(tài)機(jī)、中斷處理、算法實(shí)現(xiàn)、異常操作和判斷一一和大家進(jìn)行探討。
一、系統(tǒng)架構(gòu)
本方案采用DSP28035作為主控芯片,PWM1A-PWM5B作為三個(gè)橋臂的驅(qū)動(dòng)輸出端,本方案采用雙電阻采樣,電阻采樣的信號(hào)通過ADC給到DSP芯片,另外母線電壓DC-Bus通過電阻分壓采樣也送入ADC端口。預(yù)留HOST端口,用232信號(hào)作為通信端口,接收上位機(jī)發(fā)送的數(shù)據(jù)進(jìn)行電機(jī)驅(qū)動(dòng)的頻率和力矩控制,具體如下:
無(wú)傳感器矢量控制的控制算法框圖如下,無(wú)感FOC最重要的就是觀察器,本方案采用滑膜觀測(cè)器,用于觀測(cè)電機(jī)的角度和速度。觀測(cè)器的設(shè)計(jì)好壞直接關(guān)系到系統(tǒng)的好壞。
二、軟件流程圖
系統(tǒng)初始化流程圖如下,初始化主要就是對(duì)DSP芯片的端口進(jìn)行配置,比如PWM端口,配置成PWM觸發(fā)ADC采樣。ADC端口配置對(duì)相電流、母線電壓等進(jìn)行采樣、IO端口配置輸入輸出功能、UART配置波特率等信息。開啟中斷功能。
系統(tǒng)中斷流程圖如下,PWM觸發(fā)ADC中斷,中斷頻率設(shè)置為10K,即PWM的驅(qū)動(dòng)頻率也為10K。中間也就是這個(gè)程序的重點(diǎn),F(xiàn)OC算法。
三、狀態(tài)機(jī)
我這里提出的狀態(tài)機(jī),是指程序運(yùn)行的狀態(tài)機(jī),我們常規(guī)的程序是在一個(gè)while循環(huán)里把除了中斷以為的所有的程序都在里面實(shí)現(xiàn)。然后再分為多個(gè)中斷,比如有的函數(shù)需要1ms、有的函數(shù)需要10ms,寫成中斷的方式進(jìn)行處理,然后控制算法在一個(gè)ADC中斷。
我這里采用的方案是利用定時(shí)器實(shí)現(xiàn)狀態(tài)機(jī),狀態(tài)機(jī)的處理時(shí)間就可以固定成1ms、或者10ms的處理時(shí)間,狀態(tài)機(jī)還可以延時(shí)出很多子函數(shù)。相當(dāng)于一個(gè)簡(jiǎn)易的操作系統(tǒng)。
1)初始化函數(shù):
void A0(void); //state A0
void B0(void); //state B0
void C0(void); //state C0
// A branch states
void A1(void); //state A1
void A2(void); //state A2
void A3(void); //state A3
void A4(void); //state A4
void (*Alpha_State_Ptr)(void); // Base States pointer
void (*A_Task_Ptr)(void); // State pointer A branch
void (*B_Task_Ptr)(void); // State pointer B branch
void (*C_Task_Ptr)(void); // State pointer C branch
2)主循環(huán):
for(;;) //infinite loop
{ // State machine entry & exit point
//==================================================
(*Alpha_State_Ptr)(); // jump to an Alpha state (A0,B0,...)
//===================================================
}
狀態(tài)機(jī)函數(shù)
//A1狀態(tài)機(jī)主要執(zhí)行的就是電機(jī)的運(yùn)行的控制過程,從空閑→啟動(dòng)→運(yùn)行→停止→等待→錯(cuò)誤狀態(tài)幾個(gè)狀態(tài)機(jī)之間循環(huán)。
void A1(void) // SPARE (not used)//--------------------------------------------------------{
switch(SystemState)
{
case STATE_IDLE:
StateIdle();
break;
case STATE_STARTUP:
StateStartUp();
break;
case STATE_RUN:
StateRun();
break;
case STATE_STOP:
StateStop();
break;
case STATE_WAITMIN:
StateWaitMin(N_MIN);
break;
case STATE_FAULT:
StateFault();
break;
default:
SystemState = STATE_FAULT;
break;
}
//-------------------
//the next time CpuTimer0 'counter' reaches Period value go to A2
A_Task_Ptr = &A2;
//-------------------
}
四、中斷處理&算法實(shí)現(xiàn)
本文的控制算法實(shí)現(xiàn)就是在中斷函數(shù)中進(jìn)行的,參考第2點(diǎn)的軟件流程圖,簡(jiǎn)單的來(lái)說就是ADC中斷(一般是PWM觸發(fā),也可以是定時(shí)器觸發(fā))→清除中斷標(biāo)志→算法→產(chǎn)生PWM驅(qū)動(dòng)→退出中斷。
算法部分也就是我系統(tǒng)款圖的里面的算法款圖,之前的文章有對(duì)具體CLARK變換、PARK變換以及滑膜觀測(cè)器的算法的具體實(shí)現(xiàn)代碼,感興趣的也可以再去看看。
算法的重點(diǎn)過程也就是先對(duì)采樣的相電流進(jìn)行CLARK和PARK變換,得到d軸和q軸的電流。d軸和q軸的電流再和參考的d軸和q軸的電流(也有說法叫給定的電流)做比較經(jīng)過PID控制器得到d軸和q軸的電壓,最后再經(jīng)過iPARK變換給到SVPWM軟件模塊輸出PWM驅(qū)動(dòng)信號(hào),對(duì)三相橋臂進(jìn)行驅(qū)動(dòng),實(shí)現(xiàn)電機(jī)的驅(qū)動(dòng),其中有兩個(gè)重點(diǎn)就是,給點(diǎn)電流Id和Iq的是根據(jù)什么來(lái)的,是根據(jù)速度PID環(huán)得到的,而速度PID環(huán)又是通過角度觀測(cè)器得到的。也就是我之前文章提到的滑膜觀察器(只是觀察器中的一種),同時(shí)PARK變化和iPARK需要的角度也是通過觀測(cè)器計(jì)算出來(lái)的。
//中斷函數(shù)關(guān)于算法部分的簡(jiǎn)單示例
interrupt void MainISR(void)
{
CLARKE_MACRO(clarke1); //clarke變換
park1.Alpha = clarke1.Alpha;
park1.Beta = clarke1.Beta;
park1.Sine = _IQsinPU(park1.Angle);
park1.Cosine = _IQcosPU(park1.Angle);
PARK_MACRO(park1); //PARK變換
PI_MACRO(pi_iq);//iq的PID控制器
PI_MACRO(pi_id);//id的PID控制器
ipark1.Ds = pi_id.Out;
ipark1.Qs = pi_iq.Out;
ipark1.Sine=park1.Sine;
ipark1.Cosine=park1.Cosine;
IPARK_MACRO(ipark1);//iPARK變換
volt1.MfuncV1 = svgen1.Ta;
volt1.MfuncV2 = svgen1.Tb;
volt1.MfuncV3 = svgen1.Tc;
PHASEVOLT_MACRO(volt1);
esmo1.Ialpha = clarke1.Alpha;
esmo1.Ibeta = clarke1.Beta;
esmo1.Valpha = volt1.Valpha;
esmo1.Vbeta = volt1.Vbeta;
esmo1.runSpeed = rc_spd.SetpointValue; // Suggestion from Igor
esmo1.cmdSpeed = rc_spd.SetpointValue;
eSMO_MODULE(&esmo1);
esmo1.Theta = angleFilter(&pi_smo, &esmo1); // optional - uncomment to include
speed3.EstimatedTheta = esmo1.Theta;
SE_MACRO(speed3);//速度
svgen1.Ualpha = ipark1.Alpha;
svgen1.Ubeta = ipark1.Beta;
SVGENDQ_MACRO(svgen1);//SVPWM輸出
}// MainISR Ends Here
五、異常操作和判斷
異常操作就相對(duì)簡(jiǎn)單了,主要就是判斷電機(jī)的過流(軟件、硬件)、缺相、母線電壓過壓、欠壓、功率器件過溫、電機(jī)啟動(dòng)失敗、電機(jī)堵住等。這些保護(hù)操作我一般是用一個(gè)1ms的狀態(tài)機(jī)里面進(jìn)行判斷。然后硬件過流和母線電壓過壓是直接在中斷里面去判斷,硬件過流是硬件完成的,一旦觸發(fā)過流就立馬關(guān)斷PWM,在中斷里面只是一個(gè)判斷是否有硬件過流的狀態(tài)。
申明:由于本人水平一般,分享的知識(shí)有誤,或者采用的方案不夠好的,歡迎各路大神指正批評(píng),給大家?guī)?lái)的不便,敬請(qǐng)諒解,本文觀點(diǎn)僅供參考。