• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

正弦波过零畸变求助!

现在使用F28027做单相逆变器,使用PI控制器,详细程序见下面!
现在遇到逆变输出的正弦波过零附近出现畸变,电压和电流波形见附图

 

 

 

// -----------------------------------------------------------
// PIE Group 1 - MUXed into CPU INT1
// -----------------------------------------------------------
// INT1.1  Can also be ISR for INT10.1 when enabled
interrupt void ADCINT1_ISR(void)  
{
 signed int Width_Pulse=0;
 signed int temp=0;
 if(++sym_clock==400)
   {
    sym_clock=0;
    Vol_Peak_Shadow=Vol_Peak;
    Width_Compensate=-Width_Sum/400;
    if((sym_state==0)&&((Width_Compensate>300)||(Width_Compensate<-300)))
      {
       EALLOW;
       //GpioDataRegs.GPACLEAR.bit.GPIO5  = 1;
       sym_state=3;
       EDIS;
       }
    }
   
 
 if(sym_clock>=200)
   {
    Vol_Ref=-SinTable[sym_clock-200]*Vol_Peak_Shadow;
    }
 else  
   {
    Vol_Ref=SinTable[sym_clock]*Vol_Peak_Shadow;
    }
 temp=AdcResult.ADCRESULT3>>2;  
 Vol_Feed=(float)(temp-517)*SCALE_VOLTAGE;
 //Vol_Feed=(float)(temp-Offset_Adcb3)*SCALE_VOLTAGE;
 //Vol_Feed=(float)(660-Offset_Adcb3)*SCALE_VOLTAGE;
   
 Vol_Err    =Vol_Ref-Vol_Feed;    
 Vol_Out    =Vol_Err*0.12365;//-Vol_Err_Last*0.012365*0.7334+Vol_Out;

 
 
 Vol_Err_Last=Vol_Err;
 
 Width_Pulse=(int)(Vol_Out/330*1500);
 
 Width_Pulse=Width_Pulse+Width_Compensate;  
 
 if(Width_Pulse>3)
   {
    if(Width_Pulse>=1472)
      {
       Width_Sum=Width_Sum+1500;
       Width_Pulse=0;
       }
    else
      {
       Width_Sum=Width_Sum+Width_Pulse;
       Width_Pulse=1475-Width_Pulse;
       }
    EALLOW;
    EPwm1Regs.CMPA.half.CMPA      =Width_Pulse;
    EPwm2Regs.CMPA.half.CMPA      =1600;
    EDIS;
    }
 else
   {
    if(Width_Pulse<-3)
      {
       Width_Pulse=-Width_Pulse;
       if(Width_Pulse>=1472)
         {
          Width_Sum=Width_Sum-1500; 
          Width_Pulse=0;
          }
       else
         {
          Width_Sum=Width_Sum-Width_Pulse;
          Width_Pulse=1475-Width_Pulse;
          }
       EALLOW; 
       EPwm1Regs.CMPA.half.CMPA      =1600;
       EPwm2Regs.CMPA.half.CMPA      =Width_Pulse;
       EDIS;
       }
    else
      {
       EALLOW;
       EPwm1Regs.CMPA.half.CMPA      =1600;
       EPwm2Regs.CMPA.half.CMPA      =1600;
       EDIS;
       }
    }
 sym_tick=1;

 Vol_Square_Sum=Vol_Square_Sum+Vol_Feed*Vol_Feed;
 if(sym_clock==200)
 {
  Vol_Sqr_Sum_Shw=Vol_Square_Sum;
  Vol_Square_Sum=0;
  sym_RMS=1;
  }
 
 EALLOW;
 AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;       //Clear ADCINT1 flag reinitialize for next SOC
 AdcRegs.ADCINTOVFCLR.bit.ADCINT1 = 1;
 PieCtrlRegs.PIEACK.bit.ACK10     = 1;        //Acknowledge interrupt to PIE
 EDIS;
}

全部回复(6)
正序查看
倒序查看
holyfaith
LV.8
2
2010-09-07 11:39

在计算的时候加有死区吧,这是由那个引起的

0
回复
2010-09-08 21:27
@holyfaith
在计算的时候加有死区吧,这是由那个引起的

现在更郁闷!

整个控制只能用P控制,加入I控制,波形立马偏到一边,然后过流保护!

是我的算法问题?还是其它?

算法如下:

Vol_Out=Vol_Err*0.12365-Vol_Err_1*0.12365+Vol_Err_2*0.12365+Vol_Out_1*1.02-Vol_Out_2*0.5(几个系数不是实际值)

Vol_Err_2=Vol_Err_1;

Vol_Err_1=Vol_Err;

Vol_Out_2=Vol_Out_1;

Vol_Out_1=Vol_Out;

0
回复
holyfaith
LV.8
4
2010-09-09 12:03
@gnaijnaoul
现在更郁闷!整个控制只能用P控制,加入I控制,波形立马偏到一边,然后过流保护!是我的算法问题?还是其它?算法如下:Vol_Out=Vol_Err*0.12365-Vol_Err_1*0.12365+Vol_Err_2*0.12365+Vol_Out_1*1.02-Vol_Out_2*0.5(几个系数不是实际值)Vol_Err_2=Vol_Err_1;Vol_Err_1=Vol_Err;Vol_Out_2=Vol_Out_1;Vol_Out_1=Vol_Out;
加个防饱和
0
回复
2010-09-09 18:30
@holyfaith
加个防饱和

这几个变量全部使用单精度浮点数,应该不存在溢出问题!

很多资料、论文上都使用PI补偿,可我的就是不行!

以前也试过加一个正负脉宽平衡(将从启动开始的正负脉宽进行累加,每周期做一次平均,将平均值取负叠加在每个输出脉冲上),只是可以正常工作的时间稍微变长了!

Implementing 

三相逆变器DSP控制技术的研究 

0
回复
songxium
LV.7
6
2010-09-09 19:50
可以增加过零点补偿。
0
回复
holyfaith
LV.8
7
2010-09-12 19:43
@gnaijnaoul
这几个变量全部使用单精度浮点数,应该不存在溢出问题!很多资料、论文上都使用PI补偿,可我的就是不行!以前也试过加一个正负脉宽平衡(将从启动开始的正负脉宽进行累加,每周期做一次平均,将平均值取负叠加在每个输出脉冲上),只是可以正常工作的时间稍微变长了![图片]Implementing [图片]三相逆变器DSP控制技术的研究 

我的意思不是数字格式的溢出,我的意思是因为一直有个I的作用,在跟定是变化的时候,这个可能导致积分的结果很大,导致反映很慢,设定一个值,就是给PI的结果限定一个区间,不让其偏差过大

0
回复