主题中讨论的其他部件: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