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.
大家好、我需要有关如何解决问题的建议:
我有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?
喜欢这个吗?
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); }
ADAINTSEL1N2.bit.INT1SEL = 15;
ADBINTSEL1N2.bit.INT1SEL = 7;
ADCINTSEL1N2.bit.INT1SEL = 7;
ADDINTSEL1N2.bit.INT1SEL = 15;
Mark、
这对我来说很好。 您是否在设置中尝试过此操作? 结果是否符合预期?
谢谢、
Aditya
大家好、 我做到了、它对我来说非常完美。 简单快捷的问题解决方案、非常感谢您提供的信息。