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.
您好!
我使用的是 LAUNCHXL-F280039C、并想将 ADC 配置为使用来自 VREFHI 的外部基准电压。 我将 ADC_setVREF (..) 执行任何形式的 ADC 初始化、但它不起作用。 所有 ADC 结果寄存器都为零、但 SOC 必须被触发、因为我有由 ADC 转换完成事件触发的 ISR。
我已经注意到、ADC 在 ADC_setVREF (ADCx_BASE、ADC_reference_internal、ADC_reference_3_3V)下可以正常工作、但如果我选择2.5V 基准电压、则会出现相同的问题:所有结果寄存器均为零。 调试期间、我可以通过更改 ANAREF2P5SEL 位在内部基准电压电平之间切换。如果我使用 ANAREF2P5SEL=0、转换可以正常;但如果我使用 ANAREF2P5SEL=1、则不行。 如果 ANAREF2P5SEL=1、我可以在 VREFHI 引脚上测量2.5V 基准电压。
我在勘误表中未看到与此相关的信息。 在选择不同的基准电压电平时是否还需要执行其他操作?
Hi Szabolcs、
F280039C 器件上有3个 ADC 模块。 所有3个 ADC 上的 VREFHI 引脚都是通用的、这意味着所有3个 ADC 都需要具有相同的 VREFHI 配置。 如果您需要在 ADC_reference_3_3V 和 ADC_reference_2_5V 之间切换、则需要 为每个 ADC 模块调用 ADC_setVREF 、并且仅为 ADCA、ADCB 和 ADCC 选择 ADC_reference_3_3V 或 ADC_reference_2_5V。
此致、
约瑟夫
您好、Joseph:
我已经知道这一点、所以我的问题是、即使我将所有的 ADC 模块参考电压设置为外部电压或2.5V 电压、转换也不起作用。
Hi Szabolcs、
从 ADC_reference_3_3V 切换到 ADC_reference_2_5V 时、我无法重现您观察到 的情况。 我还使用了 LAUNCHXL-F280039C、并在 adc_ex1_soc_software 示例上进行了尝试。 我将在 A0和 A1上馈送直流信号、因为示例代码使用这些输入通道。 我可以在 ADC_reference_3_3V 和 ADC_reference_2_5V 之间切换、然后我将获得预期的转换结果。 我还可以从外部(向 VREFHI 引脚和 GND 馈送2.5V 电压)和内部 VREF (从 VREFHI 断开外部 VREF 源)模式切换、并获取预期的转换结果。
// // Set up ADCs, initializing the SOCs to be triggered by software // Board_init(); // // Enable Global Interrupt (INTM) and realtime interrupt (DBGM) // EINT; ERTM; ADC_setVREF(myADC0_BASE, ADC_REFERENCE_INTERNAL, ADC_REFERENCE_2_5V ); // // Loop indefinitely // while(1) { // // Convert, wait for completion, and store results // ADC_forceMultipleSOC(myADC0_BASE, (ADC_FORCE_SOC0 | ADC_FORCE_SOC1)); // // Wait for ADCA to complete, then acknowledge flag // while(ADC_getInterruptStatus(myADC0_BASE, ADC_INT_NUMBER1) == false) { } ADC_clearInterruptStatus(myADC0_BASE, ADC_INT_NUMBER1); ADC_forceMultipleSOC(myADC1_BASE, (ADC_FORCE_SOC0 | ADC_FORCE_SOC1)); // // Wait for ADCC to complete, then acknowledge flag // while(ADC_getInterruptStatus(myADC1_BASE, ADC_INT_NUMBER1) == false) { } ADC_clearInterruptStatus(myADC1_BASE, ADC_INT_NUMBER1); // // Store results // myADC0Result0 = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER0); myADC0Result1 = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER1); myADC1Result0 = ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER0); myADC1Result1 = ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER1); // // Software breakpoint. At this point, conversion results are stored in // myADC0Result0, myADC0Result1, myADC1Result0, and myADC1Result1. // // Hit run again to get updated conversions. // ESTOP0; }
我在 while 环路之前添加了 ADC_setVREF ()、并且可以在其中更改任何基准模式和基准电压而不会出现任何问题。
您是否遵循过任何示例、尤其是关于 ADC 设置顺序的示例?
此致、
约瑟夫
您好、Joseph:
问题解决了。 我让模拟引脚在 LaunchPad 上保持未连接状态、出于某种原因、如果我使用3V3参考设置、所有已配置的 SOC 结果寄存器都包含一些随机值、但在使用其他两种参考设置时、它们都为零。
这很愚蠢、因为使用 adc_ex1_soc_software 示例代码、我获得了全部三种类型基准设置的随机 SOC 值、因此我认为我的代码存在问题。
感谢您的帮助!
此致、
Szabolcs