TI中文支持网
TI专业的中文技术问题搜集分享网站

关于DSP中IQ变量的使用问题

用的28034芯片调试一个双闭环Buck电路,在不使用IQ变量的时候已经调通程序,但是把以下变量定义为iq变量后就无法实现功能,不知道问题出在哪里。

IQ定标定在19。

下面贴出改变的代码部分:

1. 变量定义部分,原来这些_iq变量全部定义为float变量能实现功能

typedef struct{
    _iq Error;
    _iq PreErr;
    _iq Kp;
    _iq Ki;
    _iq OutMax;
    _iq OutMin;
    _iq PIDOut;
    _iq PrePIDOut;
}INC_PID;

struct BUCKDEF
{
    _iq PWMDuty;
    _iq VBatref;
   _iq IBatref;

}

2. 注释掉的是原来能实现功能的程序

    MCtrl.Buck.VBat_PID.Kp = _IQ(1.5);
    MCtrl.Buck.VBat_PID.Ki = _IQ(0.3);
    MCtrl.Buck.IBat_PID.Kp = _IQ(0.6);
    MCtrl.Buck.IBat_PID.Ki = _IQ(0.05);

    MCtrl.Buck.VBat_PID.OutMax = _IQ(2.3);
    MCtrl.Buck.VBat_PID.OutMin = _IQ(0.8);
    MCtrl.Buck.IBat_PID.OutMax = _IQ(0.9);
    MCtrl.Buck.IBat_PID.OutMin = _IQ(0.1);
    MCtrl.Buck.VBatref = _IQ(0.044798);

//    MCtrl.Buck.VBat_PID.Kp = 1.5;
//    MCtrl.Buck.VBat_PID.Ki = 0.3;
//    MCtrl.Buck.IBat_PID.Kp = 0.6;
//    MCtrl.Buck.IBat_PID.Ki = 0.05;
//
//    MCtrl.Buck.VBat_PID.OutMax = 2.3;
//    MCtrl.Buck.VBat_PID.OutMin = 0.8;
//    MCtrl.Buck.IBat_PID.OutMax = 0.9;
//    MCtrl.Buck.IBat_PID.OutMin = 0.1;
//
//    MCtrl.Buck.VBatref = 0.044798;

      MCtrl.Buck.VBat_PID.Error = MCtrl.Buck.VBatref – _IQ( PAdc.VBat_gqv*3.0/4096 );
//    MCtrl.Buck.VBat_PID.Error = MCtrl.Buck.VBatref – PAdc.VBat_gqv*3.0/4096;

      MCtrl.Buck.IBat_PID.Error = MCtrl.Buck.IBatref – _IQ( PAdc.IBat_gqv*3.0/4096 );
//    MCtrl.Buck.IBat_PID.Error = MCtrl.Buck.IBatref – PAdc.IBat_gqv*3.0/4096;

      EPwm1Regs.CMPA.half.CMPA = (Uint16)_IQmpy(MCtrl.Buck.PWMDuty,(int32)MPwm.PRD_REG);
//    EPwm1Regs.CMPA.half.CMPA = (Uint16)(MCtrl.Buck.PWMDuty*(int32)MPwm.PRD_REG);

Susan Yang:

请问您现在GLOBAL_Q已经定义为19?上述程序编译是可以通过的?您是否有使用CCS的在线调试以及watch窗口来查看变量是否正确?

另外需要注意的是float和IQ数据是不可以直接计算的,也就是说数据的格式需要统一

可以用IQtoF(iq)来将IQ值转换为float 值,或者直接 _IQ(float),把float 转换成IQ

用的28034芯片调试一个双闭环Buck电路,在不使用IQ变量的时候已经调通程序,但是把以下变量定义为iq变量后就无法实现功能,不知道问题出在哪里。

IQ定标定在19。

下面贴出改变的代码部分:

1. 变量定义部分,原来这些_iq变量全部定义为float变量能实现功能

typedef struct{
    _iq Error;
    _iq PreErr;
    _iq Kp;
    _iq Ki;
    _iq OutMax;
    _iq OutMin;
    _iq PIDOut;
    _iq PrePIDOut;
}INC_PID;

struct BUCKDEF
{
    _iq PWMDuty;
    _iq VBatref;
   _iq IBatref;

}

2. 注释掉的是原来能实现功能的程序

    MCtrl.Buck.VBat_PID.Kp = _IQ(1.5);
    MCtrl.Buck.VBat_PID.Ki = _IQ(0.3);
    MCtrl.Buck.IBat_PID.Kp = _IQ(0.6);
    MCtrl.Buck.IBat_PID.Ki = _IQ(0.05);

    MCtrl.Buck.VBat_PID.OutMax = _IQ(2.3);
    MCtrl.Buck.VBat_PID.OutMin = _IQ(0.8);
    MCtrl.Buck.IBat_PID.OutMax = _IQ(0.9);
    MCtrl.Buck.IBat_PID.OutMin = _IQ(0.1);
    MCtrl.Buck.VBatref = _IQ(0.044798);

//    MCtrl.Buck.VBat_PID.Kp = 1.5;
//    MCtrl.Buck.VBat_PID.Ki = 0.3;
//    MCtrl.Buck.IBat_PID.Kp = 0.6;
//    MCtrl.Buck.IBat_PID.Ki = 0.05;
//
//    MCtrl.Buck.VBat_PID.OutMax = 2.3;
//    MCtrl.Buck.VBat_PID.OutMin = 0.8;
//    MCtrl.Buck.IBat_PID.OutMax = 0.9;
//    MCtrl.Buck.IBat_PID.OutMin = 0.1;
//
//    MCtrl.Buck.VBatref = 0.044798;

      MCtrl.Buck.VBat_PID.Error = MCtrl.Buck.VBatref – _IQ( PAdc.VBat_gqv*3.0/4096 );
//    MCtrl.Buck.VBat_PID.Error = MCtrl.Buck.VBatref – PAdc.VBat_gqv*3.0/4096;

      MCtrl.Buck.IBat_PID.Error = MCtrl.Buck.IBatref – _IQ( PAdc.IBat_gqv*3.0/4096 );
//    MCtrl.Buck.IBat_PID.Error = MCtrl.Buck.IBatref – PAdc.IBat_gqv*3.0/4096;

      EPwm1Regs.CMPA.half.CMPA = (Uint16)_IQmpy(MCtrl.Buck.PWMDuty,(int32)MPwm.PRD_REG);
//    EPwm1Regs.CMPA.half.CMPA = (Uint16)(MCtrl.Buck.PWMDuty*(int32)MPwm.PRD_REG);

Serenity_pjb:

回复 Susan Yang:

是的,GLOBAL_Q已定义为19,程序编译是可通过得。有使用在线调试,大部分变量我都看了是没问题,也有可能我理解错了,其实有问题但我当它没问题了。还有一个问题是GLOBAL_Q定义为19的话能表示得最大的数2^11但 _IQ19(0.5) = 2^19 * 0.5 这个数比2^11要大很多啊,请问这个怎么理解。
我没看的变量就是PI控制环计算过程中的一些量,但我今天尝试了一下把GLOBAL_Q继续改小,也无法实现双闭环功能,主要表现为示波器看的PWM波形不断跳动,这个现象可能是PI参数的问题,但这一套PI参数是我在float型变量下已经调通的呀。
至于数据格式统一的问题,我上面的代码已经贴出了,都用了_IQ()。

赞(0)
未经允许不得转载:TI中文支持网 » 关于DSP中IQ变量的使用问题
分享到: 更多 (0)