工具与软件:
我正在使用 AM263X-LP 并希望在4个 ADC 通道(所有通道均以其最大采样率工作)上实现同步采样、以下哪项是最佳的示例工程?
请说明在下面提到的两种情况下获得的输出的差异
1.利用1个 ADC 模块和4通道实现同步采样。
2. 使用4个 ADC 模块实现同步采样,每个模块使用单个通道。
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.
工具与软件:
我正在使用 AM263X-LP 并希望在4个 ADC 通道(所有通道均以其最大采样率工作)上实现同步采样、以下哪项是最佳的示例工程?
请说明在下面提到的两种情况下获得的输出的差异
1.利用1个 ADC 模块和4通道实现同步采样。
2. 使用4个 ADC 模块实现同步采样,每个模块使用单个通道。
嘿、Tej、
请参阅 SDK 中的 ADC 多 SOC EPWM 示例。
单个 ADC 将无法同时对4个不同的采样电压进行采样。 不过、您可以对4个独特 通道的采样进行多路复用。 使用由4个独立 ADC 组成的单个通道、您可以同时对4个不同的信号进行采样。 获得的输出值不会因方法而异。
此致、
Zackary Fleenor
HII Fleenor、
感谢您的建议、
在 ti E2E 中完成多个线程后、我意识到 了 AM263x MCU+ SDK:ADC SOC 连续 DMA 是同步采样以获得更高频率信号的更好选择。 当我将采样率设置为3.2Msps (或低)时运行良好、但当我将采样率设置为4Msps (通过更改 ADC 时钟预分频器)时、两个通道上的相同信号(两个信号具有相同属性)存在相位差。 下面我附上了同样的图像。
如何解决此问题??
采样率= 3.2msps (近似值)、正弦波频率= 400kHz (在两个通道上)
采样率= 4MSPS、正弦波频率= 400kHz (双通道)
HII Fleenor、
我找到了 DMA 问题。
我已将事件队列值初始化为2。
#define EDMA_TEST_EVT_QUEED_NO_2 2U
APP_dmaConfigure (gAdc3DataBuffer、Results_buffer_size、gEdmaHandle[0]、
ADC3_EDMA_CHANNEL、CONFIG_ADC3_RESULT_BASE_ADDR、&tccAlloc2、EDMA_TEST_EVT_QUEED_NO_2);
但在 TRM 中、事件队列(0和1)只能有2个值。
我的问题是、如果只有2个事件队列、那么如何针对4个通道(1个通道、4个不同实例)实现真正的同步采样?
尊敬的 Tej:
从 DMA 的角度来看、可以有2个同时传输、因为有2个传输控制器。 从 ADC 的角度来看、由于有5个 ADC、因此可以有5个同步采样。 但是 DMA 传输比 ADC 采样率快得多、 因此不会导致您的非同步 ADC 传输。
示例中的 DMA 通道被单独设计、在一个空传输完成后、用于将16位数据从1个 ADC 传输到1个缓冲器。
在尝试不同的 DMA 配置之前、让我们尝试从 ADC 配置方面查看。
您尝试的预分频器配置更改是什么? s/h 值以及这个分别是什么?但是当我将采样率设置为4MSPS (通过更改 adc 时钟预分频器)
谢谢。此致、
Madhava
尊敬的 Madhava:
1.是的。ADC 由自己的 INT 触发。
下面提到了各种办法:
a)使用 ePWM0、ADCSOCA 完成第一次 ADC 转换。 INT1、INT2在转换结束时生成。
b) ADC0_INT1链接到 INT_XBAR_0以生成中断。
c)当在首次转换后收到中断时、我将禁用 EPWM 触发器和 ADC0_INT1。
D)从这一点开始、INT2被用于启动转换中断。
2. 我已将 S/H 窗口分配为16 (SYSCLK 周期)、所有情况下均为80ns。
当我进行 ADCCLK =(输入时钟)/ 4.5 (采样率= 3.2MSPS 大约)时、它对2个 ADC 通道有效。
当我使 ADC 预分频器3或更低(采样率>= 4MSPS 大约)时、在采样2信号时会存在一些相位差
更高的频率。
下面是我计算采样率的公式。
主要问题在于当我同时对4个 ADC 进行采样时、即使采样率为3.2MSPS、也会存在相位差。
我已经 在先前的响应中分享了 DMA Param 配置的详细信息。
谢谢。
尊敬的 Madhava:
是的、即使采样率为3.2MSPS、我也面临相位差问题。
这是我在4 ADC 同步采样模式下获得的观测结果。
下面给出了我调用 App_dmaConfigure 函数的顺序:
APP_dmaConfigure (gAdc1DataBuffer、Results_Buffer_Size、gEdmaHandle[0]、
ADC1_EDMA_channel、CONFIG_ADC1_RESULT_BASE_ADDR、&tccAlloc0、EDMA_TEST_EVT_QUET_NO_0);
APP_dmaConfigure (gAdc2DataBuffer、Results_Buffer_Size、gEdmaHandle[0]、
ADC2_EDMA_channel、CONFIG_ADC2_RESULT_BASE_ADDR、&tccAlloc1、EDMA_TEST_EVT_QUET_NO_1);
APP_dmaConfigure (gAdc3DataBuffer、Results_buffer_size、gEdmaHandle[0]、
ADC3_EDMA_CHANNEL、CONFIG_ADC3_RESULT_BASE_ADDR、&tccAlloc2、EDMA_TEST_EVT_QUEED_NO_0);
APP_dmaConfigure (gAdc4DataBuffer、Results_buffer_size、gEdmaHandle[0]、
ADC4_EDMA_channel、CONFIG_ADC4_RESULT_BASE_ADDR、&tccAlloc3、EDMA_TEST_EVT_QUEED_NO_1);
uint16_t App_dmaConfigure( const uint16_t *table, uint16_t table_size, EDMA_Handle dma_handle, uint32_t dma_ch, uint32_t adc_base, uint32_t *tccAlloc, uint32_t event_queue_number) { uint32_t baseAddr, regionId; EDMACCPaRAMEntry empty_edmaParam, edmaParam; uint32_t empty_dmaCh, dmaCh, empty_tcc, tcc, empty_param, param; // EDMACCPaRAMEntry empty_edmaParam; // uint32_t empty_dmaCh, empty_tcc, empty_param; int32_t testStatus = SystemP_SUCCESS; uint32_t chainOptions = (EDMA_OPT_TCCHEN_MASK | EDMA_OPT_ITCCHEN_MASK); baseAddr = EDMA_getBaseAddr(gEdmaHandle[0]); DebugP_assert(baseAddr != 0); regionId = EDMA_getRegionId(gEdmaHandle[0]); DebugP_assert(regionId < SOC_EDMA_NUM_REGIONS); empty_dmaCh = dma_ch; testStatus = EDMA_allocDmaChannel(gEdmaHandle[0], &empty_dmaCh); DebugP_assert(testStatus == SystemP_SUCCESS); empty_tcc = EDMA_RESOURCE_ALLOC_ANY; testStatus = EDMA_allocTcc(gEdmaHandle[0], &empty_tcc); DebugP_assert(testStatus == SystemP_SUCCESS); empty_param = EDMA_RESOURCE_ALLOC_ANY; testStatus = EDMA_allocParam(gEdmaHandle[0], &empty_param); DebugP_assert(testStatus == SystemP_SUCCESS); dmaCh = EDMA_RESOURCE_ALLOC_ANY; testStatus = EDMA_allocDmaChannel(gEdmaHandle[0], &dmaCh); DebugP_assert(testStatus == SystemP_SUCCESS); printf("allocated dma channel %d \n",dmaCh); tcc = EDMA_RESOURCE_ALLOC_ANY; testStatus = EDMA_allocTcc(gEdmaHandle[0], &tcc); DebugP_assert(testStatus == SystemP_SUCCESS); /* Passing back the Channel parameter to register the interrupt ISR*/ *tccAlloc = tcc; printf("counter assigned %d \n",counter++); param = EDMA_RESOURCE_ALLOC_ANY; testStatus = EDMA_allocParam(gEdmaHandle[0], ¶m); DebugP_assert(testStatus == SystemP_SUCCESS); /* Request channel */ EDMA_configureChannelRegion(baseAddr, regionId, EDMA_CHANNEL_TYPE_DMA, empty_dmaCh, empty_tcc, empty_param, event_queue_number); /* Program Param Set */ EDMA_ccPaRAMEntry_init(&empty_edmaParam); empty_edmaParam.srcAddr = (uint32_t) SOC_virtToPhy((void *)(adc_base+CSL_ADC_RESULT_ADCRESULT0)); empty_edmaParam.destAddr = (uint32_t) SOC_virtToPhy((void *)gUnusedBuffer); empty_edmaParam.aCnt = (uint16_t) 2; empty_edmaParam.bCnt = (uint16_t) table_size; empty_edmaParam.cCnt = (uint16_t) 1; empty_edmaParam.bCntReload = 0; empty_edmaParam.srcBIdx = (int16_t) EDMA_PARAM_BIDX(0); empty_edmaParam.destBIdx = (int16_t) EDMA_PARAM_BIDX(2); empty_edmaParam.srcCIdx = (int16_t) 0; empty_edmaParam.destCIdx = (int16_t) 0; empty_edmaParam.linkAddr = 0xFFFFU; empty_edmaParam.srcBIdxExt = (int8_t) EDMA_PARAM_BIDX_EXT(0); empty_edmaParam.destBIdxExt = (int8_t) EDMA_PARAM_BIDX_EXT(2); empty_edmaParam.opt = (EDMA_OPT_TCINTEN_MASK | EDMA_OPT_ITCINTEN_MASK | ((((uint32_t)empty_tcc) << EDMA_OPT_TCC_SHIFT) & EDMA_OPT_TCC_MASK)); EDMA_setPaRAM(baseAddr, empty_param, &empty_edmaParam); EDMA_configureChannelRegion(baseAddr, regionId, EDMA_CHANNEL_TYPE_DMA, dmaCh, tcc, param, event_queue_number); /* Program Param Set */ EDMA_ccPaRAMEntry_init(&edmaParam); edmaParam.srcAddr = (uint32_t) SOC_virtToPhy((void *)(adc_base+CSL_ADC_RESULT_ADCRESULT0)); edmaParam.destAddr = (uint32_t) SOC_virtToPhy((void *)table); edmaParam.aCnt = (uint16_t) 2; edmaParam.bCnt = (uint16_t) table_size; edmaParam.cCnt = (uint16_t) 1; edmaParam.bCntReload = 0; edmaParam.srcBIdx = (int16_t) EDMA_PARAM_BIDX(0); edmaParam.destBIdx = (int16_t) EDMA_PARAM_BIDX(2); edmaParam.srcCIdx = (int16_t) 0; edmaParam.destCIdx = (int16_t) 0; edmaParam.linkAddr = 0xFFFFU; edmaParam.srcBIdxExt = (int8_t) EDMA_PARAM_BIDX_EXT(0); edmaParam.destBIdxExt = (int8_t) EDMA_PARAM_BIDX_EXT(2); edmaParam.opt = (EDMA_OPT_TCINTEN_MASK | ((((uint32_t)tcc) << EDMA_OPT_TCC_SHIFT) & EDMA_OPT_TCC_MASK)); /* Enabling the Interrupt for Transfer complete of all the data */ EDMA_setPaRAM(baseAddr, param, &edmaParam); EDMA_chainChannel(baseAddr, empty_param, dmaCh, chainOptions); EDMA_enableTransferRegion(baseAddr, regionId, empty_dmaCh, EDMA_TRIG_MODE_EVENT); return testStatus; } void App_dmach0ISR(Edma_IntrHandle intrHandle, void *args) { SemaphoreP_Object *semObjPtr = (SemaphoreP_Object *)args; DebugP_assert(semObjPtr != NULL); printf("inside the interrupt \n"); ADC_setInterruptSOCTrigger(gAdc1baseAddr, ADC_SOC_NUMBER0, ADC_INT_SOC_TRIGGER_NONE); ADC_setInterruptSOCTrigger(gAdc2baseAddr, ADC_SOC_NUMBER0, ADC_INT_SOC_TRIGGER_NONE); ADC_setInterruptSOCTrigger(gAdc3baseAddr, ADC_SOC_NUMBER0, ADC_INT_SOC_TRIGGER_NONE); /* Post the semaphore to signal end of DMA transfer */ SemaphoreP_post(semObjPtr); }
HII Madhava,
当我通过复位对 ADC 采样时、这就是我得到的图形(Graph 是针对以4Msps 的速率采样的100KHz 信号)。
我面临的问题是-
1) 1)对于以4Msps 进行100KHz 信号采样、我们应该每周期获得40个样本、但我只获得20个样本。
我有一个疑问-
我们将从4个 ADC 通道同时接收转换结束中断、然后 2个传输控制器如何进行同步以实现同步采样?
如何解决这个问题??
谢谢。
尊敬的 Tej:
您能否说明该问题是否与已关闭同步传输的4个 ADC 有关? -主题中的原始问题。
[报价用户 id="596784" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1372341/mcu-plus-sdk-am263x-am2634/5278065 #5278065"]对于以4MSPS 进行100KHz 信号采样的4MSPS 信号、我们每周期应该能得到40个样本、但我只能得到20个样本。我同意应该有40个样本。 我看到您的 B_cnt 为 table_size、您传递到这里的值是什么? 我看到你的 dest_B_indx 和 a_cnt 为2、你的目标缓冲区大小是否为16位? 您的图也会拾取16位值吗? 您可能会从内存浏览器获取值转储并绘制该图、您能在此处分享您的 mem-dump 吗?
[报价 userid="596784" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1372341/mcu-plus-sdk-am263x-am2634/5278065 #5278065"]我有一个疑问-
我们将从4个 ADC 通道同时接收转换结束中断、然后 2个传输控制器如何进行同步以实现同步采样?
[报价]ADC 采样+转换时间约为250ns、DMA 传输比这快得多。 此外、ADC 控制器会将转换结果传输到转换后的结果空间中。 因此、DMA 在新结果锁存器之前有很长的时间来关闭电流传输。
谢谢。此致、
Madhava
尊敬的 Tej:
存储器浏览器映像是我所请求的映像。 谢谢。
当我从复位状态对 ADC 采样时、这就是我得到的图形(图形表示以4MSPS 采样的100KHz 信号)。
[报价]
这个图像你已经分享,这似乎样本不是同时采集(原因: 相同的样本,不同的电压点在同一个输入)。 当只有2个 DMA 通道和2个 ADC 时、您能否确认每个输入周期是否有40个样本?
此外、能否确认您是在配置 DMA 通道之前还是之后从 ePWM 启用 ADC SOC 触发?
谢谢。此致、
Madhava
尊敬的 Tej:
在2个 ADC 上具有40个样本的4MSPS 情况很好、符合预期。 我们可以检查4个 ADC 情况下的任何 EDMA 错误标志吗? 恐怕有任何瓶颈。
[报价 userid="596784" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1372341/mcu-plus-sdk-am263x-am2634/5280923 #5280923"] 2.配置 DMA 通道后、我将从 ePWM 启用 ADC SOC 触发信号[/报价]好的。 感谢您确认这一点。
谢谢。此致、
Madhava
尊敬的 Madhava:
更新-
我已经使用不同的采样率配置进行了进一步的测试、我想分享测试结果并征求您的意见:
根据这些观察结果、我怀疑在超过2MSPS 时 DMA 传输机制可能存在限制实际采样率的限制。
为了帮助我们取得进展并 最大限度地减少 任何潜在的项目延迟、我非常感谢您对实现 所需采样率的潜在变通办法或替代方法的见解。
谢谢
您好、Tej
还在努力寻找解决方案、似乎是同时传输所有4个结果存在问题、恐怕 DMA 通道在下一个数据传入之前实际上不会免费使用。
请参阅此主题、直到我们进一步调试问题: https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1319076/mcu-plus-sdk-am263x-continuous-sampling-of-multiple-adcs-to-dma-buffers
请告诉我这是否有帮助!
道歉和此致
Akshit