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
}
