请问ADC多通道循环采样该如何配置?当三个ADC module选择定时器触发所有通道(触发周期5us),并且开启ADCA的中断时,所有SOC通道的转换结果都相同。以下是我的ADC SOC通道配置,麻烦看一下配置上是否有不对的,或者是不是方式不对。谢谢。 目标是实现 ADC A \ B \ C的各个通道循环同步采样(每个循环开始时同步)。
#define USER_ACQPS_ 40
void InitADCSOC(void)
{
//config SOCs, set the triggler source for SOCs. ACQPS = 40(0.5US) ConvTime: 10*0.025=0.25us
ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN4, USER_ACQPS_);
ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN9, USER_ACQPS_);
ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN6, USER_ACQPS_);
ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER3, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN2, USER_ACQPS_);
ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER4, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN3, USER_ACQPS_);
ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN0, USER_ACQPS_);
ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN4, USER_ACQPS_);
ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN2, USER_ACQPS_);
ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER3, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN3, USER_ACQPS_);
ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN1, USER_ACQPS_);
ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN14, USER_ACQPS_);
ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_CPU1_TINT1, ADC_CH_ADCIN4, USER_ACQPS_);
Interrupt_register(INT_ADCA1, &ADCAInt1ISR);
Interrupt_enable(INT_ADCA1);
ADC_setInterruptSource(ADCA_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER4);
ADC_enableInterrupt(ADCA_BASE, ADC_INT_NUMBER1);
ADC_disableInterrupt(ADCA_BASE, ADC_INT_NUMBER2);
ADC_disableInterrupt(ADCA_BASE, ADC_INT_NUMBER3);
ADC_disableInterrupt(ADCA_BASE, ADC_INT_NUMBER4);
ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
}
__interrupt void ADCAInt1ISR(void)
{
// Interrupt_disable(INT_ADCA1);// Disable this interrupt from happening again
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);// Acknowledge interrupt
ADValue[0] = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER0);
ADValue[1] = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER1);
ADValue[2] = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER2);
ADValue[3] = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER3);
ADValue[4] = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER4);
ADValue[5] = ADC_readResult(ADCBRESULT_BASE, ADC_SOC_NUMBER0);
ADValue[6] = ADC_readResult(ADCBRESULT_BASE, ADC_SOC_NUMBER1);
ADValue[7] = ADC_readResult(ADCBRESULT_BASE, ADC_SOC_NUMBER2);
ADValue[8] = ADC_readResult(ADCBRESULT_BASE, ADC_SOC_NUMBER3);
ADValue[9] = ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER0);
ADValue[10] = ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER1);
ADValue[11] = ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER2);
// Check if overflow has occurred
if(true == ADC_getInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1))
{
ADC_clearInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1);
ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
}
}
以下是ADC转换结果截图: