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.

[参考译文] TMS320F28379D:具有用于所有 ADC 通道的 DMA 的 ADC

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/998168/tms320f28379d-adc-with-dma-for-all-adc-channels

器件型号:TMS320F28379D

大家好、我需要有关如何解决问题的建议:

我有6个 ADC 输入:
1 - AdcCregs ADCINC2 - ADCINC3 (DMA 通道1)
2 - Adcaregs ADCINA4 - ADCINA5 (DMA 通道2)

3 - Adcaregs ADCINA2 - ADCINA3 (DMA 通道3)
4 - AdcDregs ADCIN0 - ADCIND1 (DMA 通道4)

5 - AdcBregs ADCINB2 - ADCINB3 (DMA 通道5)
6 - AdcDregs ADCIND2 - ADCIN3 (DMA 通道6)

我已成功完成1、2和5、6个通道的功能、其中基于 EPwm1和 EPwm3触发器 I 启动 ADC 转换并使用 DMA 填充缓冲器(必须实时处理样本)。  您可能已经注意到、我使用差分测量。 当我想嵌入共用同一个 ADC 寄存器的通道3和4时、就会出现这个问题。 我必须不断切换寄存器(ADCSOC1 CHSEL)以进行3、4个输入的转换、而1 - 2、5 - 6个输入时、它们此时无法将样本存储在 DMA 缓冲器中。

您是否会建议我或给我提供如何操作的任何想法? 谢谢。

-标记

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

    Mark、

    我了解您的问题、ADCA/B/C/D 全部用于操作通道1、2、5和6。 这些通道的并行性是可能的、但对于通道3和4则不是。

    由于每个 ADC 有16个 SOC、因此您无需每次切换 CHSEL 寄存器、而是使用编号不同的 SOC 初始化通道。 这样就无需每次都更新 SOCxCTL 寄存器。

    您是否需要对所有通道进行并行操作、并在所有通道的同一时刻将数据发送到 DMA? 如果是这样、您只能在最后一次转换完成时尝试读取 ISR 中的数据。 这将降低输出频率、但足以满足同步运行的需求。

    谢谢、

    Aditya

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

    您好、Aditya、

    是的、您答对了。 IM 使用 SOC0 - SOC9进行过采样。 因此、我只需串联即可、并逐渐使用 CHSEL 切换 DMA 缓冲器和 ADC 通道。  最好是所有 ADC 通道并行工作。 我不知道我是否有足够的时间串联处理采样缓冲器。

    或者,我是否只能用2个 DMA 通道来馈送具有轮循算法的缓冲器?
    示例:将 DMA 源 CH1设置为缓冲器1、转换1后采样 CHSEL 到另一个 ADC 通道、并更改 DMA 源 CH1缓冲器3 1采样、然后反复... 对于 DMA CH2也是如此。 但这似乎更慢、我需要更快的方法来获得实时信号。

    -标记

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

    Mark、

    如果您使用 SOC0-7进行精细过采样(我们将为每次转换分为两组8)、则可以尝试另一种解决方案。

    DMA 通道1:AdcCregs (ADCC:SoC 0 - 7)

    DMA 通道2:Adcaregs (ADCA:SoC 0 - 7)

     

    DMA 通道3:Adcaregs (ADCA:SoC 8 - 15)

    DMA 通道4:AdcDregs (ADCD:SoC 8 - 15)

    DMA 通道5:AdcBregs (ADCB:SoC 0 - 7)

    DMA 通道6:AdcDregs (ADCD:SoC 0 - 7)

    在 ADCA/D SOC15完成时生成中断并触发 DMA 通道传输。 您可能不需要更改 CHSEL 位。

    这个想法是否有助于您的应用?

    Aditya

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

    感谢您的回答。 那么,对于 DMA CH1和 CH2 ISR,我只会在 SOC7上触发 ADCC? 对于 DMA CH3 ADC/A 或 D?
    喜欢这个吗?

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    static void DMA_CH1_Init(volatile Uint16 *adcRes)
    {
    DMACH1ModeConfig(DMA_ADCCINT1, PERINT_ENABLE, ONESHOT_DISABLE,
    CONT_ENABLE, SYNC_DISABLE, SYNC_SRC,
    OVRFLOW_DISABLE, SIXTEEN_BIT, CHINT_END,
    CHINT_ENABLE);
    }
    static void DMA_CH3_Init(volatile Uint16 *adcRes)
    {
    DMACH1ModeConfig(DMA_ADCAINT1, PERINT_ENABLE, ONESHOT_DISABLE, //Trigger Set ADC A
    CONT_ENABLE, SYNC_DISABLE, SYNC_SRC,
    OVRFLOW_DISABLE, SIXTEEN_BIT, CHINT_END,
    CHINT_ENABLE);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    ADAINTSEL1N2.bit.INT1SEL = 15;
    ADBINTSEL1N2.bit.INT1SEL = 7;
    ADCINTSEL1N2.bit.INT1SEL = 7;
    ADDINTSEL1N2.bit.INT1SEL = 15;


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

    Mark、

    这对我来说很好。 您是否在设置中尝试过此操作? 结果是否符合预期?

    谢谢、

    Aditya

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

    大家好、 我做到了、它对我来说非常完美。 简单快捷的问题解决方案、非常感谢您提供的信息。