步骤 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输出值也为1
count++;
}
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 加上端口初始化(可配置 推挽输出)标签:表格,Weight,HX711,Excel,long,传感器,DT,Shiwu From: https://www.cnblogs.com/FBsharl/p/18411201