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:ADS1231接口

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1033680/ads1231-ads1231-interface

器件型号:ADS1231

您好!

 我遇到了将 Adcvalue 转换为 ads1231中的权重的问题。 请帮助我解决这个问题

谢谢、此致

Navin Chakravarthy K

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

    您好、Navin、

    ADC 输出代码与基准电压直接相关、而不是与负载单元相连。  根据负载单元对指定最大负载单元测量电压的敏感度(以 mV/V 激励表示)、负载单元将输出非常小的电压。  

    例如、假设称重传感器的灵敏度为2mV/V、并使用5V 激励/基准电压。  如果称重器在满量程时输出的最大值为10kg、则在应用10kg 时最大输出电压将为10mV (5V*2mV/V)。  5kg 重量会输出5mV、1kg 会输出1mV 等。  这将根据数据表中显示的1个代码(LSB)的值((0.5VREF/128)(2^23–1))为您提供 ADC 结果的粗略值。

    为了使刻度更准确、您需要使用相对于所用系统的2点斜率方法进行校准。  首先、您将捕获未应用权重的代码、然后应用校准权重并捕获应用权重的结果代码。  要转换的公式将使用以下公式:

    此致、

    Bob B

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

    尊敬的 Bob:

    谢谢您的回答、我有一些疑问要澄清。

     我的称重传感器灵敏度为1mV/v、励磁/Vref 为3.3V。 那么、我的满量程输出为12kg

    1) 1)如何获取净重?

    2) 2) 对于每一个代码、它会增加 1g。 为什么会发生这种情况、如何控制它?

    3) 3)我无法获取静态值。 输出值保持波动。 如何解决?

    4)以及如果我更改负载在负载单元表面的放置。 输出值变化很大、也不会经常变化。 我还需要帮助来纠正这个问题。

    谢谢、此致

    Navin Chakravarthy K

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

    您好、Navin、

    因此、在施加12kg 的重量下、称重传感器的最大输出为3.3mV (3.3V * 1mV/V)。  1G 的重量为3.3mV/12000或275nV、但 ADS1231的固有噪声(PGA、调制器等)为232nV、峰峰值噪声。  因此、不清楚您对解决方案的期望是什么。  我建议您查看 数据转换器部分和桥式传感器+ ADC 下的模拟工程师计算器。  我在下面展示了计算器结果。

    输入的数据显示、对于12kg 的称重传感器、我可能实现1g 的分辨率。  但是、如果我尝试实现0.5g 的比例分辨率、ADC 噪声是一个限制因素:

    这仅适用于 ADC 本身。  接线中拾取的任何外部噪声(如 EMI/RFI)都会影响结果。  因此、ADC 分辨率存在差异、其中1个代码的值为0.5*Vref/128 (增益)/(2^23-1)、约为1.54nV、而换算结果为最佳情况232nV。  因此、要查看无噪声结果、您需要从 ADC 结果中消除噪声位。  这可以通过多种方式实现。  一种方法是将结果右移噪声位数。  另一种方法是使用掩码将噪声位屏蔽为零。

    最后、需要调整输出代码或对噪声进行补偿、以使该值保持稳定。

    [引用 userid="489588" URL"~/support/data-converters-group/data-converters/f/data-converters-forum/1033680/ads1231-ads1231-interface/3824418 #3824418"] 1)如何获取净重?[/quot]

    在初始校准应用零重量和应用校准重量后、确定皮重。  皮重只是不应视为测量一部分的拼盘或盘所增加的重量。  因此、皮重只是一种重量测量、应从总重量中调零、并在实际所需重量测量之前进行。

    [引用 userid="489588" URL"~/support/data-converters-group/data-converters/f/data-converters-forum/1033680/ads1231-ads1231-interface/3824418 #3824418"]2) 每一个代码都会增加 1g。 为什么会发生这种情况、我如何控制它?

    我不确定您在这里的意思、但这听起来与任何模拟输入滤波的噪声或稳定有关。

    [引用 userid="489588" URL"~/support/data-converters-group/data-converters/f/data-converters-forum/1033680/ads1231-ads1231-interface/3824418 #3824418"]3)我无法获取静态值。 输出值保持波动。 如何解决?

    这与噪声直接相关、正如我之前所说的、将有必须从 ADC 结果中删除的噪声代码(或位)。

    [引用 userid="489588" URL"~/support/data-converters-group/data-converters/f/data-converters-forum/1033680/ads1231-ads1231-interface/3824418 #3824418"]4)、如果我更改了加载单元表面上的负载位置、也可以更改该负载的位置。 输出值变化很大、也不会经常变化。 我还需要帮助来纠正这个问题。

    这听起来好像您没有正确设置加载单元以使其安装在适当的表面。  称重传感器测量平坦表面的偏转和弯曲半径。  使其稳定的方法取决于所使用的称重传感器类型、并由称重传感器制造商定义如何使其成为一致的测量。  如果您给我一张您的设置图片、我可能会提供更具体的指导。

    此致、

    Bob B  

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

    尊敬的 Bob:

     再次感谢您、我的设置错误了、您说得对。 现在、我使用了新设置。 新设置没有波动问题。 我可以正确读取重量。

    现在、我的装置有一个4 x 50kg 的称重装置、满量程重量为200kg。 灵敏度为1mV/v

    不过,我亦面对其他一些问题。 我可以获得校准质量的适当重量

    但是、如果我施加一些其他负载、我甚至无法获得相关输出。 请查看以下视频  

    e2e.ti.com/.../Load-Cell.mp4

    在上面的视频中、我对我的设置施加了一些负载。 这是我用于校准的负载。 正确的方法。 该负载为20400g。但在下一步中。 我已经减轻了设置的重量。 但是、这个给出的值比上一个更高。 实际上、该负载的重量比之前的负载低。 我再次将1Kg 负载置于设置中。 但系统会给出负值

    在这里、我需要了解一些内容

    校准后(手动计算 m & Wzs)。 我在我的代码中应用了以下公式。

    Y=(0.00125*adcvalue-98.48;

    我启动代码 y 后、将以克为单位输出。

    对吗??。 如果是错误的。 以正确的方式指导我。

    另一个问题是、每次我需要计算 m & Wzs 的值或一次性计算就足够了?

    谢谢、此致

    Navin Chakravarthy K

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

    您好、Navin、

    ADS1231的输出代码是二进制补码。  这意味着从0到0x7FFFFF 的 ADC 代码是正值、0x7FFFFF 表示正满量程。  从0xFFFFFFF 到0x800000的代码为负值、0x800000为负满量程。

    我在视频中看到的是大约1600万的代码、这意味着未正确评估返回值。  由于返回的代码是24位的、因此您应该对24位值进行符号扩展、使其成为有符号32位值。  您可能会发现以下 E2E 帖子中的信息很有用:

    https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/945360/ads1234-scale-application-dealing-with-the-2-s-complement-data-with-signed-integer/3492543?tisearch=e2e-sitesearch&keymatch=sign%2525252525252520extension#3492543

    对于校准、假设存储了校准值(EEPROM 或微型闪存)、以便在下电上电后可以恢复校准值、则只需执行一次此操作。

    此致、

    Bob B

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="14483" URL"~/support/data-converters-group/data-converters/f/data-converters-forum/1033680/ads1231-ads1231-interface/3827012 #3827012"]我在视频中看到的代码约为1600万,这意味着未正确评估返回的值。

    尊敬的 Bob:

     我找不到我犯了什么错误。 我将在这里分享我的代码。 请检查并告知我更正  

    void readADS1231(void) 
    {
    adcvalue=0;  
    nrf_gpio_pin_set(POWERDOWN); //POWER ON
    while(nrf_gpio_pin_read(DATAPIN) == 1);//WAIT UNTIL DATA IS READY
    //24-->21
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X800000;} //24
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X400000;}//23
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X200000;}//22
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X100000;}//21
    //20-->17
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X80000;} //20
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X40000;}//
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X20000;}//
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X10000;}//17
    //16-->13
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X8000;} //16
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X4000;}//
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X2000;}//
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X1000;}//13
    //12-->9
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X800;} //12
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X400;}//
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X200;}//
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X100;}//9
    //8-->5
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X80;} //8
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X40;}//
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X20;}//
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X10;}//5
    //4-->1
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X8;} //4
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X4;}//
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X2;}//
    clock ();
    if(nrf_gpio_pin_read(DATAPIN)){adcvalue=adcvalue+0X1;}//1
    clock ();//TO PULL DATA READY TO HIGH STATE --PAGE No.14 ON ADS1231 DATASHEET
    //
    nrf_gpio_pin_clear(CLOCK);   
    nrf_gpio_pin_clear(POWERDOWN);
    }

    上面的循环给出了 ADS1231的 Adcvalue

    void displaydata(void)
    {
     readADS1231();
     
    
      y = (0.00125*adcvalue)-98.48;
      
      printk("Load= %.2f\n",y); 
     len = sprintf(out_string,"LOAD: %.2f g,adcvalue: %ld",y,adcvalue);
      err = bt_nus_send(NULL,&out_string, len); 
    }

    上面的环路通过使用质量公式计算得出负载的输出

    谢谢、此致

    Navin Chakravarthy K

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

    您好、Navin、

    我相信您已经将"adcvalue"设为全局变量、并且该变量应定义为有符号32位。  当24位数据的最高有效位为高电平时、该值实际上为负。  您应该能够调整您的代码、以便第24位的代码行为:

    if (nrf_GPIO_PIN_READ (DATAPIN)){adcvalue=adcvalue+0XFF800000;}//24

    将 FF 添加到32位有符号变量的最高有效字节会将该值标识为负。

    此致、

    Bob B