This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28069: Sine wave to ADCinB1 but AdcResutRegs.ADCRESULT9 graph is not sine wave ?

Part Number: TMS320F28069

In my board i'm giving 50 hz 3 volt sine wave to ADCINB1 but when i plot the graph of ADCRESULT9 is in the graph. What is the problem ??? My ISR frequency 50 Khz. 

/*
 *  ======== main.c ========
 */

#include <xdc/std.h>

#include <xdc/runtime/Error.h>
#include <xdc/runtime/System.h>

#include <ti/sysbios/BIOS.h>

#include <ti/sysbios/knl/Task.h>

#include "DSP28x_Project.h"
#include "Solar_F.h"
#include "IQmathLib.h"


#pragma DATA_SECTION(sine_table,"IQmathTables");
_iq30 sine_table[512];

SPLL_1ph_F spll1;
SPLL_1ph_F_NOTCH_COEFF spll_notch_coef1;


#define GRID_FREQ 50.0
#define ISR_FREQUENCY 50000.0
#define PI 3.14




void initADC();
void adcTimerFxn(void);
Void adcHwiISR(void);
float32 temp=0;

/*
 *  ======== main ========
 */
Int main()
{ 

    //-----------------------------------------------------

   InitSysCtrl();

    initADC();

    IER = 0x0000;
    IFR = 0x0000;


        EALLOW;
        GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;
        GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;
        EDIS;

        EPwm1Regs.TBPRD = 2250; // Period = 2´600 TBCLK counts // 45 Mhz frekanslı 600 defa sayıyor
        EPwm1Regs.CMPA.half.CMPA =1125;
       // EPwm1Regs.CMPB = 7200; // Compare B = 500 TBCLK counts
        EPwm1Regs.TBPHS.half.TBPHS = 0x0000;  // Set Phase register to zero
        EPwm1Regs.TBCTR = 0; // clear TB counter
        EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Symmetric
        EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Phase loading disabled
        EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
        EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
        EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // TBCLK = SYSCLKOUT
        EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
        EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
        EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
        EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR = Zero
        EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR = Zero
      //  EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
        EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
        EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
      //  EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
      //  EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;
      //  EPwm1Regs.AQCTLB.bit.CBD = AQ_SET;

        //EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
        //EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;
       // EPwm1Regs.AQCTLB.bit.CBU = AQ_SET;
      //  EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR;


        /*
        EPwm1Regs.TBCTL.all = 0;
        EPwm1Regs.TBCTL.bit.CLKDIV = 0;
        EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
        EPwm1Regs.TBCTL.bit.CTRMODE = 2;
        EPwm1Regs.AQCTLA.all = 0x0006;
        EPwm1Regs.TBPRD = 7200;
        EPwm1Regs.CMPA.half.CMPA = 3600;
        EPwm1Regs.AQCTLA.all = 0x0060;
        EPwm1Regs.ETSEL.all = 0;
        EPwm1Regs.ETSEL.bit.INTEN = 1;
        EPwm1Regs.ETSEL.bit.INTSEL = 5;
        EPwm1Regs.ETPS.bit.INTPRD = 1;

*/


        SPLL_1ph_F_init(GRID_FREQ,((float)(1.0/ISR_FREQUENCY)), &spll1);
        SPLL_1ph_F_notch_coeff_update(((float)(1.0/ISR_FREQUENCY)), (float)(2*PI*GRID_FREQ*2),(float)0.00001,(float)0.1, &spll1);

    //-----------------------------------------------------


    BIOS_start();    /* does not return */
    return(0);
}


void adcTimerFxn(void)
    {

    AdcRegs.ADCSOCFRC1.bit.SOC9=1;
    while(AdcRegs.ADCINTFLG.bit.ADCINT1 == 0) {}
    AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

       spll1.AC_input = ((float32)AdcResult.ADCRESULT9-1862)/(float32)1862; // SPLL call
       SPLL_1ph_F_MACRO(spll1);
       temp = (((spll1.sin[1])+1.0)/2)*EPwm1Regs.TBPRD;
       EPwm1Regs.CMPA.half.CMPA =EPwm1Regs.TBPRD - _IQsat(temp,EPwm1Regs.TBPRD,0);

    }


void initADC()
{

    EALLOW;


    SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
     (*Device_cal)();

    AdcRegs.ADCCTL1.bit.ADCBGPWD  = 1;      // Power ADC BG
    AdcRegs.ADCCTL1.bit.ADCREFPWD = 1;      // Power reference
    AdcRegs.ADCCTL1.bit.ADCPWDN   = 1;      // Power ADC
    AdcRegs.ADCCTL1.bit.ADCENABLE = 1;      // Enable ADC
    AdcRegs.ADCCTL1.bit.ADCREFSEL = 0;      // Select interal BG
    AdcRegs.ADCCTL2.bit.CLKDIV2EN = 1;
    AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1;  // Enable non-overlap mode
    AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;    // ADCINT1 trips after AdcResults latch
    AdcRegs.INTSEL1N2.bit.INT1E     = 1;    // Enabled ADCINT1
    AdcRegs.INTSEL1N2.bit.INT1CONT  = 0;    // Disable ADCINT1 Continuous mode
    AdcRegs.INTSEL1N2.bit.INT1SEL   = 9;    // setup EOC1 to trigger ADCINT1 to fire
    AdcRegs.SOCPRICTL.bit.ONESHOT = 1 ;


    AdcRegs.ADCSOC0CTL.bit.CHSEL    = 0x0;    // set SOC0 channel select to ADCINA0
    AdcRegs.ADCSOC1CTL.bit.CHSEL    = 0x1;
    AdcRegs.ADCSOC2CTL.bit.CHSEL    = 0x2;
    AdcRegs.ADCSOC3CTL.bit.CHSEL    = 0x3;
    AdcRegs.ADCSOC4CTL.bit.CHSEL    = 0x4;
    AdcRegs.ADCSOC5CTL.bit.CHSEL    = 0x5;
    AdcRegs.ADCSOC6CTL.bit.CHSEL    = 0x6;
    AdcRegs.ADCSOC7CTL.bit.CHSEL    = 0x7;
    AdcRegs.ADCSOC8CTL.bit.CHSEL    = 0x8;
    AdcRegs.ADCSOC9CTL.bit.CHSEL    = 0x9;
    AdcRegs.ADCSOC10CTL.bit.CHSEL    = 0xA;
    AdcRegs.ADCSOC11CTL.bit.CHSEL    = 0xB;
    AdcRegs.ADCSOC12CTL.bit.CHSEL    = 0xC;
    AdcRegs.ADCSOC13CTL.bit.CHSEL    = 0xD;
    AdcRegs.ADCSOC14CTL.bit.CHSEL    = 0xE;
    AdcRegs.ADCSOC15CTL.bit.CHSEL    = 0xF;

    AdcRegs.ADCSOC0CTL.bit.TRIGSEL  = 0;    // set SOC0 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC
    AdcRegs.ADCSOC1CTL.bit.TRIGSEL  = 0;    // set SOC1 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1
    AdcRegs.ADCSOC2CTL.bit.TRIGSEL  = 0;    // set SOC0 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC
    AdcRegs.ADCSOC3CTL.bit.TRIGSEL  = 0;    // set SOC1 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1
    AdcRegs.ADCSOC4CTL.bit.TRIGSEL  = 0;    // set SOC0 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC
    AdcRegs.ADCSOC5CTL.bit.TRIGSEL  = 0;    // set SOC1 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1
    AdcRegs.ADCSOC6CTL.bit.TRIGSEL  = 0;    // set SOC0 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC
    AdcRegs.ADCSOC7CTL.bit.TRIGSEL  = 0;    // set SOC1 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1
    AdcRegs.ADCSOC8CTL.bit.TRIGSEL  = 0;    // set SOC0 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC
    AdcRegs.ADCSOC9CTL.bit.TRIGSEL  = 0;    // set SOC1 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1
    AdcRegs.ADCSOC10CTL.bit.TRIGSEL  = 0;    // set SOC0 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC
    AdcRegs.ADCSOC11CTL.bit.TRIGSEL  = 0;    // set SOC1 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1
    AdcRegs.ADCSOC12CTL.bit.TRIGSEL  = 0;    // set SOC0 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC
    AdcRegs.ADCSOC13CTL.bit.TRIGSEL  = 0;    // set SOC1 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1
    AdcRegs.ADCSOC14CTL.bit.TRIGSEL  = 0;    // set SOC0 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC
    AdcRegs.ADCSOC15CTL.bit.TRIGSEL  = 0;    // set SOC1 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1

    AdcRegs.ADCSOC0CTL.bit.ACQPS    = 6;    // set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
    AdcRegs.ADCSOC1CTL.bit.ACQPS    = 6;    // set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
    AdcRegs.ADCSOC2CTL.bit.ACQPS    = 6;    // set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
    AdcRegs.ADCSOC3CTL.bit.ACQPS    = 6;    // set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
    AdcRegs.ADCSOC4CTL.bit.ACQPS    = 6;    // set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
    AdcRegs.ADCSOC5CTL.bit.ACQPS    = 6;    // set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
    AdcRegs.ADCSOC6CTL.bit.ACQPS    = 6;    // set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
    AdcRegs.ADCSOC7CTL.bit.ACQPS    = 6;    // set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
    AdcRegs.ADCSOC8CTL.bit.ACQPS    = 6;    // set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
    AdcRegs.ADCSOC9CTL.bit.ACQPS    = 6;    // set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
    AdcRegs.ADCSOC10CTL.bit.ACQPS    = 6;    // set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
    AdcRegs.ADCSOC11CTL.bit.ACQPS    = 6;    // set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
    AdcRegs.ADCSOC12CTL.bit.ACQPS    = 6;    // set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
    AdcRegs.ADCSOC13CTL.bit.ACQPS    = 6;    // set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
    AdcRegs.ADCSOC14CTL.bit.ACQPS    = 6;    // set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
    AdcRegs.ADCSOC15CTL.bit.ACQPS    = 6;    // set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)

    IER |= M_INT1; // Enable CPU Interrupt 1


    EDIS;

}

/*
Void adcHwiISR()
{

    spll1.AC_input = ((float32)AdcResult.ADCRESULT9-1900)/(float32)1900; // SPLL call
    SPLL_1ph_F_FUNC(&spll1);
    temp = (((spll1.sin[1])+1.0)/2)*EPwm1Regs.TBPRD;
    EPwm1Regs.CMPA.half.CMPA =EPwm1Regs.TBPRD - _IQsat(temp,EPwm1Regs.TBPRD,0);

//    AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;


    // Clear INT SEQ1 bit

  /*  static unsigned int index = 0;
       EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD -_IQsat(((((float32)sine_table[index]/1073741824.0+0.9999)/2)*EPwm1Regs.TBPRD),EPwm1Regs.TBPRD,0);
       if (index++ >511) index = 0;
    AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;       // Clear INT SEQ1 bit

*/

 /*
  -------------------------------------------------------------------------

                   ÇALIŞAN KOD


     static unsigned int index = 0;

       spll1.AC_input = ((float32)(sine_table[index]/1073741824.0)); // SPLL call
       SPLL_1ph_F_FUNC(&spll1);
       temp = (((spll1.sin[1])+1.0)/2)*EPwm1Regs.TBPRD;
       EPwm1Regs.CMPA.half.CMPA =EPwm1Regs.TBPRD - _IQsat(temp,EPwm1Regs.TBPRD,0);

       if (index++ >511) index = 0;

        AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;       // Clear INT SEQ1 bit


        ----------------------------------------------------------------------------
*/


/*
      spll1.AC_input = ((float32)AdcResult.ADCRESULT9-1870)/(float32)1870; // SPLL call
      SPLL_1ph_F_FUNC(&spll1);
      temp = (((spll1.sin[1])+1.0)/2)*EPwm1Regs.TBPRD;
      EPwm1Regs.CMPA.half.CMPA =EPwm1Regs.TBPRD - _IQsat(temp,EPwm1Regs.TBPRD,0);



       AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;       // Clear INT SEQ1 bit
*/


/*
        spll1.AC_input = ((float32)AdcResult.ADCRESULT9-1870)/(float32)1870; // SPLL call
        SPLL_1ph_F_FUNC(&spll1);
        temp = ((spll1.sin[1]+0.9999)/2)*EPwm1Regs.TBPRD;
        EPwm1Regs.CMPA.half.CMPA =EPwm1Regs.TBPRD - _IQsat(temp,EPwm1Regs.TBPRD,0);

        AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;       // Clear INT SEQ1 bit


*/

/*
}
*/

  • Hi,

    So you cannot plot the result value directly. You'll have to accumulate result values of one line cycle into a buffer and then plot that buffer.

    Regards,
    Gautam