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.

TMS320F280049C: 程序一直正常运行,忽然出现adc采样数值异常,求助!

Part Number: TMS320F280049C


先前烧写程序都是到flash,程序较大

之前一直好好的正常工作,忽然一次烧写后看到电脑上adc口读取的采样值发生明显偏差。正常为0的输出电压,检测到3000+,直接电路的过压保护灯亮了,epwm关闭;再看其他的adc口采样电压值也发生了较大的偏差,正常为2048的输入电压(3.3V的一般电压)直接升到了4095。如下图所示:、

请问是否有小伙伴遇到过类似问题?先前程序运行都是正常的。下面附上adc部分程序:

#include "F28x_Project.h"
#define TriggerEpwm       7
void ADCsetup(void);
void ADCInit(void);
void ADCSOCInit(void);

void ADCsetup(void){
    ADCInit();
    ADCSOCInit();
}

void ADCSOCInit(void){
    // Select the channels to convert and the end of conversion flag
    // A1 used for HVBUS sample--ADCA-SOC1
    // B4 used for AC sample--ADCB-SOC1
    // Sample Current first and then voltage sample
    EALLOW;
    //Configure HVBUS sample SOC: ADCA1-SOC1
    AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1;        
    AdcaRegs.ADCSOC1CTL.bit.ACQPS = 29;   
    AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = TriggerEpwm;  
    //Configure AC sample SOC1 ADCB-SOC1
    AdcbRegs.ADCSOC0CTL.bit.CHSEL = 4;       
    AdcbRegs.ADCSOC0CTL.bit.ACQPS = 49;   
    AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = TriggerEpwm;

    AdcbRegs.ADCSOC1CTL.bit.CHSEL = 4;         
    AdcbRegs.ADCSOC1CTL.bit.ACQPS = 29;
    AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = TriggerEpwm;

    AdcbRegs.ADCSOC2CTL.bit.CHSEL = 4;         
    AdcbRegs.ADCSOC2CTL.bit.ACQPS = 29;
    AdcbRegs.ADCSOC2CTL.bit.TRIGSEL = TriggerEpwm;

    AdcbRegs.ADCSOC3CTL.bit.CHSEL = 4;
    AdcbRegs.ADCSOC3CTL.bit.ACQPS = 29;
    AdcbRegs.ADCSOC3CTL.bit.TRIGSEL = TriggerEpwm;

    //Configure ADC INT1 trig after HVBUS Sample
    AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 1; 
    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;   
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

    AdcaRegs.ADCSOC2CTL.bit.CHSEL = 4;//trig on IA sample (ADCa SOC2)  1h EOC1 is trigger for ADCINT4
    AdcaRegs.ADCSOC2CTL.bit.ACQPS = 9;     // Sample window is 10 SYSCLK cycles
    AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = TriggerEpwm;   // Trigger on ePWM2 SOCA

    AdcaRegs.ADCSOC3CTL.bit.CHSEL = 2;//trig on IB sample (ADCa SOC3)  1h EOC0 is trigger for ADCINT2
    AdcaRegs.ADCSOC3CTL.bit.ACQPS = 9;     // Sample window is 10 SYSCLK cycles
    AdcaRegs.ADCSOC3CTL.bit.TRIGSEL = TriggerEpwm;   // Trigger on ePWM2 SOCA

    AdcaRegs.ADCSOC4CTL.bit.CHSEL = 10;//trig on IC sample (ADCa SOC4)  1h EOC1 is trigger for ADCINT10
    AdcaRegs.ADCSOC4CTL.bit.ACQPS = 9;     // Sample window is 10 SYSCLK cycles
    AdcaRegs.ADCSOC4CTL.bit.TRIGSEL = TriggerEpwm;   // Trigger on ePWM2 SOCA
    EDIS;
}

void ADCInit(void){
    SetVREF(ADC_ADCA, ADC_INTERNAL, ADC_VREF3P3);
    SetVREF(ADC_ADCB, ADC_INTERNAL, ADC_VREF3P3);
    //SetVREF(ADC_ADCC, ADC_INTERNAL, ADC_VREF3P3);
    EALLOW;
    // Set ADCCLK divider same to CPUCLK
    AdcaRegs.ADCCTL2.bit.PRESCALE = 2;//50MHz
    AdcbRegs.ADCCTL2.bit.PRESCALE = 2;
    //AdccRegs.ADCCTL2.bit.PRESCALE = 2;
    //Set pulse positions to late
    AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
    AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
    //AdccRegs.ADCCTL1.bit.INTPULSEPOS = 1;
    // Power up the ADC and then delay for 1 ms
    AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
    AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;
    //AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1;
    EDIS;
    DELAY_US(200000);
}

void ReadSam(void){         //Read Sample Value and Filter
    ivin[ivosam] = AdcbResultRegs.ADCRESULT1;
    ivo[ivosam] = AdcaResultRegs.ADCRESULT1;//+vref;
    Vinsam.ins = (ivin[0]+ivin[1]+ivin[2]+ivin[3]+ivin[4]+ivin[5]+ivin[6]+ivin[7])>>3;
    Vosam.ins = (ivo[0]+ivo[1]+ivo[2]+ivo[3]+ivo[4]+ivo[5]+ivo[6]+ivo[7])>>3;
    ivosam++;
    if(ivosam >= 8){
        ivosam = 0;
    }
    Vinreal = (int)Vinsam.ins - Vin_ref; 
    Vinabs = abs(Vinreal); 
}