您好,我目前在修改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; }
您好,
c2000ware 5.04 中提供了adc_ex2_soc_epwm例程,您参考的是哪个?