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.

[参考译文] TMS570LC4357:ADC 处于连续模式的 DMA

Guru**** 2524460 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/843395/tms570lc4357-dma-with-adc-in-continuous-mode

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

在 ADC2配置为连续模式时使用 DMA 会出现一些问题。 我认为这是由于某些 DMA 通道延迟/冲突造成的。 我看到此帖子中描述的确切行为:

[ https://e2e.ti.com/support/microcontrollers/hercules/f/312/t/119037?TMS570-ADC-DMA]

DMA 通道0配置为从 ADC2组 FIFO 读取。 ADC2只有一个组配置为在16次转换后触发 DMA。 DMA 目标地址有时会在 ADC 结果为空标志的情况下进行转换。 这意味着 DMA 正在读取"太多"的 ADC 转换结果、但这似乎是 ADC 转换计数器超过+1至0阈值的结果。  

是否有任何方法来配置 DMA 或 ADC 以避免上述链接中所述的时序问题?

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

    Jeremy、

    ADC 上的连续转换模式主要用于使用 ADC 的"幅度阈值比较中断"特性进行监控的通道。 对于 CPU 或 DMA 实际读取的转换结果、此模式会出现您参考帖子中所述的问题。

    建议使用支持的多个触发器选项之一设置定期触发的单次转换序列。

    此致、Sunil

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

    您好、Sunil、

    感谢您的回复。 我们尝试在多达25个输入上每2ms 左右进行8kHz 的正弦振幅解调。 您是否对这些信号的过采样对 ADC/DMA 配置有任何建议?

    谢谢、

    Jeremy

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

    您好、Jeremy、

    最好的选择是在多个转换组中设置相同的通道、然后交替触发(可能具有相同"PWM"类似信号的交替边沿)。 这样、您就可以使用 DMA 传输一个转换组的数据、同时传输另一个转换组的数据、然后在这两个转换组之间进行切换。 这需要两个 DMA 通道才能工作。

    如果您需要示例设置、请告诉我、我可以为您提供示例设置(可能需要几天时间)。

    此致、Sunil

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

    您好、Sunil、

    一个很好的例子! 该配置听起来应该正常工作。

    谢谢、

    Jeremy

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

    您好、Jeremy、

    我附加了三个源文件和用于生成这些文件的 HALCoGen 项目、您可以将它们用作参考。

    group0 (事件组)和 group1都用于将相同的25个通道(0至24)逐一转换。 组0由 RTI 比较0中断的上升沿触发、而组1由该信号的下降沿触发。 我已经为比较0中断标志启用了自动清零、因此无需中断服务例程来继续生成边沿。 我已将其设置为100us 周期(25次转换序列为50us)。

    转换结果由 DMA 传输到 RAM 中的两个独立数组。 请注意、此示例中未实现数据处理。 为了处理这些 results.e2e.ti.com/.../6406.adc_5F00_dma.hcge2e.ti.com/.../0820.adc_5F00_dma.dile2e.ti.com/.../1452.HL_5F00_adc.ce2e.ti.com/.../4532.HL_5F00_rti.ce2e.ti.com/.../7612.HL_5F00_sys_5F00_main.c、您可以选择在 DMA 块传输完成时生成一个到 CPU 的中断

    此致、Sunil

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

    您好、Sunil、  

    我想使用 PWM (而不是 RTI)来触发2个 ADC 组上的 SOC (一个在上升沿、一个在下降沿)。 如果我使用 EPWM_B 作为两个 ADC 组的触发器、如何控制 SOC_B 脉冲宽度? PWM 事件触发器子模块允许我选择 SOC B 事件触发器、但这仅决定何时生成 SOC B 脉冲。 我不知道脉宽是如何确定的、在这种情况下下降沿时间很重要、因为它将是另一个 ADC 组的触发器。

    如果 SOC 事件的脉冲宽度不可配置、那么我认为我可以通过使用2个不同的 SOC 触发器来解决该问题、例如、ePWM_B 和 ePWM_A1、以及不同的事件触发器选择。

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

    您好、Jeremy、

    HALCoGen 包含了一个有关如何使用 EPWM_B 触发 ADC 转换的良好示例 例如、您可以通过在 ePWM1B 上生成50%占空比信号来实现此目的。 我能够生成周期为60us 的信号、因此每个半相位的宽度为30us。 这为每个组提供了足够的时间进行转换、并使用 DMA 将数据传输到 CPU RAM。 我附上了一份示波器照片、显示有时间空闲、因此在给定的25个通道中、周期可能会更短。

    请注意、我已经启用了 ePWM1B 信号(示波器快照上的通道3)以及 AD1_EXT_ENA 信号(通道1)到它们各自多路复用终端的输出。 AD1_EXT_ENA 上升沿代表每个 ADC 转换的采样阶段开始。

    请告诉我、如果您在按照 HALCoGen 的示例操作时遇到问题或困难。

    此致、Sunil

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

    实际上、这两个组都是由上述示波器快照中 ePWM1B 的下降沿触发的、因此50次转换是背靠背堆叠的。

    此致、Sunil

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

    谢谢 Sunil、

    在上面的示例中、我想在 PWM 信号的上升沿触发组1、在下降沿触发组2。 PWM SOC 脉冲是否可以实现这一点? 或者、我是否必须使用硬件触发器并将 PWM 输出引脚连接到 ADC SOC 引脚?

    我需要每个 ADC 组开始转换之间的恒定时间。

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

    Jeremy、

    是的、这也很容易设置。 ePWM SOCx 信号与正常 PWM 输出不同、因此您不能使用该信号的两个边沿触发两个具有可配置时序的独立 ADC 组。 相反、您可以使用 SOCA 触发一个组、使用 SOCB 触发另一个组。 我明天会尝试并告诉您。

    此致、Sunil

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

    附加的是使用 EPWM_A1触发组0和 ePWM_B 触发组1的示波器触发、每个组配置为转换相同的25个通道。 当 TBCTR = CMPA 时生成 SOCA、当 TBCTR = PRD 时生成 SOCB、以与 PWM 输出的上升沿和下降沿保持一致。

    我还附上相关的 HCG 文件供参考。

    e2e.ti.com/.../8037.LC43_5F00_ePWM_5F00_ADC.hcg

    e2e.ti.com/.../4643.LC43_5F00_ePWM_5F00_ADC.dil

    此致、Sunil

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

    您好、Sunil、

    您是否能够将生成上述示波器图的用户代码与您附加的 halcogen 工程附加在一起? 我的同事和我在实施过程中遇到了一些问题。 我们的 DMA 缓冲器有时会填充来自正弦 ADC 输入的垃圾/偏移数据、而其他时候数据看起来是正确的。 我们使用30kHz 的 PWM、并使用 SOC A1和 SOC B 在每个边沿触发25个通道样本、以分别触发 ADC 组1和2 (我们不使用像您的 halcogen 项目那样的事件组)。 我们无法看到 AD1_EXT_ENA 引脚输出、即使我们已将引脚 G16和 V8的 IOMM 设置设置为 AD1_EXT_ENA 设置。

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

    您好、Jeremy、

    我通常不太愿意上传完整的代码项目、但在本例中会这样做。 我正在连接压缩的 CCS 项目。 请注意、我只启用了 V8来输出 AD1EXT_ENA 信号、因为您只需要一个端子来输出。

    另请注意、我使用的 PWM 频率几乎是您使用的频率的一半。 我有一个周期为60us 的 EPWM_A、这将是16.67KHz PWM。 该 PWM 的每个边沿触发25个 ADC 输入的转换、因此事件组和组1都用于转换相同的25个通道。 通道采样频率为~33KHz。

    如 HCG 报告的那样、对25个通道进行采样大约需要22.6us、并由示波器快照进行确认。 因此、第一个采样组的末尾和下一个采样组之间存在7.4us 延迟、可以使用稍快的 PWM 来填充该延迟。 但是、没有足够的可宽延时间来使 PWM 频率加倍。 这可能是您看到同时触发多个转换组的原因。

    希望访问 helps.e2e.ti.com/.../1512.LC43_5F00_ePWM_5F00_ADC.zip

    此致、Sunil