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.

[参考译文] TM4C1294NCPDT:ADC 序列发生器错误

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/565171/tm4c1294ncpdt-adc-sequencer-error

器件型号:TM4C1294NCPDT

您好!

我使用 ADC 序列发生器来监控电路板上的7个电源电压。

这是初始化 ADC 及其序列发生器的代码。

   SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
   while (!(SysCtlPeripheralReady (SYSCTL_Periph_ADC0)));   //等待外设就绪

   MAP_GPIOPinTypeADC (GPIO_PORTD_BASE、GPIO_PIN_0);   //1V
   MAP_GPIOPinTypeADC (GPIO_PORTD_BASE、GPIO_PIN_1);   //1.2V
   MAP_GPIOPinTypeADC (GPIO_PORTD_BASE、GPIO_PIN_2);   //1.5V
   MAP_GPIOPinTypeADC (GPIO_PORTD_BASE、GPIO_PIN_3);   //1.8V
   MAP_GPIOPinTypeADC (GPIO_PORTD_BASE、GPIO_PIN_4);   //2.5V
   MAP_GPIOPinTypeADC (GPIO_PORTD_BASE、GPIO_PIN_5);   /3.3V (通过 DIO2电阻器)
   MAP_GPIOPinTypeADC (GPIO_PORTD_BASE、GPIO_PIN_6);   /5V (通过 DIO2电阻器)

   ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PIOSC | ADC_CLOCK_RATE_FULL、1);         //两个 ADC 的时钟

   ADCReferenceSet (ADC0_BASE、ADC_REF_INT);                 //VDDA = 3.3V
   ADCSequenceDisable (ADC0_BASE、0);                                        //禁用序列、然后再更改它
   ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_PROCESSOR、0);                   //选择处理器(软件)触发器
   ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_CH15);
   ADCSequenceStepConfigure (ADC0_BASE、0、1、ADC_CTL_CH14);
   ADCSequenceStepConfigure (ADC0_BASE、0、2、ADC_CTL_CH13);
   ADCSequenceStepConfigure (ADC0_BASE、0、3、ADC_CTL_CH12);
   ADCSequenceStepConfigure (ADC0_BASE、0、4、ADC_CTL_CH7);
   ADCSequenceStepConfigure (ADC0_BASE、0、5、ADC_CTL_CH6);
   ADCSequenceStepConfigure (ADC0_BASE、0、6、ADC_CTL_CH5);
   ADCSequenceStepConfigure (ADC0_BASE、0、7、ADC_CTL_CH5 | ADC_CTL_END);
   ADCIntClear (ADC0_BASE、0);                                              //清除中断状态标志
   ADCSequenceEnable (ADC0_BASE、0);                                        //使能序列

序列发生器在应用程序中每秒触发一次、如下所示...

uint32_t ADC0_RAW[8];

   ADCProcessorTrigger (ADC0_BASE、0);             //触发
   while (ADCIntStatus (ADC0_BASE、0、false)      //等待完成
   {
   }
   ADCIntClear (ADC0_BASE、0);                    //清除 ADC 中断标志
   ADCSequenceDataGet (ADC0_BASE、0、ADC0_RAW);      //读取 ADC 值

在大多数情况下、这种方法效果非常好。

但是、有时序列会导致通道错误、通道0获取通道1输入、通道1获取通道2等 我可以在调试器中看到这种情况。 一旦处于此状态、它将保持此状态、直到复位(我认为)。 这当然会使电源监控完全无用!

是否有人遇到过此问题、是否有解决方法或解决方法?

谢谢、

Richard

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

    在代码发布中、我看到有7个 ADC 引脚、但序列发生器已配置为8个步长。 这是您计划的预期实施吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、您好!
    我只有7个电压可供读取、因此第8个序列发生器采样再次读取最后一个通道。
    我的印象是 SS0固定为8个样本。 我可以将其设置为7吗?
    此外、是否可以通过禁用/启用来重置序列发生器?
    此致
    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    啊、我刚刚读过关于在最后一个采样上设置 END 位的内容、从而使其成为一个7采样序列。
    我会尝试这种方法。 但没有解释问题。
    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好 Richard

    通过添加以下代码、确保每次重新运行时都复位 ADC

    SysCtlPeripheralDisable (SYSCTL_Periph_ADC0);
    SysCtlPeripheralReset (SYSCTL_Periph_ADC0);
    SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
    while (!(SysCtlPeripheralReady (SYSCTL_Periph_ADC0)));//等待外设就绪

    此外、请确保 ADC 寄存器空间未在存储器或寄存器浏览器中打开。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、您好!

    将结束位放在第7个采样上会使问题变得更加严重-序列很快就会退出步进。

    在每个序列前复位 ADC 是否正常、还是建议我这样做、看看它是否有用?

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

    在开发过程中重置模块是一个好的做法、因为一些用户执行 CPU 重置、而不会重置外设。

    此外、您是否确保 ADC 寄存器未在寄存器或存储器窗口中打开!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它似乎复位 ADC 也会将序列复位为未编程。

    这与我在测量温度的序列发生器上遇到的问题相同(在 RTOS 论坛的一篇文章中-未回答)、结果发现4步序列发生器有时会返回8个值 (在阵列末尾运行并导致崩溃)只需将阵列扩展到8个值即可防止崩溃。

    为什么这些序列发生器有这么大的问题? 我想知道是否有线索
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Richard aland">序列发生器偶尔会错误信道- CHAN 0获取 CHAN 1、CHAN 1获取 CHAN 2等 我可以在调试器中看到这种情况。[/quot]

    Amit 已经建议、并且我们也注意到、调试器"打开 ADC 寄存器"可能会产生负面影响!

    为了安全-我们的方法是"将每个 ADC 序列读数复制到安全变量中、我们在 IAR 的快速视图中显示该变量。

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

    在配置 ADC 之前、只需执行上述步骤一次。 无需在应用程序代码中多次执行该操作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    的确、唯一打开的调试器窗口是"Expressions"、我在其中显示阵列 ADC0_RAW[]、其中 ADCSequenceDataGet (ADC0_BASE、0、ADC0_RAW)将其结果放置在一个称为 VENT[]的数组中、该数组被 ADC 原始电压转换为电压。

    我理解您建议我将外设复位放入初始化代码中-谢谢我通常这么做-我会将其添加。

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

    在序列的最后一步中、为什么不设置 IE 条件

    ADCSequenceStepConfigure (ADC0_BASE、0、7、ADC_CTL_CH5 | ADC_CTL_END);

    应该是

    ADCSequenceStepConfigure (ADC0_BASE、0、7、ADC_CTL_CH5 | ADC_CTL_IE | ADC_CTL_END);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、您好!

    您可能已经在这里提到了这个问题。


    使用 Tivaware 运行"本地"的 Tiva。。。

    从 TivaRomUG 中、ROM_ADCSequenceStepConfigure... 它可被配置成在步进完成时引起一个中断(ADC_CTL_IE 位)。

    我不希望它引起中断、我没有编写任何中断代码、也没有在启动代码中注册 ISR。 但是、我发现如果我没有设置 ADC_CTL_IE、代码会卡在"while (ADCIntStatus (ADC0_BASE、0、false)";"。 因此我设置 ADC_CTL_IE、它不会生成中断、但它允许"while (..)" 完成。

    我从这一点得出结论:UG 中的措词是错误的。 它不应"引起中断"、而应改为"设置中断标志"(被屏蔽)和"while (..)" 看到设置标志。


    重要提示:在 RTOS 下运行的 Tiva。。。

    现在、该线程中的相关项目正在 RTOS 下运行。 RTOS 中似乎不支持 ADC、因此我仍在使用相同的 Tivaware 函数。

    区别在于、如果我设置 ADC_CTL_IE、我会立即得到一个异常故障。 不设置 ADC_CTL_IE 似乎可以解决问题、但我遇到了序列发生器的问题。 实际上、如果我在第6步设置 ADC_CTL_END 位(而不是最后的第7步)、序列每隔一个运行就会获得错误的通道。 我在这里误解了什么?

    谢谢
    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我非常确定问题是"while (ADCIntStatus (ADC0_BASE、0、false)"行直接掉线、代码在准备就绪前正在读取序列 FIFO。

    如果我在"while (..)"之后放置一个"Task_sleep(1)" 看起来一切正常。

    也许这一直是我的问题吗? 这是否会导致序列发生器返回太多的值、就像我的温度读数问题(这会花费许多天的开发时间和损耗!)。 请参阅 e2e.ti.com/.../1994081

    现在是 TI 将 ADC 支持投入 RTOS 的时候了、因为许多文章都表明存在困难。 (请)。

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

    ADC_CTL_IE 设置允许序列发生器生成中断条件。 它是将其传播到 NVIC 的中断屏蔽位。 所以我相信这句话是正确的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、您好!
    我是否假设在 RTOS 中默认不屏蔽 ADC 中断、这会产生异常?
    如果是、屏蔽它的正确命令是什么?
    我是否假设 while (..) 直接下降、因为中断标志不是由 ADCIntClear (ADC0_BASE、0)清除;
    如果是、为什么不呢? 或者在错误的时间设置了什么?
    有人在 RTOS 中成功使用了 ADC 吗? 如果是的话,他们可以公布他们是怎么做的!
    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好 Richard

    不幸的是、我不是 RTOS 人员、让我害怕使用我无法完全控制的东西。

    是的、我相信未清除中断标志将导致 CPU 运行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amit、您好!

    它也让我感到害怕!
    当它工作时、它真的很棒、但如果它不工作、调试就会是一场噩梦。
    我之所以使用它、是因为在测试中、处理以太网 TCP 的速度比我的手写 lwip 版本更快。

    我认为应该在 RTOS 论坛上重新发布问题。

    感谢您的全程帮助、非常感谢。
    此致-新年快乐!
    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    现在我觉得很愚蠢!
    整个问题是因为我错过了“!” 在 while 语句中、是的、它是直接下降的!
    啊!
    再次对浪费您的时间表示歉意。
    此致、
    Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好 Richard

    我们也错过了一英里。 很高兴您在论坛上看到并更新了内容。