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.

[参考译文] TMDS62LEVM:提供连续模式和轮询模式(无中断)下 ADC 的示例代码

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1513898/tmds62levm-provide-example-code-for-adc-in-continuous-mode-and-polling-mode-no-interrupt

器件型号:TMDS62LEVM
主题中讨论的其他器件:AM62L

工具/软件:

您好、

除了 此处提供的 ADC 单次模式示例外、您是否还能提供以下示例代码:

1) ADC 处于连续模式。

2) ADC 使用轮询(无中断)。

谢谢、

Simeon

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

    您好  Simeon、

    请在下面找到我的分析报告。

    1、连续模式方法:
    •在连续模式下、ADC 继续以固定的速率进行采样。
    •如果应用程序读取结果的速度不够快、新样本将覆盖旧样本。
    •如果处理时间超过采样间隔、这可能会导致数据丢失。


    2.选择:控制单次触发模式:
    •在循环中使用单次触发模式(即触发器读取触发器)可实现完全控制:
    •您开始转换。
    •等待/轮询完成。
    •读数据。
    •再次开始 下一次转换。

    以下线程在  轮询模式下连续单次使用。

    请查看关于 e2e 的最后3条评论。 您将拥有启用此方法的代码和过程。

    该过程对 AM62L 器件同样有效。  

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1424959/am2432-fifo-words-in-fifo-reading-is-abnormal-when-using-adc-voltage-sampling



    任一模式的建议轮询流程:

    无论您使用的是一次性还是连续模式、都可以禁用中断并完全依赖轮询  


    1. 在代码中禁用中断 :注释掉启用 ADC 中断。

        /* Enable interrupts */
        //ADC_enableIntr(baseAddr, (ADC_INTR_SRC_END_OF_SEQUENCE |
                                 ADC_INTR_SRC_FIFO0_THRESHOLD |
                                 ADC_INTR_SRC_FIFO0_OVERRUN |
                                 ADC_INTR_SRC_FIFO0_UNDERFLOW |
                                 ADC_INTR_SRC_FIFO1_THRESHOLD |
                                 ADC_INTR_SRC_FIFO1_OVERRUN |
                                 ADC_INTR_SRC_FIFO1_UNDERFLOW |
                                 ADC_INTR_SRC_OUT_OF_RANGE));

    2.  在代码中禁用 HWI 启用:  注释掉 HWI 注册。

    /* Register & enable interrupt */
    //HwiP_Params_init(&hwiPrms);
    //hwiPrms.intNum = CONFIG_ADC0_INTR;
    //hwiPrms.callback = &App_adcISR;
    //hwiPrms.priority = 1U;
    //status = HwiP_construct(&gAdcHwiObject, &hwiPrms);
    //DebugP_assert(SystemP_SUCCESS == status);

    3.  启用连续模式  在代码: S 将 ADC 模式设置为连续模式。

        adcConfig.mode             = ADC_STEPCONFIG_MODE_SW_EN_CONTINUOUS;
    


    4.轮询转换:
    在读取数据之前,按如下所示轮询中断状态寄存器。

    while(1)
    
    {
    uint32_t intrStatus = ADCGetIntrStatus(baseAddr);
    uint32_t  isConversionDone = ((intrStatus & (1 << 1)) >> 1);  
    
    if (isConversionDone == 0)
    {
    uint32_t adcValue = ADCGetFIFOData(baseAddr); 
    ADCClearIntrStatus(baseAddr, intrStatus);     // Clear the status to allow next cycle
    }
    
    }

    此致、

    Anil.

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

    尊敬的 Anil:

    感谢您的答复。 我能够让 ADC 在轮询(单次和连续模式)和中断(单次模式)下工作。

    但我无法让它在中断(连续模式)下工作。 它在通话后被卡住了   ADC_START (baseAddr、true);

    我想使用选项1、而不是替代选项(选项2)。 你有什么建议?

    此致、

    Simeon

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

    您好 Simeon、

    选项1的问题:

    选项1的问题在于 ADC 以非常高的速率产生连续中断。

    这些中断发生的频率非常高、以至于 CPU 无法有效执行主例程。

    为避免此问题、我们有两种选择:
    1.以较低的采样频率运行 ADC、这样可以减少 CPU 上的中断负载。
    2、结合 DMA 使用 ADC ,无需 CPU 干预即可进行数据传输,避免频繁中断。

    如果您需要有关选项2的帮助、请告诉我。

    此致、

    Anil.

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

    尊敬的 Anil:

    请您能否为您提到的两个权变措施选项提供示例代码(即、 以较低的采样频率运行 ADC;以及-将 ADC 与 DMA 结合使用)?

    谢谢、

    Simeon

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

    您好  Simeon、

    DMA 支持在 MCU+SDK for ADC 中尚不可用、我们可以继续(方法1)  使用以较低的采样率运行 ADC

    以下技术:

    选项1:使用 openDelay 和 sampleDelay 寄存器

    即使 ADC 以25 MHz 运行、您也可以通过添加内部延迟来减慢转换速度:
    •openDelay 可配置为高达65535
    •SampleDelay 可以配置为高达255

    这会在步骤之间造成内部差距。

    示例:
    使用25 MHz ADC 时钟(每周期40ns)时、

    设置 openDelay = 32365会得到:
    每通道32365 × 40ns≈1.29ms 延迟

    多通道设置

    如果4个 ADC 通道在相同的延迟配置下处于活动状态(openDelay = 32365、sampleDelay = 0):


    •每一轮完整的4次转换大约需要:您将看到 ADC 中断大约每~5ms 触发一次...
    •此配置在连续模式下工作正常、预计不会出现任何问题。

    如何配置:  

    adcConfig.openDelay = 32365;

    选项2:使用较低频率的外部时钟(EXT REF 时钟)
    •将 ADC 时钟源设置为 EXT_REF_CLOCK。
    •将外部时钟信号(例如1 MHz、2 MHz 或任何频率< 25 MHz)馈送到 EXT_REF_CLOCK 输入。
    •这可以有效地减少内部 ADC 采样时钟、从而降低转换速率。

    此致、
    Anil.

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

    尊敬的 Anil:

    我尝试使用您提供的值(adcConfig.openDelay = 32365)在连续模式下配置 ADC、应用在启动 ADC 模块后卡住了。 我还尝试了开路延迟和采样延迟的最大值(如下所示)、得到了相同的问题。 你有什么建议?

    此致、

    Simeon

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

    您好 Simeon、

    我认为没有为每个 ADC 序列插入开路延迟。

    这意味着延迟仅发生一次、下一次打开延迟不起作用。

    因此、上述方法不起作用。

    我建议我们可以连续使用单次触发模式。

    根据您的观察、这不是卡住的、但 ADC 中断会频繁出现。 因此、我们无法为主要例行程序留出时间。

    因此、请连续使用单次触发模式。 如果你采用这种方法,你 有 任何问题吗?

    在这种方法中、ADC 控制您手中的所有内容。 我可以帮助您实施此方法。

    请告诉我我们如何才能继续下去。

    此致、

    Anil.

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

    尊敬的 Anil:

    感谢您的回答。 我们已经可以进行一次性 ADC 中断测试(我们可以运行多次)、因此将该测试用于连续模式似乎没有任何其他好处。  

    我们希望在不使用单次方法的情况下使 ADC 中断连续模式工作。  

    您认为我们何时可以成为一个有效的例子?

    此致、

    Simeon

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

    您好 Simeon、

    连续模式中的问题是 ADC 中断生成。

    ADC 中断触发非常快、因此我们没有时间运行 main 例程。

    如果您需要一个示例、我们必须 尝试 使用连续模式 DMA 系统。

    但是、如果我们使用 DMA、那么我们需要配置至少 10K 以上的 ADC 样本。 否则、DMA 中断会频繁触发、这会导致软件系统出现问题。

    另一种 方法是永远为 ADC 时钟提供并馈送非常低的帧 信号(如1MZ)、然后在连续模式下使用 ADC。

    我觉得单次触发方法适合您的测试应用,请让我知道进入连续模式的要求。 所以,我可以尝试以更好的方式帮助你。

    此致、

    Anil.

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

    尊敬的 Anil:

    感谢您的答复。 目前、我们将继续使用 ADC 连续轮询模式。

    - Simeon

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

    您好 Simeon、

    感谢您的反馈。

    我已经提供了一种方法 ,以连续模式与轮询共享 ADC。 因此、我在 e2e 未来不会取得任何进展。

    我想我们可以关闭这个票证。  

    此致、

    Anil.