用的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()。