您好!
我遇到了将 Adcvalue 转换为 ads1231中的权重的问题。 请帮助我解决这个问题
谢谢、此致
Navin Chakravarthy K
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.
您好、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
不过,我亦面对其他一些问题。 我可以获得校准质量的适当重量
但是、如果我施加一些其他负载、我甚至无法获得相关输出。 请查看以下视频
在上面的视频中、我对我的设置施加了一些负载。 这是我用于校准的负载。 正确的方法。 该负载为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 帖子中的信息很有用:
对于校准、假设存储了校准值(EEPROM 或微型闪存)、以便在下电上电后可以恢复校准值、则只需执行一次此操作。
此致、
Bob B
尊敬的 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