主题中讨论的其他器件:AM62L
工具/软件:
您好、
除了 此处提供的 ADC 单次模式示例外、您是否还能提供以下示例代码:
1) ADC 处于连续模式。
2) ADC 使用轮询(无中断)。
谢谢、
Simeon
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.
工具/软件:
您好、
除了 此处提供的 ADC 单次模式示例外、您是否还能提供以下示例代码:
1) ADC 处于连续模式。
2) ADC 使用轮询(无中断)。
谢谢、
Simeon
您好 Simeon、
请在下面找到我的分析报告。
1、连续模式方法:
•在连续模式下、ADC 继续以固定的速率进行采样。
•如果应用程序读取结果的速度不够快、新样本将覆盖旧样本。
•如果处理时间超过采样间隔、这可能会导致数据丢失。
2.选择:控制单次触发模式:
•在循环中使用单次触发模式(即触发器读取触发器)可实现完全控制:
•您开始转换。
•等待/轮询完成。
•读数据。
•再次开始 下一次转换。
以下线程在 轮询模式下连续单次使用。
请查看关于 e2e 的最后3条评论。 您将拥有启用此方法的代码和过程。
该过程对 AM62L 器件同样有效。
任一模式的建议轮询流程:
无论您使用的是一次性还是连续模式、都可以禁用中断并完全依赖轮询
1. 在代码中禁用中断 :注释掉启用 ADC 中断。
/* Enable interrupts */ //ADC_enableIntr(baseAddr, (ADC_INTR_SRC_END_OF_SEQUENCE | ADC_INTR_SRC_FIFO0_THRESHOLD | ADC_INTR_SRC_FIFO0_OVERRUN | ADC_INTR_SRC_FIFO0_UNDERFLOW | ADC_INTR_SRC_FIFO1_THRESHOLD | ADC_INTR_SRC_FIFO1_OVERRUN | ADC_INTR_SRC_FIFO1_UNDERFLOW | ADC_INTR_SRC_OUT_OF_RANGE));
2. 在代码中禁用 HWI 启用: 注释掉 HWI 注册。
/* Register & enable interrupt */ //HwiP_Params_init(&hwiPrms); //hwiPrms.intNum = CONFIG_ADC0_INTR; //hwiPrms.callback = &App_adcISR; //hwiPrms.priority = 1U; //status = HwiP_construct(&gAdcHwiObject, &hwiPrms); //DebugP_assert(SystemP_SUCCESS == status);
3. 。 启用连续模式 在代码: S 将 ADC 模式设置为连续模式。
adcConfig.mode = ADC_STEPCONFIG_MODE_SW_EN_CONTINUOUS;
4.轮询转换: 在读取数据之前,按如下所示轮询中断状态寄存器。
while(1) { uint32_t intrStatus = ADCGetIntrStatus(baseAddr); uint32_t isConversionDone = ((intrStatus & (1 << 1)) >> 1); if (isConversionDone == 0) { uint32_t adcValue = ADCGetFIFOData(baseAddr); ADCClearIntrStatus(baseAddr, intrStatus); // Clear the status to allow next cycle } }
此致、
Anil.
您好 Simeon、
选项1的问题:
选项1的问题在于 ADC 以非常高的速率产生连续中断。
这些中断发生的频率非常高、以至于 CPU 无法有效执行主例程。
为避免此问题、我们有两种选择:
1.以较低的采样频率运行 ADC、这样可以减少 CPU 上的中断负载。
2、结合 DMA 使用 ADC ,无需 CPU 干预即可进行数据传输,避免频繁中断。
如果您需要有关选项2的帮助、请告诉我。
此致、
Anil.
您好 Simeon、
DMA 支持在 MCU+SDK for ADC 中尚不可用、我们可以继续(方法1) 使用以较低的采样率运行 ADC
以下技术:
选项1:使用 openDelay 和 sampleDelay 寄存器
即使 ADC 以25 MHz 运行、您也可以通过添加内部延迟来减慢转换速度:
•openDelay 可配置为高达65535
•SampleDelay 可以配置为高达255
这会在步骤之间造成内部差距。
示例:
使用25 MHz ADC 时钟(每周期40ns)时、
设置 openDelay = 32365会得到:
每通道32365 × 40ns≈1.29ms 延迟
多通道设置
如果4个 ADC 通道在相同的延迟配置下处于活动状态(openDelay = 32365、sampleDelay = 0):
•每一轮完整的4次转换大约需要:您将看到 ADC 中断大约每~5ms 触发一次...
•此配置在连续模式下工作正常、预计不会出现任何问题。
如何配置:
adcConfig.openDelay = 32365;
选项2:使用较低频率的外部时钟(EXT REF 时钟)
•将 ADC 时钟源设置为 EXT_REF_CLOCK。
•将外部时钟信号(例如1 MHz、2 MHz 或任何频率< 25 MHz)馈送到 EXT_REF_CLOCK 输入。
•这可以有效地减少内部 ADC 采样时钟、从而降低转换速率。
此致、
Anil.
您好 Simeon、
我认为没有为每个 ADC 序列插入开路延迟。
这意味着延迟仅发生一次、下一次打开延迟不起作用。
因此、上述方法不起作用。
我建议我们可以连续使用单次触发模式。
根据您的观察、这不是卡住的、但 ADC 中断会频繁出现。 因此、我们无法为主要例行程序留出时间。
因此、请连续使用单次触发模式。 如果你采用这种方法,你 有 任何问题吗?
在这种方法中、ADC 控制您手中的所有内容。 我可以帮助您实施此方法。
请告诉我我们如何才能继续下去。
此致、
Anil.
您好 Simeon、
连续模式中的问题是 ADC 中断生成。
ADC 中断触发非常快、因此我们没有时间运行 main 例程。
如果您需要一个示例、我们必须 尝试 使用连续模式 DMA 系统。
但是、如果我们使用 DMA、那么我们需要配置至少 10K 以上的 ADC 样本。 否则、DMA 中断会频繁触发、这会导致软件系统出现问题。
另一种 方法是永远为 ADC 时钟提供并馈送非常低的帧 信号(如1MZ)、然后在连续模式下使用 ADC。
我觉得单次触发方法适合您的测试应用,请让我知道进入连续模式的要求。 所以,我可以尝试以更好的方式帮助你。
此致、
Anil.