HX711 的数值换算:以Excel表格为工具

news/2025/1/15 14:45:41/文章来源:https://www.cnblogs.com/FBsharl/p/18411201

步骤 0 :获取已知数据

首先,需要得到几个已知条件:

1. 首先是HX711电路的两个电阻的阻值 R1, R2:目的是算出激励电压。

2. 然后是你手上拉力传感器的量程A(kg),拉力传感器的灵敏度(mV/V)

3. 其他HX711编程确定的参数(一般默认),如放大倍数为128倍,数值精度为24位。

下面以

  • HX711电路R1=15kΩ,R2=20kΩ; 
  • 500 kg量程,1.2mV/V的拉力传感器
  • 放大倍数:128倍,数值精度:24位

的已知条件进行如下计算:

 

步骤 1 :如何计算传感器激励电压

HX711 可以在产生 VAVDD 和 AGND 电压,即 711 模块上的 E+ 和 E- 电压。该电压通过 VAVDD=VBG(R1 +R2 )/R2 计算。VBG 为模块儿基准电压 1.25v,R1 = 15K ,R2 = 20K。 因此得出 VAVDD = 2.917V

(为了降低功耗,该电压只在采样时刻才有输出, 因此用万用表读取的值可能低于 4.3v ,因为万用表测量的是有效值。 )

 

步骤 2 :如何计算 AD 输出最大值

在 2.917 V 的供电电压下 500Kg 的传感器最大输出电压是 2.917v*1.2mv/V = 3.5 mV
经过 128 倍放大后,最大电压为 3.5 mV*128 = 448mV
经过 AD 转换后输出的24bit数字值最大为:(448mV/ 2.917V ) *(2^ 24)≈2576980

(注:257万,已知uint16_t 数值最大为65535, 因此不能用16位储存该数字)

 

步骤 3 :程序中数据如何转换

程序中通过HX711_Buffer = HX711_Read(); 获取当前采样的 AD 值,最大 2147483 ,存放在 long 型变量 HX711_Buffer 中,因 long 型变量计算速率和存放空间占用资源太多,固除以100 ,缩放为 int 型,便于后续计算。

Weight_Shiwu = HX711_Buffer/100;

Weight_Shiwu 最大为 25769 。

 

步骤 4 :如何将 AD 值反向转换为重力值。

假设重力为 x Kg ( x<500Kg ) , 测量出来的 AD 值为 y

对于满量程 500Kg,单片机得到最终的数字为25769,那么对于 x kg,其对应的数字就是 (x/500)*25769 = x * 51.54

所以 y = 51.54 x

因此得出 x = (y /51.54) Kg  = (y / 51.54)*1000 g

所以得出程序中计算公式

Weight_Shiwu = (unsigned int)((float)(Weight_Shiwu/51.54)*1000+0.05); //+0.05 是为了四舍五入百分位
特别注意:
因为不同的传感器斜率特性曲线不一样,因此,每一个传感器需要矫正这里的 51.54 这个除数。当发现测出来的重量偏大时,增加该数值。如果测试出来的重量偏小时,减小改数值。因传感器线性斜率不同而定。每个传感器都要校准。如果传感器测量值偏大,则需改大该数值,若传感器测量值偏小,则需改小该数值。

 

 

参考代码:以Arduino为例

/////以下为函数声明  
extern unsigned long HX711_Read(void);
extern long Get_Weight();
///变量定义
float Weight = 0;
int HX711_SCK =2;   ///     作为输出口
int HX711_DT= 3;    ///     作为输入口
long HX711_Buffer = 0;
long Weight_Maopi = 0, Weight_Shiwu = 0;#define GapValue 405       ///该值需校准 每个传感器都有所不同void setup()
{  //初始化HX711的两个io口       
pinMode(HX711_SCK, OUTPUT);  ///SCK 为输出口 ---输出脉冲
pinMode(HX711_DT, INPUT); ///  DT为输入口  ---读取数据Serial.begin(9600);Serial.print("Welcome to use!\n");delay(3000);    ///延时3秒  //获取毛皮重量Weight_Maopi = HX711_Read(); 
}void loop()    ///  一直循环{}内容  ----- 同while(1){xxx}
{Weight = Get_Weight();  //计算放在传感器上的重物重量Serial.print(float(Weight/1000),3);  //串口显示重量,3意为保留三位小数Serial.print(" kg\n"); //显示单位Serial.print("\n");  //显示单位delay(2000);  //延时2s 两秒读取一次传感器所受压力
}//称重函数
long Get_Weight()
{HX711_Buffer = HX711_Read();    ///读取此时的传感器输出值Weight_Shiwu = HX711_Buffer;     ///将传感器的输出值储存Weight_Shiwu = Weight_Shiwu - Weight_Maopi; //获取实物的AD采样数值。Weight_Shiwu = (long)((float)Weight_Shiwu/GapValue);    //AD值转换为重量(g)return Weight_Shiwu; 
}
unsigned long HX711_Read(void) //选择芯片工作方式并进行数据读取
{unsigned long count;   ///储存输出值  unsigned char i;     ////high--高电平 1  low--低电平 0  digitalWrite(HX711_DT, HIGH);   ////  digitalWrite作用: DT=1;delayMicroseconds(1); ////延时 1微秒  digitalWrite(HX711_SCK, LOW);  ////  digitalWrite作用: SCK=0;delayMicroseconds(1);   ////延时 1微秒  count=0; while(digitalRead(HX711_DT));    //当DT的值为1时,开始ad转换for(i=0;i<24;i++)   ///24个脉冲,对应读取24位数值{ digitalWrite(HX711_SCK, HIGH);  ////  digitalWrite作用: SCK=0;/// 利用 SCK从0--1 ,发送一次脉冲,读取数值delayMicroseconds(1);  ////延时 1微秒  count=count<<1;    ///用于移位存储24位二进制数值digitalWrite(HX711_SCK, LOW);   //// digitalWrite作用: SCK=0;为下次脉冲做准备delayMicroseconds(1);if(digitalRead(HX711_DT))    ///若DT值为1,对应count输出值也为1count++; } digitalWrite(HX711_SCK, HIGH);    ///再来一次上升沿 选择工作方式  128增益count ^= 0x800000;   //按位异或  不同则为1   0^0=0; 1^0=1;
///对应二进制  1000 0000 0000 0000 0000 0000  作用为将最高位取反,其他位保留原值delayMicroseconds(1);digitalWrite(HX711_SCK, LOW);      /// SCK=0;     delayMicroseconds(1);  ////延时 1微秒  return(count);     ///返回传感器读取值
}

对于51、stm32等单片机的程序,只需做出简单修改就可。

如主要为 修改延时函数 ,端口高低电平。 stm32 加上端口初始化(可配置 推挽输出)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/796243.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dc-4

靶机下载地址:dc-4 找靶机 nmap -sV 192.168.6.0/24查看一下端口服务很明显就只是一个简单的登录框 我们爆破一下 最终得到用户名:admin 密码:happy 进去看看怎么个事很明显是一个选择既定的命令进行命令执行 我们可以抓包然后即可使用我们自己设计的命令直接拿shell然后再实现…

java方法:什么是方法?

java方法是语句的集合,它们在一起执行一个功能:方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 例如:即 ______()是方法 设计方法的原则:方法的本意时功能块,就是实现某个功能块,就是实现某个功能的语句块的集合,所以…

pediatrics_llm_qa:儿科问诊小模型

项目简介 本项目开源了基于儿科医疗指令微调的问诊模型:pediatrics_llm_qa(GitHub - jiangnanboy/pediatrics_llm_qa),目前模型的主要功能如下:智能问诊:问诊后给出诊断结果和建议。更新[2024/09/11] 开源了基于Qwen2-1.5B-instruct lora指令微调的儿科问诊模型开源模型模型…

WPF 已知问题 包含 NaN 的 Geometry 几何可能导致渲染层抛出 UCEERR_RENDERTHREADFAILURE 异常

本文记录一个 WPF 已知问题,当传入到渲染的 Geometry 几何里面包含了 NaN 数值,将可能让应用程序收到从渲染层抛上来的 UCEERR_RENDERTHREADFAILURE 异常,且此异常缺乏必要信息,比较难定位到具体错误逻辑此问题是小伙伴报告给我的,详细请看 https://github.com/dotnet/wpf…

WPF 尝试使用 WinML 做一个简单的手写数字识别应用

最近我看了微软的 AI 训练营之后,似乎有点了解 Windows Machine Learning 和 DirectML 的概念,于是我尝试实践一下,用 WPF 写一个简单的触摸手写输入的画板,再使用大佬训练好的 mnist.onnx 模型,对接 WinML 实现一个简单的手写数字识别应用最近我看了微软的 AI 训练营之后…

VisualStudio 2022 找不到内存 反汇编 寄存器调试工具

本文将告诉大家如何解决在 VisualStudio 2022 的 调试-窗口 里面找不到内存、 反汇编、 寄存器这三个调试工具的问题找不到的原因是没有启用地址级调试 只需要在“工具”(或“调试”)>“选项”>“调试”中选择“启用地址级调试” 然后进行调试即可看到开启之后,即可在…

【TS】TypeScript基础详解【一】

Javascript 类型缺陷 类型引发的问题 在编程开发中,有一个共识:错误越早发现,就越容易解决。 例如:能在代码编写时发现错误,就不要等到代码编译时才发现(这也是IDE的优势之一)。 能在代码编译时发现错误,就不要在代码运行时才发现(类型检测可以帮助我们在这 方面做得很好…

【OpenFeign 】OpenFeign 的常用配置

1 前言 上节我们看了下 OpenFeign 里的重试,在从源码的角度看它的执行原理的时候,又意外的遇到了一个【OpenFeign 】OpenFeign 下未开启重试,服务却被调用了两次 的问题的分析,后面我们又看了重试器的入场和执行时机,那么本节我们看看 OpenFeign 的一些常用配置,以及全局…

Splay 浅谈

Splay 树 定义 Splay 树是一个二叉平衡搜索树,它可以通过 Splay 操作 将一个结点旋转至根结点或者一个给定的结点的下一层,使得整棵树仍然满足二叉搜索树的性质。 Splay 树可以在均摊 \(O(\log n)\) 的时间内完成查找、插入、查询、删除等操作。二叉搜索树的定义:空树是一个…

从kmp到AC自动机

知道kmp的请跳过这一段 找到最清晰的解析 kmp 我看了约114514个解析才搞懂 如何求next 首先,next[i]本应表示0~i的字符串的最长相同前缀后缀的长度。 不过为了方便匹配,实际可以存最长相同前缀后缀时前缀最后一个的地址 听起来好绕 那这么说吧: 例如串 abaabaabaab next[0]=…

LinkedHashMap原理详解—从LRU缓存机制说起

写在前面 从一道Leetcode题目说起 首先,来看一下Leetcode里面的一道经典题目:146.LRU缓存机制,题目描述如下:请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类:LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 in…

微积分快速入门1部分:直觉

1 一分钟微积分:X射线和延时视觉 我们通常只看到图形、公式和情况的表面价值。微积分为我们提供了两种深入挖掘的超能力:X射线能看到图案中隐藏的部分。你不仅能看到树,还能知道它是由年轮组成的,在我们说话的同时,另一个年轮也在生长。延时视觉你能看到物体未来的运行轨迹…