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.

[参考译文] TMS320F28027:ADC OneShot 模式出现问题、此功能似乎无法正常工作

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1160917/tms320f28027-problems-with-adc-oneshot-mode-this-feature-doesn-t-seem-to-work

器件型号:TMS320F28027

大家好、专家也很好

  关于 ADC OneShot 模式、可能是由于我的配置错误、我遇到了一些问题、如下所示:

  我配置 SOC0、SOC4、SOC9、SOC15 (四个 SOC 均为软件触发器)、 顺序模式
  然后启用  SOCPRICTL.OneShot。

  在主循环中、软触发 ADC、如下所示:   

 while (1)
 {
    DELAY_US (10);
    AdcRegs.ADCSOCFRC1.all = 0xFFFF; // Point1
    temp = AdcRegs.ADCSOCFLG1.all;

    DELAY_US (10);
    AdcRegs.ADCSOCFRC1.all = 0xFFFF; //  Point2
    DELAY_US (10);
    AdcRegs.ADCSOCFRC1.ALL = 0xFFFF;
    DELAY_US (10);
    AdcRegs.ADCSOCFRC1.ALL = 0xFFFF;

我在上面的两行中设置断点、有一些结果是:

 在 Point1之后 、ADCSOCFLG1都为1、 同时我认为它应该为0x1000 (仅第一个 SOC);

 在 Point1之后 、temp = 0xFFFF、这意味 着 ADCSOCFLG1全部为1。 但我没有配置其他 SOC 寄存器;

所有16 个 AdcResult 寄存器都填充了数据;

 

我想问的是:

 1.案例的正确结果是什么(SOC0、SOC4、SOC9、SOC15)?

2.为什么得到这一结果?

使用 OneShot 模式的正确方法是什么?

祝你一切顺利!!!

 

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

    Matt、您好!

    [引用 userid="520389" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1160917/tms320f28027-problems-with-adc-oneshot-mode-this-feature-doesn-t-seem-to-work "] AdcRegs.ADCSOCFRC1.all = 0xFFFF; // Point1[/quot]

    在器件的手册中、ADCSOCFRC1寄存器的说明是:"写入1将强制 ADCSOCFLG1寄存器中相应的 SOCx 标志位为1 "。 这将解释 ADCSOCFLG1中的所有位都为1的原因。 该描述似乎并未说明 SOC 需要全部配置才能实现这种情况、因此我希望它仍会设置标志。

    至于使用 OneShot 模式的正确方法、您能否向我展示如何设置 ADC 和配置寄存器? 我希望确保可以验证 设置。

    此致、

    Omer Amir

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

    void main()

    memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(uint32)&RamfuncsLoadSize);

    InitSysCtrl();

    InitAdcAio();
    InitAdc();

    EALLOW;
    AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;
    AdcRegs.SOCPRICTL.bit.OneShot = 1;

    AdcRegs.ADCINTFLGCLR.ALL = 0xFFFF;
    AdcRegs.ADCINTOVFCLR.ALL = 0xFFFF;

    AdcRegs.ADCSOC0CTL.bit.ACQPS = 6;
    AdcRegs.ADCSOC0CTL.bit.CHSEL = 0;
    AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 0;

    AdcRegs.ADCSOC4CTL.bit.ACQPS = 6;
    AdcRegs.ADCSOC4CTL.bit.CHSEL = 4;
    AdcRegs.ADCSOC4CTL.bit.TRIGSEL = 0;

    AdcRegs.ADCSOC9CTL.bit.ACQPS = 6;
    AdcRegs.ADCSOC9CTL.bit.CHSEL = 7;
    AdcRegs.ADCSOC9CTL.bit.TRIGSEL = 0;

    AdcRegs.ADCSOC15CTL.bit.ACQPS = 6;
    AdcRegs.ADCSOC15CTL.bit.CHSEL = 9;
    AdcRegs.ADCSOC15CTL.bit.TRIGSEL = 0;

    EDIS;

     while (1)
     {
      DELAY_US (10);
      AdcRegs.ADCSOCFRC1.all = 0xFFFF;// Point1
      temp = AdcRegs.ADCSOCFLG1.all;

      DELAY_US (10);
      AdcRegs.ADCSOCFRC1.all = 0xFFFF;// Point2
      DELAY_US (10);
      AdcRegs.ADCSOCFRC1.ALL = 0xFFFF;
      DELAY_US (10);
      AdcRegs.ADCSOCFRC1.ALL = 0xFFFF;
     }


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

    在28027 勘误表(SPRZ292S)中、它显示: 当 ADC 转换由顺序或同步采样模式下的任何触发源启动时、第一个采样可能不是正确的转换结果。 那么 、在启用 OneShot 模式之前、ADCNOVERLAP 和 CLKDIV2EN 位必须置位吗?  即使我设置了这两个位、结果看起来也是一样的。

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

    Matt、

    OneShot 被添加到 Gen2 ADC 以模拟 Gen1 ADC 的行为、其中转换被保持在一个序列中、并且全局触发器有限(如果存储器提供、只有3个触发器)。

    第2代(F2802x/3x/5x/6x)中的 ADC 的工作方式差异很大、因为每个 SOC 的概念都有自己的触发源。  如果多个 SOC 配置有相同的触发源、则该方案中的默认行为是根据轮询方案按顺序处理所有这些 SOC。  OneShot 只会在每次触发发生时处理一个。

    但是、TRM 中不清楚的是、这仅适用于将 SOCFLG 设置为启动转换的触发器。  由于强制 ADCSOC 的 SW 方法是通过在 SW 中写入来设置 FLG 本身、因此 OneShot 模式根本不会进入仲裁、基本上会被绕过。  因此、当您向 SOCFLG 写入0xFFFF 时、仍会转换所有通道。

    如果您要调试 OneShot、我会将触发源设置为 SOC 的 PWM、您可以选择。  该模块内的 PWM SOC 有一个 SW 强制位、该位随后将显示 OneShot = 1和 OneShot = 0之间的差异。

    最棒的

    Matthew

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

    yes.it 按 预期工作、您会非常满意。 祝你度过美好的一天~