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.

[参考译文] AM263P4:有关使用4个以上通道实现 ADC 过采样的建议

Guru**** 2394295 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1508235/am263p4-suggestion-for-implementing-adc-oversampling-with-more-than-4-channels

器件型号:AM263P4

工具/软件:

大家好、我目前正在考虑为我们的项目实现 ADC 设计。

总之、将使用 ADC1-4。  每个 ADC 可能有4-6个通道要转换。  我们要进行过采样:转换所有通道4次、然后获取结果并后处理数据以计算所有转换的平均值。

其他信息:

  • PWM 运行@ 40kHz、ADC 转换和控制代码运行频率为20kHz
  • PWM0将生成 ADCSOCA 来触发所有 ADC 转换
  • 在所有 ADC 过采样结束时、对结果进行处理以计算平均值、然后运行控制代码。  当前 ADC1 EOC5会触发中断 XBAR

似乎有几个解决方案,但都不理想。  TI 是否可以在此处提供最佳方法或提供其他实现方案建议?

###实施#1 (PPB 和中继器):

  • 使用将中继器设置为 x4将所有 SOC 设置为触发
  • 设置 PPB 以对最小值/最大值进行求和
  • 设置 PPC OSINT 以生成 ISR 并运行控制代码

这种方法面临的挑战:

  1. 每个 ADC 只有4个 PPB。  一些 ADC 具有> 4个 SOC。  考虑到每个 ADC 需要大于4 PPB、这种方法是否可行?
  2. 仍需要跟踪剩余的 ADC 结果、以便在软件中完成数学均值计算。

###实现#2 (连续 DMA):

  • 创建 ADC 结果存储器缓冲区。
  • 设置最后一个 EOC 以生成 ADCINT1
  • 设置所有 SOC 以进行连续转换
  • 设置 DMA 以将所有 ADCRESULT 寄存器从 SOC0-SOCx 复制到最后一个 EOC 上的存储器缓冲区。
  • 设置缓冲区填充时 DMA 生成中断。  (即4xSOC 结果) 、然后运行平均处理缓冲区并运行控制代码

这种方法面临的挑战:

  • 参与得更多。
  • ADC 在缓冲器满后如何停止转换?
  • DMA 是否可以将所有 SOC 结果复制到自动递增的偏移量?  (此处没有太多 DMA 体验)
  • DMA 延迟是否类似于复制结果寄存器的简单 ISR?
  • 由于 勘误表 i2355、我们需要多少个 DMA?  4 ADC x 2 = 8?

还有其他建议吗?  我希望在这里获得经验丰富的 AM263开发人员的一些建议。

感谢您的支持。

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

    嗨、Huey

    实施#1似乎不是一个不错的选择、因为由于 PPB 限制、如果任何 ADC 需要超过4个通道、这种方法是不可行的。 即使通道<=4、在 OSINT 触发之前高效收集所有求平均值结果而不丢失数据也会出现问题、而不会频繁诉诸 EOC 中断、这会损害中继器/OSINT 的优势。

    用于实施方案2

    Unknown 说:
    ]由于 勘误表 i2355、我们需要多少个 DMA?  4 ADC x 2 = 8?

    勘误表2355不适用于 am263p。 从 IP 对 DMA 使用 alternativeTrigger。

    Unknown 说:
    ]缓冲区已满后 ADC 如何停止转换?

    ADC 不需要停止。 它会根据 PWM 触发器连续转换。 DMA 可确保您将4次转换的相干集捕获到缓冲区中进行处理。

    Unknown 说:
    DMA 延迟是否与复制结果寄存器的简单 ISR 相当?

    通常比读取多个寄存器时的 ISR 开销低得多且更可预测。 非常适合这种数据吞吐量。

    您可以尝试模拟以下方法:

    PWM0 SOCA 在所有 ADC 上触发 SOC0-SOCx。

    ADCxINT1配置为在  ADC 的最后一个 SOC 完成转换后触发

    3.由相应 ADCxINT1事件触发的 DMA 通道(每个 ADC 一个)。

    4.   在 ADC 的每次转换通过完成(由 ADCxINT1发出信号)后、DMA 将结果直接从 ADCRESULT 寄存器传输到 RAM、只需极少的 CPU 干预。

    5.管理4遍: 乒乓缓冲方法与 DMA 完成中断相结合是稳健的:

    • 分配两个缓冲区(A 和 B)、每个缓冲区足够大、可容纳 4个 TOTAL_CHANNES 结果。
    • DMA 写入当前活跃缓冲器(例如 a)。
    • 使用来自其中一个 DMA 通道的 DMA 传输完成(TC)中断(例如、用于 ADC4的中断)作为  已传输所有 ADC 一次结果通过的信号(假设 ADC4的最后一个 SOC 是最后一个要完成的 SOC、或者只是将其用作方便的同步点)。
    • 在 DMA TC ISR 中、使软件计数器递增。
    • 当计数器达到4:
    • 向主应用程序发出信号、指明一个完整的块已准备好进行处理(将指针传递到缓冲区 A)
    • 将所有4个通道的 DMA 目标指针切换到缓冲器 B
    • 重置计数器。
    • 应用程序处理缓冲区 A、而 DMA 填充缓冲区 B
    • 下次在 ISR 中计数器达到4时、使用缓冲区 B 向应用发出信号、并将 DMA 切换回缓冲区 A

    如果这对我有所帮助、请告诉我、同时我会尝试在我自己的端复制设置!

    此致、
    阿克什特