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.

TMS320F28377S: ADC无法采集到电流的值

Part Number: TMS320F28377S
Other Parts Discussed in Thread: C2000WARE

您好,我目前在修改ti的例程。我使用epwm1计数触发中断,可以进中断,但是adc采出的电流和偏移值全部都是0,能否帮忙看看问题在哪里?或者什么情况会导致电流值无法采集到呢

void adc_register_init(void){
Uint16 acqps;
EALLOW;
//1.时钟配置
CpuSysRegs.PCLKCR13.bit.ADC_A = 1;//上电时钟(已经在时钟配置函数写了,为了逻辑清楚,这里重新写一遍)
CpuSysRegs.PCLKCR13.bit.ADC_B = 1;
// CpuSysRegs.PCLKCR13.bit.ADC_C = 1;
// CpuSysRegs.PCLKCR13.bit.ADC_D = 1;
//2.ADC配置
AdcaRegs.ADCCTL2.bit.PRESCALE = 6; //ADC时钟预分频
AdcbRegs.ADCCTL2.bit.PRESCALE = 6;

AdcSetMode(ADC_ADCA, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);//分辨率12位 单端采样模式
AdcSetMode(ADC_ADCB, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);

AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;//中断位置选择
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;


AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; //上电
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;

DELAY_US(1000);
EDIS;
//3.ADC运行模式 SOC采样窗口长度保持
if(ADC_RESOLUTION_12BIT == AdcaRegs.ADCCTL2.bit.RESOLUTION)
{
acqps = 14; //75ns
}
else //resolution is 16-bit
{
acqps = 63; //320ns
}

//4.通道转换选择
EALLOW;
//ADCA A0---Uab A1---Ubc A2---Uca
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0 will convert pin A0---Uab
AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1; //SOC1 will convert pin A1---Ubc
AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps;
AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2; //SOC2 will convert pin A2---Uca
AdcaRegs.ADCSOC2CTL.bit.ACQPS = acqps;

AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 2; //end of SOC2 will set INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared

//ADCB B0---Iu B1---Iv
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0 will convert pin B0---Iu
AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps; //sample window is acqps + 1 SYSCLK cycles
AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1; //SOC1 will convert pin B1---Iv
AdcbRegs.ADCSOC1CTL.bit.ACQPS = acqps; //sample window is acqps + 1 SYSCLK cycles

AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 1; //end of SOC1 will set INT1 flag
AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared
EDIS;
//5.配置PPB
AdcbRegs.ADCPPB1CONFIG.bit.CONFIG = 0; // PPB1 is associated with SOC0
AdcbRegs.ADCPPB2CONFIG.bit.CONFIG = 1; // PPB2 is associated with SOC1
AdcaRegs.ADCPPB1CONFIG.bit.CONFIG = 0; // PPB1 is associated with SOC0
AdcaRegs.ADCPPB2CONFIG.bit.CONFIG = 1; // PPB2 is associated with SOC1
AdcaRegs.ADCPPB3CONFIG.bit.CONFIG = 2; // PPB3 is associated with SOC2

AdcbRegs.ADCPPB1OFFCAL.bit.OFFCAL = 0; // Write zero to this for now till offset ISR is run
AdcbRegs.ADCPPB2OFFCAL.bit.OFFCAL = 0; // Write zero to this for now till offset ISR is run
AdcaRegs.ADCPPB1OFFCAL.bit.OFFCAL = 0; // Write zero to this for now till offset ISR is run
AdcaRegs.ADCPPB2OFFCAL.bit.OFFCAL = 0; // Write zero to this for now till offset ISR is run
AdcaRegs.ADCPPB3OFFCAL.bit.OFFCAL = 0; // Write zero to this for now till offset ISR is run
//6.设置epwm1触发中断
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // ePWM1 SOCA
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 5;
AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 5;
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 5;
AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 5;

// //7.中断初始化配置
// EALLOW;
// PieVectTable.ADCB1_INT = &MotorControlISR; // 将 ADCB1 中断向量绑定到你的函数
// EDIS;
// PieCtrlRegs.PIEIER1.bit.INTx2 = 1; // PIE group 1,INTx2 对应 ADCB1
// IER |= M_INT1; // 启用 CPU 的 group 1 中断
// EINT; // 全局中断使能
// ERTM;
//-----------------------------------------------------------------------------
// static analog trim for all ADCs (A, B, C and D)
//-----------------------------------------------------------------------------
adc_cal=(int*)0x0000743F;
*adc_cal=0x7000;
adc_cal=(int*)0x000074BF;
*adc_cal=0x7000;
adc_cal=(int*)0x0000753F;
*adc_cal=0x7000;
adc_cal=(int*)0x000075BF;
*adc_cal=0x7000;
}
void epwminterruptinit(void){
EALLOW;

// 设置 EPWM1 触发中断(CMPA)
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTRU_CMPA;
EPwm1Regs.ETSEL.bit.INTEN = 1;
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;
EPwm1Regs.ETCLR.bit.INT = 1;

// 额外设置:如果你要让 EPWM1 触发 ADC 采样
EPwm1Regs.ETSEL.bit.SOCAEN = 1;
EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTRU_CMPA;
EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST;
EPwm1Regs.ETSEL.bit.SOCBEN = 1;
EPwm1Regs.ETSEL.bit.SOCBSEL = ET_CTRU_CMPA;
EPwm1Regs.ETPS.bit.SOCBPRD = ET_1ST;
// PIE 中断向量表绑定
PieVectTable.EPWM1_INT = &MotorControlISR;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1; // EPWM1 在 PIE Group3 INTx1

IER |= M_INT3; // 启用中断组3
EINT; // 开总中断
ERTM;

EDIS;
}