各位高手,下面的程序在变频率时只有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 编辑
旋转角度增量? 步长吗?
可以输出0-1000HZ
能问下,你电压矢量合成的时候那个角度怎么算的 吗?