Other Parts Discussed in Thread: C2000WARE
Tool/software: Code Composer Studio
I am controlling the dc to dc boost converter using f28335. PI controller is implemented using DCL library. I want a reference voltage of 20 volts. I am converting the ADC value into volts first and multiplied by sensor gain of 100. Now, this ADC value and Required value is given to the PI controller. But the output is not changing. It is always saturated to its maximum value.
Please find the code attached with this mail.
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File #include "DCL.h" #include "DCLF32.h" #include "DCL_fdlog.h" #include "DCLC28.h" float32_t rk = 20.0f; float32_t yk; float32_t lk; float32_t uk; float Duty; DCL_PI pi1 = PI_DEFAULTS; // // Function Prototypes // Uint16 LoopCount; Uint16 ConversionCount; void adc_isr(void); void gpio_select(void); void InitEPwm1(void); void control_Isr(void); float voltage1; float cmpa; // // Main // void main(void) { InitSysCtrl(); DINT; InitPieCtrl(); EALLOW; #if (CPU_FRQ_150MHZ) // Default - 150 MHz SYSCLKOUT // // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25.0 MHz // #define ADC_MODCLK 0x3 #endif #if (CPU_FRQ_100MHZ) // // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2) = 25.0 MHz // #define ADC_MODCLK 0x2 #endif EDIS; EALLOW; SysCtrlRegs.HISPCP.all = ADC_MODCLK; EDIS; IER = 0x0000; IFR = 0x0000; InitPieVectTable(); EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.ADCINT = &adc_isr; EDIS; // This is needed to disable write to EALLOW protected registers InitAdc(); // For this example, init the ADC gpio_select(); InitEPwm1(); PieCtrlRegs.PIEIER1.bit.INTx6 = 1; IER |= M_INT1; AdcRegs.ADCMAXCONV.all = 0x0001; // Setup 2 conv's on SEQ1 AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x3; // Setup ADCINA3 as 1st SEQ1 conv. AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2; // Setup ADCINA2 as 2nd SEQ1 conv. /* initialise controller variables */ pi1.Kp=2.0f; pi1.Ki=1.0f; pi1.Umax=0.8f; pi1.Umin=0.2f; rk = 20.0f; // initial value for control reference lk = 1.0f; // control loop not saturated // // Enable SOCA from ePWM to start SEQ1 // AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1; AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // Enable SEQ1 interrupt (every EOS) // control loop not saturated EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM for(;;); } // // cpu_timer0_isr - // void gpio_select(){ EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; // Enable pullup on GPIO0 GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; // Enable pullup on GPIO0 GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // GPIO0 = PWM1A GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // GPIO0 = PWM1A EDIS; } void InitEPwm1(){ EPwm1Regs.TBCTL.bit.CTRMODE = 0; // Count up down EPwm1Regs.TBPRD = 3750; // Set timer period EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0 EPwm1Regs.TBCTR = 0x0000; // Clear counter EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x001; // Clock ratio to SYSCLKOUT EPwm1Regs.TBCTL.bit.CLKDIV = 000; EPwm1Regs.TBCTL.bit.SYNCOSEL=1; EPwm1Regs.CMPA.half.CMPA =1875; // Set compare A value EPwm1Regs.CMPB = 1875; // Set Compare B value EPwm1Regs.CMPCTL.bit.LOADAMODE=1; EPwm1Regs.CMPCTL.bit.SHDWAMODE=0; /* EPwm1Regs.DBCTL.bit.OUT_MODE=3; EPwm1Regs.DBCTL.bit.POLSEL=2; EPwm1Regs.DBCTL.bit.IN_MODE=0; EPwm1Regs.DBRED=100; EPwm1Regs.DBFED=100;*/ EPwm1Regs.AQCTLA.bit.ZRO=2; // Set PWM1A on Zero EPwm1Regs.AQCTLA.bit.CAU=1; EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group EPwm1Regs.ETSEL.bit.SOCASEL = 1; // Select SOC from from CPMA on upcount EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event } __interrupt void adc_isr(void) { yk=(AdcRegs.ADCRESULT0 >>4)*300.0f/4095.0f; //Voltage2[ConversionCount] = AdcRegs.ADCRESULT1 >>4; //DCL_runClamp_C1(float *data, float Umax, float Umin); // lk=0.0f; uk = DCL_runPI_C1(&pi1, rk, yk); if (uk>0.8f){ uk=0.8f; } else if (uk<0.1f){ uk=0.1f; } //uk=0.5f; EPwm1Regs.CMPA.half.CMPA =(EPwm1Regs.TBPRD)*uk; // Set compare A value EPwm1Regs.CMPB = EPwm1Regs.TBPRD*uk; // Set Compare B value // If 40 conversions have been logged, start over // // // Reinitialize for next ADC sequence // AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1 AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE return; }