主题中讨论的其他部件:C2000WARE
工具/软件:Code Composer Studio
您好,
我正在尝试按照 SPRUI31中的指导在F2.8335万上实施您的数字控制器库。 但是,无论我的设置或KP,KI,上限/下限饱和度的值如何,PI结构中的值似乎都不同。 我相信我对如何使用和理解图书馆有一个误解,因此感谢您的帮助。 我使用两个桥之间的相位移控制,其中两个PWM通道之间的相位移应该在相位移寄存器内介于800和1460之间。 因此,我将饱和限值设置为800和1460。 我从KP=10开始,禁用集成商以使用纯P调节器(稍后将调整KI参数以正确控制DCDC转换器)。 这些值在PI_VALUES中定义,如下面给出的C代码所示。
ADC中断服务例程正常工作,ADC读数也正常工作。 调试代码时,我可以看到也调用了PI函数,并执行了DCL_PI.ASM代码。 通过检查PI调节器的值,我可以看到该值与我的设置不同。 此外,我可以看到PI调节器的输出被夹紧到Umin,这是绑定到b e 2039的较低饱和度,而不是我的设置中的800。 您对发生的事情和我做错的事情有什么想法吗? 感谢您的指导。
#include "DSP28x_Project.h"
#include "DCL.h"
void InitialADC();
void InitePWM1();
void InitePWM2();
void InitePWM5();
void InitePWM6();
__interrupt void ADC_ISR();
__interrupt void TZ_ISR();
//闪存功能
extern UINT16 RamfuncsLoadStart;
extern UINT16 RamfuncsLoadEnd;
extern UINT16 RamfuncsRunStart;
//变量
#define DT 25 // Dead time calc:DT = value/CLKfr -> as25/1000.016f/
控制器变量00.0160.0f,
1460.0f }// kp,ki,I10,Sat_max,Sat_min, sat_storage
volatile float32 rk; //参考值
volatile float32 yk; //测量的ADC信号
挥发浮点32 uk; // pi输出
挥发PI pi1;
volatile UINT16 ConversionCount;
volat32 Voltage1[256];
volatile float32 current[256];
void main(
看门狗){//初始化PLL,
Ctrl/启用外设时钟,启用外设
时钟,以使用void编程/
Memcopy (&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart);
// VecePWM和TZ
InitEPwmGpio();
InitTzGpio();
//初始化PIE控制寄存器
InitPievector();
IER = 0x0000;
IFR = 0x0000;
//
初始化Isr_Pie =表;Isr_EPTEDMI; In_EPTEPTEPTI=初始化Isr_EPTEPTEPTEPTI=
//设置ADC采样速率
EALLOW的第一步;
SysCtrlRegs.HISPPP.ALL =3;// HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)= 25.0 MHZ
EDIS;
//同步已在InitSysCtrl()函数中完成-->要求TI支持来验证
SysReg1.PCW; SYLNC*
= SYLLOKW.CLW; //从DSP
EDIS中使用SYSCLKOUT启用时基时钟同步;
*/
InitFlash();
ConversionCount = 0; //初始化计数
UK = 0;
rk = 2050; //大约 5A负载电压
PI pi1 = pi_values; //初始化PI控制器
//初始化ADC
InitAdc();
phaseshift1 = 5; //补偿a ca。 ePWM1和ePWM6
InitialADC()之间的15ns延迟; //为电压和电流测量
EALLOW设置ADC;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
InitePWM1();
InitePWM2();
InitePWM5();
InitePWM6();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
/*
将GPIO4设置为输出以测量ISR */
EALLOW内的执行时间;
//将GPIO10设置为GPIO -已在InitGpio()
GpioERlRegs.GPAMUX1.bit.GPIO4 = 0中完成;
//将GPIO10设置为输出GpioCtrlRegs.GPADIR.bit.EDI1
= 1;1. //用于ADC
PieCtrlRegs.PIEIER2.bit.INTx1 = 1的组1,位6; //用于ePWM1_TZ
IER || M_INT1的组2,位1; //设置组1
IER || M_INT2的中断启用位; //设置组3
EINT的中断启用位; //启用全局中断INTM
for(;)
{
}
}__interrupt void ADC_ISR(void)
{
GpioDataRegs.GPASET.bit.GPIO4 =1;
Voltage1[ConversionCount]= AdcRegs.ADCRESULT0>4; //从ADCINA5
电流读取值[CM1= REGP.CMPA]
=
从ADCM1CM1CMP0.1CMP5.CMPASPf.CMPf.CMPPA/ REPA.1DAV= AD1CMP5.CMP5.CMP1DAV= AD1CMP5.CMP1DAV= AD1CMP5.CMP5.CMPf= ADCMP1.CMPfV = ADCMP1CMP1CMP1DAV0.1CMPfV = 0
EPwm6Regs.CMPA.Half.CMPA = 0;
EPwm5Regs.CMPA.Half.CMPA = 1500;
}/*
*使用PI CONTROL */
YK = Current[ConversionCount];
UK = DCL_runPI (&pi1,rk,
m6)计算两个网桥之间的相位移;EPwm5Regs.pyk = PT.Peshfs/TBwhs
= pesphesfm1;EPwhs = PT/TBwhs = peshpasphasphes/ pesfhs = pesfhs。 ePWM6的16ns延迟
//如果记录了256个转换,请重新开始
IF (ConversionCount == 255)
{
ConversionCount = 0;
}
否则
{
ConversionCount++;}
//重新初始化下一个ADC
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; //重置SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //清除
OST标志位PieCtrlRegs.PIEACK.ALL = PIEACK_GROUP1;//中断确认PIEPAX.1= PIEPOL.1; CLR = PIEPIEP.1= 1 =纯净EPOST.1; C1.TIP1.PERAST.POST.EP.1=纯1 =纯1 = 1 =纯净=纯净=纯净=纯净=纯净=纯净=纯净=纯净=纯净=纯净=纯净=纯净=纯净=纯净=纯净=纯净=纯净=纯净=纯净=纯净=纯净=纯净=纯净=纯净=纯净=纯
EPwm6Regs.TZCLL.bit.OST = 1;
EPwm1Regs.TZCLR.Bit.INT = 1;
EDIS;
PiectrlRegs.PIEACG.ALL = PIEACK_group2; //确认中断到PIE
}
void InitialADC(void)
{//
配置ADC
AdcRegs.ADCTRL3.bit.ADCCLL3=1; //设置ADC采样率= void.RCSCR1.CADR1.CAST_ADC= 1.CADR.R0.1=
0;CADR1.CADR1.CADR1.CAST_ADC= 0
;CADR1.POST.R0.1= 1.CADR1.CADR1.CADR1.CADR.POST.POST.POST.POST= 0 = 0;ADC= ADC= ADC= ADC1.CADR1.CADR1.CADR1.CADR1.CADR1.CADR1.CADR.CADR.CADR.CADR.CADR.CADR.CADR.CAST.R0.1= 0 //同时采样模式
AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 1;// ePWM启动SOCA触发
器AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0;// 一个转换
器AdcRegs.ADCCHSEL1.bit.CONVI = 5;// ADCINCA.CA.INV1
启用ADCINV1
的ADCINV1和ADCINCA.CA_ADCINV5.INCA.CA.CA.CA.CA.CAV1的中断
EPwm1Regs.ETSEL.bit.SOCAEN = 1; //启用SOCA
EPwm1Regs.ETSEL.bit.SOCASEL = 4; //在50 % 占空比下生成SOCA脉冲
EPwm1Regs.ETPS.bit.SOCAPRD = 1; //生成第一个事件的脉冲
EPwm1Regs.TBPRD = 1499; //将PWM周期时间
EPwm1Regs.CMPA.Half.CMPA =(1499+1)/2;EPw1Regs.TBPHPHPHPHPHPHPHPHPHPHPHPHPHPS.TBMPs.TR_REGs.PT.MP_DE.PTB.PTB.MP_1BE.PTB.PTB.=
0;SCMP_DE_REGP.PTB.PTB.MP_DE_DE_DE.PTB.PTB.PTB.MP.PTB.PTB.MP_DE_DE_DE.PTB.PTB.PTB.PE.PE.PE.PTB.PTB.= 0 = 0 //同步下流模块
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; //将时基时钟设置为SYSCLKOUT
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_shadow;EPwm1Regs.CMCL=1PRD=DAMP0
或PRD=1DAMP0 PRD=DAMP0 PRD=1DAMP0
;PRD = PRD_REG=1DAMP0
或DAMP0 PRD = PRD = PRD = PRD = 0;0 = 0 = PRD = PRD = 0;0 = 0 = 0 = 0;0 = 0 = 0 = 0;0 = 0 = 0 = 0 = 0 = 0;0 = 0 = 0 = 0;0 = 0 = 0 = 0;0 = 0;0 = 0 = 0 = 0 = 0;0 = 0; //在cTR=PRD
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR时设置pin; //在cTR=compa
EALLOW时清除pin;
EPwm1Regs.TZsel.OSHT3 = 1; //启用TZ3
EPwm1Regs.TZL.Bit.TZA = 2;
在EPT1.EPT1.01中启用T01 = EPT1.01;在EPT1.01时启用EPT1.01
// ePWMxA下降和上升边缘
EPwm1Regs.DBCTL.bit.ut_mode = DB_FULL启用; // DB full enable
EPwm1Regs.DBCTL.bit.POPPA SEL = DB_ACTV_HIC; // Active high mTBEPwm1Regs.DBRED
= DT = DT;DBw1EP.0;
DBM12.P1= DE.P1PRD = DE.1= DB_12.1PRD = DB_12.1PRD = DE.EP.1= DB_12.1PRD = DE.1PED.1PED.1PED.P1.P1.P1.P12.1= DB1PRD = DE.1PRD = DE.1PRD = DE.1PED.1PED.1PED.1PED.1PED.1PED.1PED.2= DB/PRD
= DE.
//将相位寄存器设置为零
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // UP计数模式
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;//主模块
EPwm2Regs.HPTL.PRDLD = TB_SHADPCTB_SHADMPT.CMPCDAMPT.MPCMPC=
2DAMPT.DCME= DCMOS.DCMOS.DCMOS.D0
= 0;DCMSTREGMP0 = 0 = DCMOS.DCMOS.DCMSTDAMP0 = 0 = 0 = DCMSTMP0 = DCMSTMP0 = 0 = DCMSTREGMP0
= 0 = D0 = DCM0 = 0 // ctr=0或ctr=pD
EPwm2Regs.CMPCTL.bit.LOADBMODE = 0; // ctr=0或ctr=PRD
EPwm2Regs.HTCTLA.bit.ZRO = SEL_CLEAR; //在ctr=PRD=W2Regs.OSCLA.bit.PRD时清除引脚;在TR=AQEPw2LA.ZAQ= PIN_DE.ZWA.Z1.PIN=
PIN.PIN.T时清除引脚
//在TZ事件
上清除ePWM2A EPwm2Regs.TZCTL.bit.TZB = 2; //在TZ事件
EDIS上清除ePWM2B;
EPwm2Regs.DBCTL.bit.in_mode = 0; // ePWMxA下降和上升边缘DBwm2Regs.DBC.DB_REGDE.EPT.DE=2.EPmDE_DEF2bit
=全模式DB_DEP.DE_DEPwDB_DE0; DB_DE_DEPw2DB_DE_DE_DEPwb.DB_DE.DB_DE_DE_DE_DEP.DBwb.DB_DE.DB_DE.DB_DE.DBw2b.DB_DE.DB_DE.DB_DE.DB_DE.DB_DE.DB_DE
void InitePWM5 (void)
{
EPwm5Regs.TBPRD = 1499; //将PWM周期时间
EPwm5Regs.CMPA.Half.CMPA =(1499+1)/2;
EPwm5Regs.HSSPHS.Half.TBPHPHPHPHPHPHPHPHPHPHPHPHPHPHHS =零
EPwm5Regs.PCMPs.PTC.MP_EPmSC_EPmSCN.PTT.PTB_DE=零
位= EPMPT.PTB.PTB.PTB.PTB.PTT.PE_EPMP_EPMPT.PTB.PTB.PTB.PTT.PE_DE= EPMPT.PE.PTB.PTB.PTT.PE.PTB.PTB.PTT.PE.PTB.PTB.PTB.PTB_DE=零位= EPMPT.PE.PTT.PE.PTB.PTB.PTT.PE.PTB.PTB.PTT.PE.PTB.PTT.PE.PTB.PTB.PTB.PTB.PTB.PTB.PTB.PTB.PTB.PTB.PTB= //将时基时钟设置为SYSCLKOUT
EPwm5Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;
EPwm5Regs.CMPCTL.bit.SHDWBMODE = CC_SHAD影子;EPwm5Regs.CMTR.CMCL=PRD=0
; PA= Pin PRD.C=0
时,PRD=0 = Pin = CQ= PX.CQAR= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= PQPAQ= P= P= P= PQ= PQ= P= P= P= P= P= P= P= P= P= P= P= P= P= PQ= P= P= P= P= P= P= P= P= P= P= P= PQ=
EPwm5Regs.TZsel.bit.OSHT3 = 1; //启用TZ3
EPwm5Regs.TZCTL.bit.TZA = 2; //在TZ事件上清除ePWM5A
EPwm5Regs.TZCTL.Bit.TZB = 2; //清除ePWM5B在TZ事件中清除;
DB_REGDEPT.EPT.DB_DEPT.DB_DEPT.EPT.=
全模式下的DB_DEPT.DB_DEPT.EPT.DB_DEPT.EPT.DB_DEPT.EPT.DB_DEP=
//有源高互补
EPwm5Regs.DBRED = DT;
EPwm5Regs.DBFED = DT;
}
void InitePWM6 (void)
{
EPwm6Regs.TBPRD = 1499;// 设置PWM周期时间
EPwm6Regs.CMPA.Half.CMPA =(1499+1)/2;EPwCTPS.PTB=
零位/PTBPHPS.PTB_REG=零位EPS.PTPS.PTB_REG.PTPS.PTPS.PTB= 0
=零位EPmPE.PTPS.PE.PTB_0 =零位EP_0
//从属模块
EPwm6Regs.TBCTL.bit.PRDLD = Tb_shadow;
EPwm6Regs.TBCTL.bit.SYNCOSEL = Tb_ctr_zero;//同步下流模块
EPwm6Regs.TBCTL.bit.HSDBDE PCLDPPCLKDIV = 0; //将时基时基时钟设置为STDAMP0 = DMP0
;SOMP0 = DMP0 = DMODAMP0 = D0 = DMODAMP0 = PMODAMP0 = PMODAMP0 = PMODAMP0 = P0 = 0 = 0 = 0 = PMODAMP0 = 0 = 0 = 0 = 0 = 0 = PMODAMP0 //在cTR=0或cTR=PRD
EPwm6Regs.AQCTLA.bit.ZRO = AQ_SET时设置 引脚;//在cTR=PRD
EPwm6Regs.AQCTLA.bit.CAU = ZB_CLEAR时 清除引脚;在ctr=compa
EALLOW时清除引脚;PWwm6Regs.OSTZs.AQTZ/T6B= TTEZEPT1.ZEZEZEZ= T6B/
在TTEX1.ZEZEZEZEPT1.TES/T6B= TTEXEZEZEZES/ T6B= T6B/ TTEXEZEZEZEZEZEZEZEZES/ T6B= T6B/ T6B/
EPwm6Regs.DBCTL.bit.in_mode = 0; // ePWMxA下降和上升边缘
EPwm6Regs.DBCTL.bit.out模式= DB_FULL启用; // DB完全启用
EPwm6Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // DBEPm6DT = DBwRED.REP.DT = D5.REwDEV = DBw6DT补充D= DBwDED
= DBwDEV




