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.

CCS/TMS320F28335: 28335 ADC "Sequencer Start/Stop operation" not work

Part Number: TMS320F28335


Tool/software: Code Composer Studio

Hi all.

I have some problem about F28335's ADC work in Start/Stop mode.

I need ADC module work like below:

1.Dual-sequencer mode;

2. Sequential sampling mode;

3. SEQ1 trigger is SOCA, SEQ2 trigger is SOCB form ePWM1;

4. ePWM1 counter mode is Up-down-count mode;

5. ePWM1SOCA generated when TBCTR = 0, and ePWM1SOCB generated when TBCTR = TBPRD;

SOCA trigger the AD convert I1, I2, I3, and SOCB trigger the AD convert V1,V2,V3, it as the document "TMS320x2833x Analog-to-Digital Converter (ADC) Module" page 21 and page 22 describe;

as show in figure below:

my program result is "I1, I2, I3 " can convert well, but the "V1,V2,V3" always zero;

my code as below:

has anybody can help me and let me know how can I tackle it.

==========================================================

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File

#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

// Prototype statements for functions found within this file.

interrupt void  adc_isr(void);

Uint16 VoltageA[3];

Uint16 VoltageB[3];

Uint16 upDownFlag = 0;

Uint16 PWMDuty = 0;

void main(void)

{

InitSysCtrl();

DINT;

InitPieCtrl();

IER = 0x0000;

IFR = 0x0000;

InitPieVectTable();

EALLOW;

PieVectTable.ADCINT = &adc_isr; //ADC interrupt

PieVectTable.EPWM1_INT = &EPWM1_INT_ISR; //ePWM1 zero interrupt

EDIS;

AdcRegs.ADCTRL1.all = 0;

    AdcRegs.ADCTRL2.all = 0;

    AdcRegs.ADCTRL3.all = 0;

    //config ADC

    AdcRegs.ADCTRL1.bit.ACQ_PS = 2;

    AdcRegs.ADCTRL3.bit.ADCCLKPS = 2;

    AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;

    AdcRegs.ADCTRL2.bit.RST_SEQ2 = 1;

    AdcRegs.ADCTRL1.bit.SEQ_CASC = 0;

    AdcRegs.ADCTRL1.bit.CONT_RUN = 0;

    AdcRegs.ADCTRL3.bit.SMODE_SEL = 0;

    AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0;

    AdcRegs.ADCMAXCONV.all = 0x22;

    //config SEQ1

    AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;

    AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;

    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;

    AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x00;

    AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x01;

    AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x02;

    //config SEQ2

    AdcRegs.ADCTRL2.bit.SOC_SEQ2 = 1;

    AdcRegs.ADCTRL2.bit.EPWM_SOCB_SEQ2 = 1;

    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2 = 1;

    AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x08;

    AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x09;

    AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0x0A;

InitAdc();

InitEPwm1Gpio();

/*ePWM config*/

EPwm1Regs.TBPRD = 6000;

EPwm1Regs.CMPA.half.CMPA = 1500;

EPwm1Regs.TBPHS.all = 0;

EPwm1Regs.TBCTR = 0;

EPwm1Regs.TBCTL.bit.PHSDIR = TB_UP;

EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;

EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE;

EPwm1Regs.TBCTL.bit.PRDLD = TB_IMMEDIATE;

EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;

EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;

EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;

EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;

EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;

EPwm1Regs.DBRED = 100;

EPwm1Regs.DBFED = 100;

EPwm1Regs.AQCTLA.bit.ZRO = AQ_CLEAR;

EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;

EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;

EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_PRD;

EPwm1Regs.ETSEL.bit.SOCAEN = 0x1;

EPwm1Regs.ETSEL.bit.SOCBEN = 0x1;

EPwm1Regs.ETSEL.bit.SOCBSEL = ET_CTR_ZERO;

EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;

EPwm1Regs.ETSEL.bit.INTEN = 0x1;

EPwm1Regs.ETPS.bit.SOCACNT = 0x1;

EPwm1Regs.ETPS.bit.SOCAPRD = 0x1;

EPwm1Regs.ETPS.bit.SOCBCNT = 0x1;

EPwm1Regs.ETPS.bit.SOCBPRD = 0x1;

EPwm1Regs.ETPS.bit.INTCNT = 0x1;

EPwm1Regs.ETPS.bit.INTPRD = 0x1;

EPwm1Regs.ETCLR.bit.INT = 0x1;

EPwm1Regs.ETCLR.bit.SOCA = 0x1;

EPwm1Regs.ETCLR.bit.SOCB = 0x1;

//enable Interrupt

    PieCtrlRegs.PIECTRL.bit.ENPIE = 1; //vector enable

    PieCtrlRegs.PIEIER1.bit.INTx6 = 1; //enable adc

    PieCtrlRegs.PIEIER3.bit.INTx1 = 1; //enable ePWM1 zero interrupt

    IER |= M_INT1;

    IER |= M_INT3;

EINT;

ERTM;

    while(1)

    {

    DELAY_US(10000);

    }

}

interrupt void  adc_isr(void)

{

// Insert ISR Code here

VoltageA[0] = AdcRegs.ADCRESULT0 >>4;

VoltageA[1] = AdcRegs.ADCRESULT1 >>4;

VoltageA[2] = AdcRegs.ADCRESULT2 >>4;

VoltageB[0] = AdcRegs.ADCRESULT3 >>4;

VoltageB[1] = AdcRegs.ADCRESULT4 >>4;

VoltageB[2] = AdcRegs.ADCRESULT5 >>4;

AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         // Reset SEQ1

AdcRegs.ADCTRL2.bit.RST_SEQ2 = 1;         // Reset SEQ1

AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;       // Clear INT SEQ1 bit

AdcRegs.ADCST.bit.INT_SEQ2_CLR = 1;       // Clear INT SEQ1 bit

PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE

}

 

  • It looks like you are reading the wrong ADCRESULT registers for VoltageB[].  It should be ADCRESULT8-ADCRESULT10.

    Also:

    1. You can use the AdcMirror registers to eliminate the >>4 shifting
    2. The AdcRegs.ADCTRL2.bit.SOC_SEQn bits are used to trigger the SOC immediately with the CPU and should not be set during initialization