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.
工具/软件:Code Composer Studio
你(们)好
我需要一些有关 DMA 与 ADC 配置的帮助。
我有一个20kHz 的2 PWM 信号(用于电机控制)。 我需要对整个周期的电流进行采样。
为此、我希望以1.28MSPS 的采样率对64个值进行采样(需要49us)。
因此、我的想法是启动 ADC、始终触发采样4个值、在 ADC 采样接下来的4个值时、使用 DMA 突发请求将样本传输到缓冲器中。
在我的 PWM 中断内、我将启动下一个 DMA 请求(主结构或备用结构)
为此、我为 ADC 序列发生器0配置了4个采样(FIFO 半满时的猝发请求)。
ROM_ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_CH18 | ADC_CTL_IE);
ROM_ADCSequenceStepConfigure (ADC0_BASE、0、1、ADC_CTL_CH18);
ROM_ADCSequenceStepConfigure (ADC0_BASE、0、2、ADC_CTL_CH18);
ROM_ADCSequenceStepConfigure (ADC0_BASE、0、3、ADC_CTL_CH18 | ADC_CTL_END);
ADC1和通道19也是如此。
ADC 工作列表-我在配置 DMA 之前对其进行了测试。
DMA 的配置如下:
ROM_uDMAChannelAttributeDisable (UDMA_CHANGE_ADC0、UDMA_PRI_SELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR| UDMA_ATTR_REQMASK); ROM_uDMAChannelAttributeDisable (UDMA_CHANGE_ADC0、UDMA_ALT_SELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR| UDMA_ATTR_REQMASK); ROM_uDMAChannelAttributeDisable (UDMA_SEC_CHANGE_ADC10、UDMA_PRI_SELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR| UDMA_ATTR_REQMASK); ROM_uDMAChannelAttributeDisable (UDMA_SEC_CHANGE_ADC10、UDMA_ALT_SELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR| UDMA_ATTR_REQMASK); ROM_uDMAChannelAssign (UDMA_CH14_ADC0_0); ROM_uDMAChannelControlSet (UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT、UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_4); ROM_uDMAChannelControlSet (UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT、UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_4); ROM_uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *)(ADC0_BASE + ADC_SEQ + ADC_SSFIFO)、(void *) u16Adc0SamplesA、64); ROM_uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、(void *)(ADC0_BASE + ADC_SEQ + ADC_SSFIFO)、(void *) u16Adc0SamplesB、64); ROM_uDMAChannelAssign (UDMA_CH24_ADC1_0); ROM_uDMAChannelControlSet (UDMA_SEC_CHANNEL_ADC10 | UDMA_PRI_SELECT、UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_4); ROM_uDMAChannelControlSet (UDMA_SEC_CHANNEL_ADC10 | UDMA_ALT_SELECT、UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_4); ROM_uDMAChannelTransferSet (UDMA_SEC_CHANGE_ADC10 | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *)(ADC1_base + ADC_SEQ + ADC_SSFIFO)、(void *) u16Adc1SamplesA、64); ROM_uDMAChannelTransferSet (UDMA_SEC_CHANGE_ADC10 | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、(void *)(ADC1_base + ADC_SEQ + ADC_SSFIFO)、(void *) u16Adc1SamplesB、64); uDMAChannelEnable (UDMA_CHANGE_ADC0); uDMAChannelEnable (UDMA_SEC_CHANGE_ADC10); ADCSequenceDMAEnable (ADC0_BASE、0); ADCSequenceDMAEnable (ADC1_BASE、0);
启动 uC 后、我在缓冲区中看到64个值(u16Adc0SamplesA 等)、因此看起来 DMA 至少在工作一次。
但是、如何重新触发 PWM 中断内部的主结构或备用结构的 DMA?
这是我尝试过但不起作用的东西。
if (((HWREG (UDMA_ENASET)>> UDMA_CHANGE_ADC0)& 0x01)= 0){ if (uDMAChannelAttributeGet (UDMA_CHANGE_ADC0)& UDMA_ATTR_ALTSELECT){ ROM_uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、 (void *)(ADC0_BASE + ADC_SEQ + ADC_SSFIFO)、(void *) u16Adc0SamplesA、64); } 否则{ ROM_uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、 (void *)(ADC0_BASE + ADC_SEQ + ADC_SSFIFO)、(void *) u16Adc0SamplesB、64); } uDMAChannelEnable (UDMA_CHANGE_ADC0); }
到达 UDMA_ALT_SELECT 行的断点、但不会发生任何情况。
感谢你的帮助。
此致
Rene
下面是一个示例程序、可为您提供帮助。 它使用计时器来触发 ADC 转换、但随后使用乒乓模式的 UDMA 来收集数据。 使用 Code Composer 的"File"->"Import"功能将该项目导入您的工作区。
/cfs-file/__key/communityserver-discussions-components-files/908/3125.ADCwDMA.zip