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.

[参考译文] ADS1231:输出代码问题

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1001932/ads1231-problem-with-output-codes

器件型号:ADS1231
主题中讨论的其他器件: MSP430F5529

您好!

我在 ADS1231的输出代码方面遇到了一些问题。 根据 ADS1231的数据表中的表3、当量程上没有权重时、我应该会收到0x00的代码。 随着重量的增加、代码也应相应增加。 但是、根据我获得的结果(见下文)、 输出代码不能按预期工作。 用户指定的校准重量为216克、我手动输入到代码中。 从结果中可以看到、一旦此权重被添加到刻度上、输出代码只会从零代码变为校准代码时改变0x14。 ~、每个输出代码之间的步进分辨率相当大(因为0x14 = 20、216/20 μ s =每步进10克)、导致体重秤不精确。 当我向刻度添加更多重量时、代码开始按预期增加、直到达到大约500克的阈值。 但是、一旦达到此权重、代码将减少相对较大的量(由于输出代码现在小于零代码、因此权重变为负值)、尽管它应随着权重的增加而不断增加。 在刻度上施加足够的力时、代码再次开始增加。

为了总结我的问题、我如何访问更广泛的 ADC 输出代码、以便每个数字输出之间的分辨率更精确? 它是否与重量计平台/称重传感器的灵敏度有关? 此外、为什么输出代码在达到特定阈值时开始减小、即使它们应随着重量的增加而持续增加? 最后、为什么零代码不是0x00?

我已经附加了轮询代码以及校准过程。 我们非常感谢您的任何帮助。

 if ((P1IN & 0x08) == 0)
        {
            while (!(UCB0IFG & UCTXIFG));
            UCB0TXBUF = 0x21;
            while (!UCRXIFG);              // if RX operation is not complete
            data1_z = UCB0RXBUF;

            while (!(UCB0IFG & UCTXIFG));
            UCB0TXBUF = 0x22;
            while (!UCRXIFG);
            data2_z = UCB0RXBUF;

            while (!(UCB0IFG & UCTXIFG));
            UCB0TXBUF = 0x23;
            while (!UCRXIFG);
            data3_z = UCB0RXBUF;

            while(!(UCB0IFG & UCTXIFG));
            UCB0TXBUF = 0x24;

            code_z = (data1_z << 16) + (data2_z << 8) + data3_z + 0x800000;
            code_z &= 0x00ffffff;
            printf("The zero code is %lx\n", code_z);
        }
m = weight_c / (code_c - code_z);
weight_z = -1 * m * code_z;
weight = (m * code) + weight_z;

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

    Yamen、您好!

    使用的校准重量似乎非常接近0值、这使得校准斜率很难计算。  通常、您需要在接近称重传感器最大重量的称重器上放置一个重量。

    我个人不会尝试将数据从二进制补码转换为单极格式、因为最终会引起混淆  因此、为了弄清楚可能发生的情况、我需要了解更多详细信息。  

    • ADS1231 AVDD 和基准电压是多少?
    • 以 mV/V 为单位的称重传感器的灵敏度是多少?  
    • 为了达到满量程输出、可对称重传感器施加的最大重量是多少?  
    • 您可以共享原理图吗?

    获得这些信息后、我们可以研究如何实现预期结果。

    此致、

    Bob B

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

    尊敬的 Bob:

    我将使用4个加载单元的配置。 它们的输出灵敏度均为1mV/V、每种传感器均可支持40-50千克。

    VREFP、AVDD 和电桥的激励电压共享+5V 直流电压(我认为这可能是问题)、并且 VREFN 接地。 原理图如下所示。 ADS1231连接到 MSP430F5529微控制器。 感谢你的帮助。

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

    Yamen、您好!

    您能否更详细地解释负载单元如何连接在一起(形成电桥或并联)?  此外、您使用的是哪种类型的称重传感器?  它们是3线、4线或6线负载单元?

    假设您有一个灵敏度为1mV/V 的50kg 负载单元、并以5V 电压激励该负载单元。  针对满量程读数、5V 时的称重传感器输出将为5mV。  ADS1231的满量程范围为+/- 19.5mV。  因此、5mV 输出将仅使用大约1/8的满量程范围或1/8的可用代码。  可用代码总数将取决于 ADS1231在无噪声运行条件下的最佳情况分辨率。  这将取决于使用的数据速率。  在10sps 时、分辨率为17.4位、在80sps 时、对于5V 激励/基准、分辨率为15.9。  为50千克称重传感器校准216g 就像校准噪声一样。  您的校准重量应接近50kg、以获得针对刻度斜率的良好校准值、否则噪声将是一个重要因素。

    您需要确保在进行这些大型计算时、不会出现数字溢出问题、尤其是浮点计算。  您可能需要使用双精度数而不是整数。

    模拟工程师计算 器现在在数据转换器下拉菜单下有一个桥式传感器部分。  这可能有助于您确定最佳情况下可用的分辨率。

    此致、

    Bob B

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

    尊敬的 Bob:

    称重传感器各有3根导线、并连接以形成全桥。 如果5V 激励源在10SPS 时的分辨率为17.4位、这是否意味着假设使用满量程范围、最高有效6.6位不会改变?   使用全桥配置时、满量程称重传感器输出是否会增加到20mV?

    我尝试将校准重量设置为52千克、考虑到配置的最大容量为200千克(4个负载单元* 50千克)、但输出代码的最高有效字节仍然不变。

    唯一的整数值是 ADC 输出的代码、因为它们是数字信号、否则不能按位移位。 校准计算期间使用的所有其他变量都是双精度值。

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

    Yamen、您好!

    我认为最好将输出保持为二进制补码。  将 code_z 设为有符号整数、当合并3个数据字节时、其作用类似于:

    code_z =(data1_z << 16)+(data2_z << 8)+ data3_z;

    code_z = code_z << 8;

    code_z = code_z >> 8; //这将获取24位值并将负位符号扩展到32位整数

    遗憾的是、负载单元的输出不会增加。  称重器的最大输出为200kg、但灵敏度将保持在1mV/V  至于刻度输出、如果您有一个能够测量电桥输出的良好仪表、则应该看到52kg 负载的电压大约为1.5mV。  这大约是 ADS1231的0x09D495。  如果您在电桥输出端遇到不同的情况、则可能是电桥接线不正确。

    至于无噪声位、17.4位是 ADC 在5V 激励/基准电压下针对10sps 数据输出速率所能达到的最佳性能。  这意味着在 ADC 的满量程范围内、您可能会看到172950代码。  但这是假设满量程范围。  最大刻度输出大约为满刻度范围的1/8、这将测量范围内的代码数量减少至21619。  200kg/21619代码的最终分辨率约为10g。

    此致、

    Bob B

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

    尊敬的 Bob:

    当 我将输出保持为二进制补码时、无论电桥输出的极性如何、ADS1231的代码始终为负。 使用52千克作为校准质量时、将校准负载放置在刻度上时、输出代码几乎没有变化、如下面的结果所示。

    我在该线程的原始帖子中共享的数据具有更大的代码范围、但仍然不足以满足预期的分辨率(0x7f096e - 0x7f0561 = 0x40D = 1037个代码)。

    位于称重传感器上的平台是否会影响结果? 将 校准负载放置在金属平台上时、我的代码没有发生任何变化、但我通过更换材料获得了以下结果。

    下面是我的称重传感器配置的图像:

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

    Yamen、您好!

    电桥似乎已正确连接在一起、但它会在连接到 ADC 和激励时对使用哪些引线产生影响。  您在每次连接 EXC+、EXC-、SIG+和 SIG--时使用哪种颜色线?

    平台重量会有所不同、但材料类型不应。

    此致、

    Bob B

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

    尊敬的 Bob:

    蓝色-> EXC+

    绿色-> SIG -

    灰色-> EXC-

    白色-> SIG+

    平台重量是否会影响称重器的灵敏度、或者只是校准偏移时必须考虑的额外质量?

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

    Yamen、您好!

    提供的这些连接也将是我的连接方式。  根本不清楚您的代码是负的原因。  我将验证所有连接处相对于 GND 的电压。  蓝色导线应为5V、灰色导线为0V、其余导线应为激励电压(2.5V)的1/2。   

    接下来、使用不带平台的外部电压表检查从 SIG+到 SIG-的电压。  这应该非常接近0V。  接下来、将平台放置在称重传感器上、然后再次测量电压。  电压应该略有增加。  根据您的仪表、它可能不足以测量。  将52千克的重量放在平台上、然后使用外部仪表再次测量。  您现在应该会看到大约1.2mV 的可测量值。  让我知道您在这些测量中看到的每个值。

    至于增加的平台重量、这将降低称重器的总容量、但不会降低灵敏度。  假设平台重量为1千克、则最大称重重量为200千克- 1千克或199千克。

    此致、

    Bob B

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

    尊敬的 Bob:

    检查四根导线相对于 GND 的电压。 以下是我在测量 SIG+与 SIG-之间的电势后得到的结果:

    空载-> 0.9639mV

    平台负载-> 1.1055mV

    52千克负载-> 3.9727毫伏

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

    Yamen、您好!

    此时、ADC 出现连接问题或配置不当。  我认为 ADC 也总是可能损坏。  

    确保 ADC 上没有任何数字引脚悬空、并验证连接到微 GPIO 的每个引脚的电压。  另一个潜在问题是低侧开关的连接。  您可能需要将 EXC-直接连接到 GND、看看这是否会产生影响。

    让我知道每个 ADS1231引脚的电压、以便我知道器件是如何配置的。  我还建议查看 ADS1231中的数据、以确保在您的代码中正确读取这些数据。  使用示波器或逻辑分析仪检查 DRDY/DOUT 信号、以查看是否以选定的数据速率进行脉冲。  这表明内部时钟按预期工作。

    在桥上看到的 SIG+和 SIG-值也应在 ADC 的输入端看到。  在输入电容处对 ADC 的输入端进行测量、通常比在器件引脚上进行测量更容易。

    在读取代码中的转换数据时、请验证数据是否与 ADS1231传输的数据精确匹配。

    此致、

    Bob B

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

    尊敬的 Bob:

    我已验证示波器上的数据是否与 ADS1231传输的数据相匹配。 我还 测量了每个 ADS1231引脚的电压。 结果如下:

    DVDD ->+3.3V

    GND/CLKIN / SPEED / SW -> 0

    电容(5)-> 2.53

    电容(6)-> 2.47

    AINP -> 2.5

    AINN -> 2.5

    VREFP -> 5.02

    VREFN -> 0

    AVDD -> 5.02

    PDWN -> 3.3

    EXC-信号直接发送到 ADS1231的 SW 引脚、在任何其他地方都不会发送、如上所示。

    我尝试使用中断驱动程序而不是以前的轮询代码、并且获得 的输出代码的范围明显大于以前的范围(最高和最低输出之间的差异为0x2fff)。 但是、 对于这两个程序、即使 相应电桥的输出为~1mV、在负载单元上未加载时的输出代码也相当于大约0.15mV。 以下是我的中断代码:

    #if defined( __TI_COMPILER_VERSION__ ) || defined( __IAR_SYSTEMS_ICC__ )
    #pragma vector = PORT1_VECTOR
    __interrupt void Port_1(void)
    #elif defined(__GNUC__)
    void __attribute__ ( (interrupt(PORT1_VECTOR) ) ) Port_1 (void)
    #else
    #error Compiler not supported!
    #endif
    {
        switch ( __even_in_range( P1IV, P1IV_P1IFG7 ))
        {
            case P1IV_P1IFG1:
                ready_for_cal = true;                                   // set ready for calibration flag
                P1IFG &= ~BIT1;                                         // clear interrupt flag
                break;
    
            case P1IV_P1IFG3:
                while (!(UCB0IFG & UCTXIFG));
                UCB0TXBUF = 0x21;
                while (!UCRXIFG);              // if RX operation is not complete
                data1 = UCB0RXBUF;
    
                while (!(UCB0IFG & UCTXIFG));
                UCB0TXBUF = 0x22;
                while (!UCRXIFG);
                data2 = UCB0RXBUF;
    
                while (!(UCB0IFG & UCTXIFG));
                UCB0TXBUF = 0x23;
                while (!UCRXIFG);
                data3 = UCB0RXBUF;
    
                while (!(UCB0IFG & UCTXIFG));
                UCB0TXBUF = 0x24;
    
                code = (data1 << 16) + (data2 << 8) + data3;
                printf("The code is %lx\n", code);
    
                P1IFG &= ~BIT3;                                        // clear interrupt flag
                break;
    
            default:
                break;
        }
    }