[讨论] 关于SVPWM控制中对于输出频率精度的探讨,欢迎高手!(附程序)

69056001   2007-8-2 04:02 楼主


各位高手,下面的程序在变频率时只有0.15hz的分辨率(载波为10Khz),即deltatheta(旋转角度增量)每加减1,输出频率就有0.15hz的变化,我想让系统输出频率变化有0.01HZ的分辨率,该怎么做?
这个程序是如在载波为3.2Khz时,输出频率分辨率就提高到了0.05hz,但是,是不是只有降载波才能提高分辨率呢? 而且,qsinlt函数已经是Q15格式了,期间我把sin表线性插值扩大到512和1024点还是没有改善.敬请各位赐教!!!!
void interrupt PWMINT()
{
  static unsigned int vr,fr,ud,uq,x,y,z,t0,t1,t2,i,cmp1,cmp2,cmp3,T3INTflag;
  static unsigned long int temp0,temp1,temp2,temp3,temp4,temp5,temp6,temp7;  
  //PBDATDIR|=0x0fe80;//测试中断时间  
  switch(PIVR)
  {
      case 0x0031:
      {
        T3INTflag=EVBIFRA&0x0200;
         if(T3INTflag!=0x0200)//如果不是定时器T3下溢中断,则直接返回
     {
             enable();
             return;
         }        
         T3CNT=0x0000;//定时器3的计数器重新赋0
         EVBIFRA&=0x0200;//T3UFINT   //0x0080; T3PINT clear the int2 flag
         fr=f_set;
         deltatheta=(int)( ((unsigned long)fr*655)>>15 );//Q15格式5243=step_max=400*65536/5000, 2621=step_max=200*65536/5000
         //655 Q15格式 100*65536/10000;2621 Q15格式 400*65536/10000;//校正系数 3355 Q15格式 512*65536/10000 这个可以在设计中加减调节输出频率//
         //deltatheta=655;
         theta=theta+deltatheta;
         if(theta>0x2aab)
       {
             theta=theta-0x2aab;//0x2aab=pi/3=0x7fff/3=60度
       if(sector<5)
           sector++;
           else sector=0;
      }
      if( pidonflag==1)// maunal control output
    {
           //  PIDV(v_set,v_feedback);   //PID for v setting, the result is u
           //  vr=u;
               vr=0x5fff;//开环
    }        
    temp3=qsinlt(0x2aab-theta);
     x=(unsigned)( ((unsigned long)vr*temp3)>>15 );// qsinlt()输入为int Q15格式
   y=(unsigned)( ((unsigned long)vr*qsinlt(theta) )>>15 );
     z=(unsigned)(0xffff-x-y);//0xffff=2^16
     t1=(unsigned)( ((unsigned long)x*TP3)>>16 );
     t2=(unsigned)( ((unsigned long)y*TP3)>>16 );
     t0=(unsigned)( ((unsigned long)z*TP3)>>17 );         
    switch(sector)
    {                          
            case 0://扇区0
                   cmp1=(int)t0,cmp2=(int)(t0+t1),cmp3=(int)(t0+t1+t2);break;
            case 1://扇区1
                   cmp1=(int)(t0+t2),cmp2=(int)t0,cmp3=(int)(t0+t1+t2);break;
            case 2://扇区2
                   cmp1=(int)(t0+t1+t2),cmp2=(int)t0,cmp3=(int)(t0+t1);break;
            case 3://扇区3
                   cmp1=(int)(t0+t1+t2),cmp2=(int)(t0+t2),cmp3=(int)t0;break;
            case 4://扇区4
                   cmp1=(int)(t0+t1),cmp2=(int)(t0+t1+t2),cmp3=(int)t0;break;
            case 5://扇区5
                   cmp1=(int)t0,cmp2=(int)(t0+t1+t2),cmp3=(int)(t0+t2);break;
            default:break;                 
         }            
        CMPR4=cmp1;//r
        CMPR5=cmp2;//s
        CMPR6=cmp3;//t        
        break;
     }
     default:break;
  }
  collect_data();
         ADCTRL2|=0x4000;  //复位编组器 1(SEQ1),使其重新指向第一个 AD 通道
     ADCTRL2|=0x2000;  //触发编组器 1(SEQ1)开始 AD 转换
       enable();
  //PBDATDIR&=0x0fef7f;//测试中断时间
  return;
} 本帖最后由 dontium 于 2015-1-23 11:41 编辑

回复评论 (4)

    问题有点复杂,看不大懂。
点赞  2007-8-7 03:14
可能是算法的问题,难道没有人思考过?
点赞  2007-8-7 05:16

旋转角度增量? 步长吗?

可以输出0-1000HZ
点赞  2007-8-7 07:43
能问下,你电压矢量合成的时候那个角度怎么算的 吗?
点赞  2014-7-7 16:46
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复