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多通道循环同步采样该如何配置?

Part Number: TMS320F280049

请问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转换结果截图:

  • 这个是每个模块的数值不一样,但是模块里面每个通道的数值一样。

    通道里面测试的数值都正确吗?方便测试一下按顺序排一下SOC和对应的通道吗,程序里面的排序太乱了。虽然好像跟问题的关系不大。

  • 简单列一下就是:

    SOC0 -> ADC A4

    SOC1 -> ADC A9

    SOC2 -> ADC A6

    SOC3 -> ADC A2

    SOC4 -> ADC A3

    SOC0 -> ADC B0

    SOC1 -> ADC B4

    SOC2 -> ADC B2

    SOC3 -> ADC B3

    SOC0 -> ADC C1

    SOC1 -> ADC C14

    SOC2 -> ADC C4

    实际端口量得电压得情况:

    A4、A9:0V
    A3:         1.4967V
    B0、B4:0V
    C1:         1.9337V
    C4:         1.4895V
    C14:       0V
    其余的前级是浮空的。

  • 具体通道的配置我觉得应该不重要,问题在结果出来的值都是一样的,不知道哪里配置有问题。

  • 是的,我也在奇怪,因为看你的配置并没有重叠的地方。我会再看一下这个问题,有结果了回复你。

  • 可能需要检查基本 ADC 和设备配置的内容:

    1、ADC 是否配置为内部或外部参考模式? VREFHI 引脚上的电压是多少?
    2、ADCCLK 的值是多少(基于 SYSCLK 到 ADCCLK 预分频器)?
       (可能还需要验证 CPU SYSCLK 的值)
    3、VDDA 电源电压的值是多少?
    4、ADC 是否已通电?
       (在采样之前是否遵循了通电延迟时间?)
    另外,复制的 SOC 配置代码似乎没问题

  • 问题找到了。VDDA不稳定,过低了。

    谢谢您的指导。thanks!

  • 问一下,在参考电压配置成1.65V时,ADC的满量程是单纯地通过量得的 VREFHI电压 x2 计算出来吗?我这边量出来的VREFHI不是刚好1.65V.

  • 你好,我也遇到了你类似的问题,请问您你这个问题怎么解决的呐

  • 是要更换电源吗

  • VDDA的电压稳定了就OK了。你看看电源的输出功率够不够。根据手册,VDDA的电流最大有30mA。