性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

hello-boy
認(rèn)證:優(yōu)質(zhì)創(chuàng)作者
作者動(dòng)態(tài)
電機(jī)驅(qū)動(dòng)中弱磁控制和MTPA控制的差異
02-26 17:06
分享一個(gè)使用C語(yǔ)言實(shí)現(xiàn)鎖相環(huán)(PLL)以跟蹤輸入電壓(正弦波)的例程代碼
2024-10-30 17:18
一文讀懂幾種永磁同步電機(jī)(PMSM)的區(qū)別
2024-04-10 16:23
SJ/T 11893-2023《便攜式鋰離子電池儲(chǔ)能電源技術(shù)規(guī)范》解讀
2024-01-29 15:44
#征文#基于DSP的無(wú)感FOC驅(qū)動(dòng)嵌入式軟件設(shè)計(jì)
2024-01-17 21:15

#征文#基于DSP的無(wú)感FOC驅(qū)動(dòng)嵌入式軟件設(shè)計(jì)

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ù)

void A0(void)
{
//GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;    // Turn on/off LD3 on the controlCARD every 1ms
// loop rate synchronizer for A-tasks
if(CpuTimer0Regs.TCR.bit.TIF == 1)
{
CpuTimer0Regs.TCR.bit.TIF = 1; // clear flag
//-----------------------------------------------------------
(*A_Task_Ptr)(); // jump to an A Task (A1,A2,A3,...)
//-----------------------------------------------------------
}
Alpha_State_Ptr = &B0; // Comment out to allow only A tasks
}
void B0(void)
{
   // loop rate synchronizer for B-tasks
   if(CpuTimer1Regs.TCR.bit.TIF == 1)
   {
      CpuTimer1Regs.TCR.bit.TIF = 1; // clear flag
   //-----------------------------------------------------------
   (*B_Task_Ptr)(); // jump to a B Task (B1,B2,B3,...)
   //-----------------------------------------------------------
}
Alpha_State_Ptr = &A0; // Allow C state tasks
}

//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)僅供參考。

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 3
收藏 4
關(guān)注 169
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧