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.

[参考译文] TMS320F280023:ADC 样本读取问题

Guru**** 2239510 points
Other Parts Discussed in Thread: TMS320F280023
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1196266/tms320f280023-adc-samples-read-problem

器件型号:TMS320F280023

大家好、

我们在 TMS320f280023控制器中遇到 ADC 样本读取问题请在下面找到 ADC 配置详细信息:

我们在 ePWM 上触发 ADC。 如果我应用断点并检查 ADC 采样计数是否已被读取并在 ADCRESULT 寄存器中给出结果、则 Initaillay、但20秒后、我删除了断点并运行 一段时间、然后我通过应用断点进行检查、然后不读取 ADC 采样结果 它们可以自由地使用计数的旧值。

SetVREF (ADC_ADCA、ADC_EXTERNAL、ADC_VREF3P3);

EALLOW;
AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4

AdccRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4

//将脉冲位置设置为晚期
AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;

AdccRegs.ADCCTL1.bit.INTPULSEPOS = 1;
/

//为 ADC 加电
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1;

//延迟1ms 以允许 ADC 加电时间
DELAY_US (1000);

EDIS;

EALLOW;

AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0;//当前0
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 26;
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;
// AdcdResultRegs.ADCRESULT0;结果//Current 0
//
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 0x1;//当前1
AdcaRegs.ADCSOC1CTL.bit.ACQPS = 26;
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 5;
//// AdcdResultRegs.ADCRESULT1;结果//当前
//
AdcaRegs.ADCSOC2CTL.bit.CHSEL = 0x2;// Cur 8.
AdcaRegs.ADCSOC2CTL.bit.ACQPS = 26;
AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 5;
// AdcdResultRegs.ADCRESULT2;结果
//
AdcaRegs.ADCSOC3CTL.bit.CHSEL = 0x3;// cur9
AdcaRegs.ADCSOC3CTL.bit.ACQPS = 26;
AdcaRegs.ADCSOC3CTL.bit.TRIGSEL = 5;
// AdcdResultRegs.ADCRESULT3;结果
//
//
AdcaRegs.ADCSOC4CTL.bit.CHSEL = 0x4;//直流总线反馈
AdcaRegs.ADCSOC4CTL.bit.ACQPS = 26;
AdcaRegs.ADCSOC4CTL.bit.TRIGSEL = 5;
// AdcdResultRegs.ADCRESULT4;结果
//
//
AdcaRegs.ADCSOC10CTL.bit.CHSEL = 0xA;// IP1
AdcaRegs.ADCSOC10CTL.bit.ACQPS = 26;
AdcaRegs.ADCSOC10CTL.bit.TRIGSEL = 5;
// AdcaResultRegs.ADCRESULT0;结果
//
AdcaRegs.ADCSOC5CTL.bit.CHSEL = 0x5;// MTEMP_1
AdcaRegs.ADCSOC5CTL.bit.ACQPS = 26;
AdcaRegs.ADCSOC5CTL.bit.TRIGSEL = 5;
// AdcaResultRegs.ADCRESULT1;结果
//
AdcaRegs.ADCSOC6CTL.bit.CHSEL = 0x6;//MTEMP_2
AdcaRegs.ADCSOC6CTL.bit.ACQPS = 26;
AdcaRegs.ADCSOC6CTL.bit.TRIGSEL = 5;
// AdcaResultRegs.ADCRESULT2;结果
//
AdcaRegs.ADCSOC7CTL.bit.CHSEL = 0x7;//OVT_FB
AdcaRegs.ADCSOC7CTL.bit.ACQPS = 26;
AdcaRegs.ADCSOC7CTL.bit.TRIGSEL = 5;
// AdcaResultRegs.ADCRESULT3;结果

AdcaRegs.ADCSOC8CTL.bit.CHSEL = 0x8;//ANA_1
AdcaRegs.ADCSOC8CTL.bit.ACQPS = 26;
AdcaRegs.ADCSOC8CTL.bit.TRIGSEL = 5;
// AdcaResultRegs.ADCRESULT4;结果
//
AdcaRegs.ADCSOC9CTL.bit.CHSEL = 0x9;//ANA_2
AdcaRegs.ADCSOC9CTL.bit.ACQPS = 26;
AdcaRegs.ADCSOC9CTL.bit.TRIGSEL = 5;
// AdcaResultRegs.ADCRESULT5;结果
//
AdcaRegs.ADCSOC11CTL.bit.CHSEL = 0xB;// IP2
AdcaRegs.ADCSOC11CTL.bit.ACQPS = 26;
AdcaRegs.ADCSOC11CTL.bit.TRIGSEL = 5;
// AdcbResultRegs.ADCRESULT0;结果

AdcaRegs.ADCSOC12CTL.bit.CHSEL = 0xC;//IP3
AdcaRegs.ADCSOC12CTL.bit.ACQPS = 26;
AdcaRegs.ADCSOC12CTL.bit.TRIGSEL = 5;
// AdcbResultRegs.ADCRESULT1;结果


AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 1;
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC1结束将设置 INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除

EDIS;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sanmati、

    您的 PWM 触发器到达的速度有多快? 假设您的所有 SOC 都使用循环优先级、它们将按顺序从最小的数字转换为最大的数字。 配置为 EOC0的中断、因此中断到达 SOC0转换结束时、但在转换其余 SOC 之前。 如果您立即重新发出触发信号、 则 SOC1-12的触发信号可能会由于溢出情况而丢失。 此外、此时 SOC1-12的结果尚不就绪。 根据我的判断、您应该配置 ADCINTSEL1N2.bit.INT1SEL = 12。

    这里还有一个注意事项--不是单独配置这些 SOC 中的每一个以使用 ePWM1 SOCA 触发器,因为它们是按顺序配置的,而是可以配置突发转换:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    AdcaRegs.ADCSOCPRICTL.all = 0; // All SOCs round-robin priority
    AdcaRegs.ADCBURSTCTL.bit.BURSTTRIGSEL = 5; // Use ePWM1 SOCA trigger
    AdcaRegs.ADCBURSTCTL.bit.BURSTSIZE = 13; // 13 conversions from SOC0 to SOC12
    AdcaRegs.ADCBURSTCTL.bit.BURSTEN = 1; // Enable burst mode
    AdcaRegs.INTSEL1N2.bit.INT1SEL = 12; // Trigger interrupt on EOC12 (last SOC in the burst)
    AdcaRegs.INTSEL1N2.bit.INT1CONT = 1; // Enable continue-to-interrupt mode
    AdcaRegs.INTSEL1N2.bit.INT1E = 1; // Enable ADCINT1
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    突发触发器将从编号最小的 SOC 自动启动、该 SOC 未配置为高优先级、因此假设 ADCSOCPRICTL = 0、则从 SOC0开始。

    此致、
    Ibukun

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、 Ibukun、

    您的 PWM 触发器到达的速度有多快?  

    ANS:我们使用250微秒(4 KHz)的 ePWM 中断。

    在您的建议中、我们检查了给定的组合、但未解决我们的问题。  

    使用以下配置、我们在所有 ADCResult 寄存器中获得相同的读取计数结果、并在10秒后删除了不 读取样本计数的断点

     正如我在前一个 TT 中提到的。

    AdcaRegs.ADCSOCPRICTL.ALL = 0;//所有 SOC 循环优先级

    AdcaRegs.ADCBURSTCTL.bit.BURSTTRIGSEL = 5;//使用 ePWM1 SOCA 触发器
    AdcaRegs.ADCBURSTCTL.bit.BURSTSIZE = 13;//从 SOC0到 SOC12的转换13
    AdcaRegs.ADCBURSTCTL.bit.BURSTEN = 1;//启用突发模式

    AdcaRegs.INTSEL1N2.bit.INT1SEL = 12;// EOC12上的触发中断(突发中的最后一个 SOC)
    AdcaRegs.INTSEL1N2.bit.INT1CONT = 1;//启用持续中断模式
    AdcaRegs.INTSEL1N2.bit.INT1E = 1;

    请建议...

    此致、

    Sanmati

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sanmati、

    您能否确认实际发生了 ePWM 触发器? 您可以通过在 GPIO 引脚上提供 SOCA 来实现这一点。 下面的示例使用 driverlib、但如果必须的话、您可以将其转换为 bitfield。

    Fullscreen
    1
    2
    3
    4
    5
    // Write ADCSOCOUTSELECT to enable EPWM1 SOCA to drive an external ADC SOC
    SysCtl_enableExtADCSOCSource(SYSCTL_ADCSOC_SRC_PWM1SOCA);
    // Bring the SOC signal out to a GPIO (8 is an example, choose based on GPIO mux)
    GPIO_setPinConfig(GPIO_8_ADCSOCAO);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    您可以将此 GPIO 连接到示波器、以在执行期间观察 PWM 触发器。 触发器应反相(触发 SOCA 时引脚变为低电平)。

    此致、
    Ibukun