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.

TMS320F280049 ADC采样配置



我想在运行过程中反复切换ADC采样的触发源,配置的原理是这样的:

SOCA和AOCB分别用EPWM1的COMPB减计数和增计数相等时触发,COPMB配置为影子模式,周期和下溢点更新,在增计数时用SOCB触发ADCA,ADCB和ADCC三个模块采样,减计数时用SOCA触发ADCA,ADCB和ADCC三个模块采样,在周期和下溢都执行的PWM中断中改变COMPB的值和触发方式。PWM模块增减计数,使能周期和下溢中断.

现在问题是,ADCC模块一直在采样,ADCA和ADCB模块不采样。下面是我的配置,请帮忙查看。谢谢。


配置代码
    // Disable SOCA
    EPWM_disableADCTrigger(EPWM1_BASE, EPWM_SOC_A);
    EPWM_setADCTriggerSource(EPWM1_BASE,EPWM_SOC_A,EPWM_SOC_TBCTR_D_CMPB);
    EPWM_setADCTriggerEventPrescale(EPWM1_BASE,EPWM_SOC_A,1);
    EPWM_enableADCTrigger(EPWM1_BASE,EPWM_SOC_A);
    // Disable SOCB
    EPWM_disableADCTrigger(EPWM1_BASE, EPWM_SOC_B);
    EPWM_setADCTriggerSource(EPWM1_BASE,EPWM_SOC_B,EPWM_SOC_TBCTR_U_CMPB);
    EPWM_setADCTriggerEventPrescale(EPWM1_BASE,EPWM_SOC_B,1);
    EPWM_enableADCTrigger(EPWM1_BASE,EPWM_SOC_B);

void InitADCSOC(void)
{
    // Configure SOC of ADCA/ADCB/ADCC, The EPWM1SOCA signal will be the trigger.
    ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
                 ADC_CH_ADCIN10, 10U);
    ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_EPWM1_SOCA,
                 ADC_CH_ADCIN3, 10U);
    ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_EPWM1_SOCA,
                 ADC_CH_ADCIN0, 10U);
    ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER3, ADC_TRIGGER_EPWM1_SOCA,
                 ADC_CH_ADCIN6, 10U);
    ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER4, ADC_TRIGGER_EPWM1_SOCA,
                 ADC_CH_ADCIN8, 10U);
    ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
                 ADC_CH_ADCIN0, 10U);
    ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
                 ADC_CH_ADCIN14, 10U);
    ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_EPWM1_SOCA,
                 ADC_CH_ADCIN0, 10U);
    ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_EPWM1_SOCA,
                 ADC_CH_ADCIN1, 10U);
    ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER3, ADC_TRIGGER_EPWM1_SOCA,
                 ADC_CH_ADCIN2, 10U);
    ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER4, ADC_TRIGGER_EPWM1_SOCA,
                 ADC_CH_ADCIN3, 10U);
    ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER5, ADC_TRIGGER_EPWM1_SOCA,
                 ADC_CH_ADCIN5, 10U);
    // Set SOC5 to set the interrupt 1 flag. Enable the interrupt and make sure its flag is cleared.
    ADC_setInterruptSource(ADCC_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER5);
    ADC_enableInterrupt(ADCC_BASE, ADC_INT_NUMBER1);
    ADC_clearInterruptStatus(ADCC_BASE, ADC_INT_NUMBER1);
}


interrupt void EPWM1TBIsr(void)
{
if((*gEPwmURegs).TBSTS.bit.CTRDIR == 1)
{
    EALLOW;
(*gEPwmURegs).CMPB.bit.CMPB = (*gEPwmURegs).TBPRD - ADC_SAMP_DELAY;
    EDIS;
        
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
                     ADC_CH_ADCIN10, 10U);
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_EPWM1_SOCA,
                     ADC_CH_ADCIN3, 10U);
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_EPWM1_SOCA,
                     ADC_CH_ADCIN0, 10U);
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER3, ADC_TRIGGER_EPWM1_SOCA,
                     ADC_CH_ADCIN6, 10U);
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER4, ADC_TRIGGER_EPWM1_SOCA,
                     ADC_CH_ADCIN8, 10U);
        ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
                     ADC_CH_ADCIN0, 10U);
        ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
                     ADC_CH_ADCIN14, 10U);
        ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_EPWM1_SOCA,
                     ADC_CH_ADCIN0, 10U);
        ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_EPWM1_SOCA,
                     ADC_CH_ADCIN1, 10U);
        ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER3, ADC_TRIGGER_EPWM1_SOCA,
                     ADC_CH_ADCIN2, 10U);
        ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER4, ADC_TRIGGER_EPWM1_SOCA,
                     ADC_CH_ADCIN3, 10U);
        ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER5, ADC_TRIGGER_EPWM1_SOCA,
                     ADC_CH_ADCIN5, 10U);
    }
    else
    {
    EALLOW;
(*gEPwmURegs).CMPB.bit.CMPB = ADC_SAMP_DELAY;
    EDIS;
        
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCB,
                     ADC_CH_ADCIN10, 10U);
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_EPWM1_SOCB,
                     ADC_CH_ADCIN3, 10U);
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_EPWM1_SOCB,
                     ADC_CH_ADCIN0, 10U);
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER3, ADC_TRIGGER_EPWM1_SOCB,
                     ADC_CH_ADCIN6, 10U);
        ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER4, ADC_TRIGGER_EPWM1_SOCB,
                     ADC_CH_ADCIN8, 10U);
        ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCB,
                     ADC_CH_ADCIN0, 10U);
        ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCB,
                     ADC_CH_ADCIN14, 10U);
        ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_EPWM1_SOCB,
                     ADC_CH_ADCIN0, 10U);
        ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_EPWM1_SOCB,
                     ADC_CH_ADCIN1, 10U);
        ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER3, ADC_TRIGGER_EPWM1_SOCB,
                     ADC_CH_ADCIN2, 10U);
        ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER4, ADC_TRIGGER_EPWM1_SOCB,
                     ADC_CH_ADCIN3, 10U);
        ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER5, ADC_TRIGGER_EPWM1_SOCB,
                     ADC_CH_ADCIN5, 10U);
    }
    // Clear INT flag for this timer
    EPWM_clearEventTriggerInterruptFlag(EPWM1_BASE);
    // Acknowledge interrupt group
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3);
}