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.

[参考译文] MSP430F5659:ADC 计数值问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/650272/msp430f5659-adc-count-value-issue

器件型号:MSP430F5659
主题中讨论的其他器件: TIDA-00648

您好!

我 使用 MSP430f5659微控制器连接4-20mA 液位传感器。 我使用多通道读取 ADC 代码示例、例如 msp430f665x_adc_06.c. 当传感器处于固定高度时、它应该显示一个固定计数值、但它显示了一个值范围(例如、对于固定值、为804-824)。 我将基准电压用作 AVCC 和 AVSS,即3.3V 和 GND。 请建议一些解决方案来计算变体问题。

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

    确保在 Vcore 上有一个470nF 电容器、在每个 AVCC 引脚上有一个10uF + 100nF 去耦电容器。 另请注意数据表中使用 AVCC 作为基准电压的12位 ADC 线性参数。

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

    您好、Ryan、

    感谢您的回答。

    但我无法获得稳定的 ADC 计数值、正如我在数据表中研究过的那样。 我已经尝试将 AVCC 和 AVSS 配置为基准电压、并将内部 Vref 配置为基准电压。

    我在3个通道上使用 ADC 值。 目前我正在检查 P6.2引脚上的计数值。

     我的代码如下所示:使用 ref 作为内部 Vref

        P6DIR &=~(BIT0 + BIT1 + BIT2);
        P6SEL |= BIT0 + BIT1 + BIT2;                  //启用 A/D 通道输入 P6.0、p6.1、p6.2
        ADC12CTL0 &=~ADC12ENC;
        REFCTL0 &=~REFMSTR;                     //重置 REFMSTR 以将控制权交给
                                                  // ADC12_A 参考控制寄存器
        ADC12CTL0 = ADC12ON|ADC12SHT03|ADC12REFON|ADC12REF2_5V| ADC12MSC;
                                                  //打开 ADC12、采样时间
                                                  //在基准发生器上并设置为
                                                  // 2.5V
        ADC12CTL1 = ADC12SHP|ADC12CONSEQ_1_ADC12DIV_1;            //使用采样计时器、单序列
        ADC12CTL2 = ADC12RES_2 |ADC12REFOUT;                            //ADC12_A 分辨率12位
        ADC12MCTL0 = ADC12INCH_0 |ADC12SREF_1;                            // ref+=AVcc、channel = A0、VR+=Vref+和 VR-=AVss
        ADC12MCTL1 = ADC12INCH_1 |ADC12SREF_1;                            // ref+=AVcc、channel = A1、VR+=Vref+和 VR-=AVss
        ADC12MCTL2 = ADC12INCH_2 |ADC12EOS | ADC12SREF_1;               // ref+=AVcc、channel = A2、
        ADC12CTL0 |= ADC12ENC;

    使用 AVCC 作为基准电压:

        P6DIR &=~(BIT0 + BIT1 + BIT2);
        P6SEL |= BIT0 + BIT1 + BIT2;                  //启用 A/D 通道输入 P6.0、p6.1、p6.2
        ADC12CTL0 &=~ADC12ENC;
        ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_3;   //打开 ADC12、延长采样时间
                                                     //为了避免结果溢出、16个 ADC12CLK 周期
        ADC12CTL1 = ADC12SHP+ADC12CONSEQ_1_ADC12DIV_1;         //使用采样计时器、单序列
        ADC12CTL2 = ADC12RES_2;                   //ADC12_A 分辨率12位
        ADC12MCTL0 = ADC12INCH_0;                     // ref+=AVcc、channel = A0
        ADC12MCTL1 = ADC12INCH_1;                      // ref+=AVcc、channel = A1
        ADC12MCTL2 = ADC12INCH_2+ADC12EOS;                // ref+=AVcc、channel = A2
        ADC12CTL0 |= ADC12ENC;

    我不知道完成转换需要多少个时钟周期、因此我尝试了多达32个时钟周期。

    代码中是否有任何错误? 请建议一些解决方案。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我使用了所有这些电容器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    但它没有解决我的问题。 我尝试使用 AVCC 作为基准电压、使用内部电压2.5电压作为基准电压。 但它并不能很好地工作。 计数值之间的差异仍然很大。
    我的代码如下所示:电压 AVCC 作为参考

    P6DIR &=~(BIT0 + BIT1 + BIT2);
    P6SEL |= BIT0 + BIT1 + BIT2; //启用 A/D 通道输入 P6.0、p6.1、p6.2
    ADC12CTL0 &=~ADC12ENC;
    ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_15;//打开 ADC12、延长采样时间
    //为了避免结果溢出、16个 ADC12CLK 周期
    ADC12CTL1 = ADC12SHP+ADC12CONSEQ_1_ADC12DIV_1;//使用采样计时器、单序列
    ADC12CTL2 = ADC12RES_2+ADC12SR;//ADC12_A 分辨率12位
    ADC12MCTL0 = ADC12INCH_0;// ref+=AVcc、channel = A0
    ADC12MCTL1 = ADC12INCH_1;// ref+=AVcc、channel = A1
    ADC12MCTL2 = ADC12INCH_2+ADC12EOS; // ref+=AVcc、channel = A2
    ADC12CTL0 |= ADC12ENC;

    内部电压2.5V 作为基准:

    P6DIR &=~(BIT0 + BIT1 + BIT2);
    P6SEL |= BIT0 + BIT1 + BIT2; //启用 A/D 通道输入 P6.0、p6.1、p6.2
    ADC12CTL0 &=~ADC12ENC;
    REFCTL0 &=~REFMSTR; //将 REFMSTR 重置为将控制权移交给
    // ADC12_A 参考控制寄存器
    ADC12CTL0 = ADC12ON|ADC12SHT03|ADC12REFON|ADC12REF2_5V| ADC12MSC;
    //打开 ADC12、采样时间
    //在基准发生器上并设置为
    // 2.5V
    ADC12CTL1 = ADC12SHP|ADC12CONSEQ_1;//使用采样计时器、单序列
    ADC12CTL2 = ADC12RES_2 |ADC12REFOUT;//ADC12_A 分辨率12位
    ADC12CTL2 = ADC12RES_2 |ADC12SR;//ADC12_A 分辨率12位
    ADC12MCTL0 = ADC12INCH_0 |ADC12SREF_1;// ref+=AVcc、channel = A0、VR+=Vref+和 VR-=AVss
    ADC12MCTL1 = ADC12INCH_1 |ADC12SREF_1;// ref+=AVcc、channel = A1、VR+=Vref+和 VR-=AVss
    ADC12MCTL2 = ADC12INCH_2 |ADC12EOS | ADC12SREF_1; // ref+=AVcc、channel = A2、
    ADC12CTL0 |= ADC12ENC;

    请帮助我找到问题的解决方案。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我看不到代码有什么特别错误的地方。 此处仍可能存在硬件问题(您应该有延迟才能启动参考)。 您是否可以共享原理图? 尝试运行示例 msp430f665x_adc_[02、09].c、并查看这些示例是否会导致相同的差异。 如果可能、增加采样保持时间。 如果仍未获得所需结果、您可能需要获取多个样本的平均值。

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

    您好、Ryan、

    很抱歉、我无法分享原理图、但我使用165欧姆的串联电阻将4-20mA 电流转换 为最高3.3V 的电压。 该电压直接提供给微控制器的 P6.2引脚。

    我已经检查 了从传感器接收到的电流以及转换后进入微控制器的电压。 电流和转换器电压固定在一定的高度。

    我看不到电路有什么问题、那么我的计数值为什么会变化。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否在 ADC 工作时测量了输入引脚的电压变化? 您可能需要一个电压跟随器或其他外部电路来避免阻抗不匹配以及其他可能的问题。 您是否提到过 SLAY030、TIDA-00648或 TIDA-0095? e2e.ti.com/.../279996

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

    您好、Ryan、

    我已经检查了控制器 ADC 引脚上的电压读数、它没有波动。 我还在 MCU 之前尝试过电压跟随器电路。  

    我没有得到稳定的值,我可以使用什么其他选项来获得稳定的值。  

    是否存在软件问题?

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

    我看不到任何软件问题、但您可以评估 TI 代码示例、看看这些示例是否会产生类似的电压增量。 您是否使用了 TLV 中的 ADC12/REF 校准参考值? 什么基准设置更好、VCC 或2.5V 内部 Vref?

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

    您好!

    我已经在三个不同的硬件上尝试过与 ADC 相关的所有代码。 我已经对2000个值进行了平均计算,但计数偏差仍然存在,并且非常大(有时为4,有时为18)是否有任何推荐用于 ADC 的电路?

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

    建议在每个 VCC 引脚上使用10uF + 100nF 电容器、如果使用外部基准、则在 VREF 上使用相同的电容。 您可能需要更高分辨率的外设、例如 MSP430I20xx/MSP430F67xx 器件上的 SD24、以实现所需的精度。

    www.ti.com/.../slaa694a.pdf
    www.ti.com/.../TIDM-SERVER-PWR-MON

    此致、
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为您的问题与硬件有关。 噪声是您永远无法完全消除的。 它只是物理现实世界的一部分。 您应该考虑的是可接受的噪声水平。 确定该电平后、您需要查看电路中的所有噪声产生因素。 一旦确定了滤波器、您就可以设计滤波器(甚至修改 SNR)以获得更好的读数。
    提示:这不仅仅涉及在 MCU 的 ADC 输入端添加电容器。