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.

[参考译文] MSP430FR2111:使用 driverlib 时 ADC 读数不稳定

Guru**** 2387060 points
Other Parts Discussed in Thread: MSP430FR2111
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/711189/msp430fr2111-unstable-adc-readout-when-using-driverlib

器件型号:MSP430FR2111

您好!

我将在以下配置下运行一个项目:MSP430FR2111、 driverlib 2.80.0.001、CCS 8.1.0.00011、优化级别4以支持大小

我初始化 ADC:

ADC_setupSamplingTimer (ADC_base、ADC_CYCLEHOLD_1024_cycles、ADC_MULTIPLESAMPLESENABLE); 

我每1秒采样一些相当稳定的电压-我得到相当稳定的读数~540 ADC 计数。

由于电压相当稳定且输出阻抗较低(去耦电容器)、因此 I-VERT 尝试减少采样保持时间  

现在、当我使用除 ADC_CYCLEHOLD_512_cycles (甚至低至4个周期)以外的任何值对采样计时器进行初始化时、我获得大致相同的读数(~540)

但是、当我使用 ADC_CYCLEHOLD_512_CYCLES 对其进行初始化时、我会收到交替读取:415 - 670 - 415 - 670、平均值为~540 (稳定值)

由于我的代码存储器非常有限、因此我必须使用最高优化级别、这会给调试带来麻烦。 基本流程如下:

  • 每1秒-
    • 配置 ADC 对通道 2进行采样:ADC_CONFIGureMemory (ADC_base、ADCINCH_2、ADC_VREFPS_INT、ADC_VREFNEG_AVSS);
    • 启动单通道重复转换(通道2):ADC_startConversion (ADC_base、ADC_REPEATE_SINGLECHANNEL);
  • 在 ISR 内-  
    • 我将 ADC 读数汇总到全局 数组 <<我在"Memory"视图中检查这个数组
    • 我进行4次求和、然后禁用转换 ADC_DisableConversions (ADC_base、true);
    • 我对4个样本求和平均值、然后得到一个我执行操作的平均读数
    • 如果采样通道=ADCINCH_2  
      • 配置 ADC 对通道1进行采样:ADC_CONFIGureMemory (ADC_base、ADCINCH_1、ADC_VREFPS_INT、ADC_VREFNEG_AVSS);
      • 启动单通道重复转换(通道1):ADC_startConversion (ADC_base、ADC_REPEATE_SINGLECHANNEL);
  • 1秒后重复


这种超级尴尬行为的原因是什么? 这是优化问题吗? 为什么仅适用于 ADC_CYCLEHOLD_512_cycles???

请提供任何指示。

谢谢

#pragma vector=ADC_vector
__interrupt void ADC_ISR (void)
{
static uint8_t avgCycle = AVG_factor;// 4
uint8_t source;

switch (_even_in_range (ADCIV、12))){
情况0:中断;//无中断
情况2:中断;//转换结果溢出
情况4:中断;//转换时间溢出
案例6:中断;//ADCHI
案例8:中断;//ADCLO
案例10:中断;//ADCIN
情况12://ADCIFG0

//通过读取内存缓冲
区源= ADCMCTL0 & ADCINCH;
Measurement[source]+= ADC_getResults (ADC_base);// Gloabl 自动清除 ADCIFG0。 已在内存窗口
avgCycle 中检查-;

if (avgCycle = 0){// avgCycle = 0 && source = 0。 采样序列结束
ADC_DisableInterrupt (ADC_base、ADC_completed_interrupt);
ADC_DisableConversions (ADC_base、true);
avgCycle = AVG_factor;
测量[来源]/= AVG_FACTOR;
//......

if (source =ADCINCH_2){
ADC_configureMemory (ADC_base、ADCINCH_1、ADC_VREFPOS_INT、ADC_VREFNEG_AVSS);
ADC_enableInterrupt (ADC_base、ADC_completed_interrupt);
ADC_startConversion (ADC_base、ADC_REPEARD_SINGLECHANNEL);
}
}//如果 avgCycle =0
break;// case 12
} //开关__even_in_range ()
LPM3_exit;// ISR 内部退出 LPM3
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Eyalasko、

    有趣的发现、让我们深入探究一下这个问题。 您提到您尝试了其他采样保持时间、一直到4个 ADC 时钟。 您是否还尝试过大于512 (768和1024)的设置? 这些结果是否始终稳定? 一旦您超过了短时间、我不会指望 S/H 时序会对转换结果产生重大影响、因为您正在测量直流信号。 我将让 DriverLib 源检查正在清除和设置的位。

    此致、
    Walter
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗨、Walter、

    感谢您的快速响应。

    我可能跳过了一些值、但我至少检查了1024、768、512 (有问题)、256、64、 16、4。 除512外、所有器块都提供相同的读数(与在存储器视图中的全局阵列测量[2]中检查的读数相同)
    奇怪的是、我对4个样本进行平均值计算(对于每个通道:2和1)、但我仍然看到通道2上的一致平均结果为415-670-415-670 (内存视图中的全局 var 测量[2])。
    我无法判断通道1结果的行为是否与其电压不是那么稳定...

    但斯克语。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    调用 adc_disableConversions with (preemp=true)会设置 CONSEQ=0、然后设置 ENC=0。 这将停止当前的转换、但如果已经完成、IFG0可能仍会被置位。 (或者甚至可能还没有完成--用户指南 SLAU445H sec.21.2.7.6有用地说"结果不可预测"。) 我从未尝试过、因此我不知道。 同样、我建议您添加:

    > ADC_clearInterrupt (ADC_base、ADC_completed_interrupt);

    启用中断调用之前。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Eyalasko、

    现在、我怀疑您遇到的问题与特定的时序方案有关、该方案会影响 ISR 在选择512作为周期计数时执行转换序列的方式。

    在讨论之前、我在我的一侧也使用了类似的硬件配置运行了一些测试(见下文)。  在本例中、我有一个弱分压器将1/2 VCC 设置为 ADC 输入电压、并以 AVCC/AVSS 为基准。  因此、我希望测量中会有一些噪声、但我想看看不同采样窗口之间的一致性是什么样的。

    我没有看到不同采样窗口的结果有任何重大差异。

    仔细观察您的错误样本、我在数学上发现了一些有趣的东西。  您提到、当问题发生时、结果约为415或670。  有趣的是、如果您采用的是典型值540的/4平均值、则如果您仅集成3个样本、但除以4、则应得到值405。  同样、如果将5个值除以4、则预期值为675。  您的应用程序似乎也会将其显示为交替(415-670/415-670)。  对我来说、这强烈建议 ISR 时序问题、在某种情况下、您只在一个情况下集成 x3样本、然后在下一个情况下集成 x5样本(x3、x5、x3、x5、x3)、 与 x4、x4、x4、x4、x4相比、随时间的推移、它始终保持一致。  这确实使我认为这是一个数字/固件/定序问题、而不是模拟测量问题。  快速检查这一点的一种方法是禁用平均算法并使用512个脉冲运行转换并记录它们、然后查看问题是否消失。

    我将深入研究您的 ISR 定序、以了解是否存在可能导致这种情况的特定操作顺序。  512周期设置可能只是使特定的时序方案发生、从而破坏了当前布局的逻辑。

    此致、
    Walter

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Walter、  

    感谢您的全面跟进。

    我担心重现问题会有点棘手。 它确实看起来是一个非常微妙的时间问题、不一致地发生。

    在我最初发布该问题的另一天、这种情况始终如一。

    稍后的试验没有显示这种现象、我将再次尝试复制它、然后按照您的建议对平均值进行调制。

    再次感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    明白了、Eyalasko。 我现在要关闭这个线程。 请随时回复或再次发布、并参考此主题进行进一步讨论。

    此致、
    Walter