最近使用了基于hx711的电子秤进行小实验,我是直接从淘宝上买的现成的模块。从卖家那里得到的程序,发现根本不能直接用,我前后买了两个,发现不同的传感器使用的参数的不一样的。网上买的现成的测量模块主要由双桥组成的应变片和hx711 24位A/D转换器组成,基本的思路是:通过电桥不稳定,输出不同的电压,得到不同的重量。也就是说,对于整个模块来说,1克的重量对应1个A/D输出。由此我发现,不同的模块,A/D输出是不一样的。我也参考了了很多网上有关程序的分析,发现都是理论分析,但是一用到实物中根本不太合适。因此,我通过写这一个小帖子,用一点小技巧更快对基于hx711电子秤的实现。
首先,必须记住一点:实际重量与hx711输出值成正比。那么首先写一个程序子程序实现不同重量下A/D输出的具体值,我做实验是采用的是不放东西上去时记下当前A/D的输出值x1,接着放一个标准重量为y1克的物体,记下当前A/D输出值x2。接着就可以粗略计算出重量与A/D输出值的线性关系,即:G=(d-x1)/(x2-x1/y1)。其中(G为实际的重量,单位为克,d为hx711的输出值)。那么再写一个程序,根据重量与A/D输出值的线性关系,只要根据hx711实际输出值就可以知道物体实际的重量。另外,如果还有一点误差,根据实际情况,调整x1会得到更好的效果。
这是我最近做小项目时用到的一点点小技巧,可能存在一些不合理的地方,请大家多多包涵。具体实现代码,看附件的文本的文档。
单片机源程序如下:
- #include "HX711.h"
- #include "HX711.h"
- #include “reg52.h”
- sbit HX711_DOUT=P3^1;
- sbit HX711_SCK=P3^0;
- //****************************************************
- //延时函数
- //****************************************************
- void Delay__hx711_us(void)
- {
- _nop_();
- _nop_();
- }
- //****************************************************
- //读取HX711
- //****************************************************
- //返回值为实际重量
- int get_Weight(void) //增益128
- {
- long count;
- unsigned char i;
- float weight=0;
- HX711_DOUT=1;
- Delay__hx711_us();
- HX711_SCK=0;
- count=0;
- // while(HX711_DOUT);
- for(i=0;i<24;i++)
- {
- HX711_SCK=1;
- count=count<<1;
- HX711_SCK=0;
- if(HX711_DOUT)
- count++;
- }
- HX711_SCK=1;
- Delay__hx711_us();
- HX711_SCK=0;
- weight=((long)(count-47625))/129; //式子中的参数根据实际测试参数进行调整,获取方法参照另外一个文档。count对应帖子中的d,47625对应x1,129对应(x2-x1/y1)。参数不合 //适时一般通过调整x1,可以完成微调。
- return(weight);
- }
复制代码
所有资料51hei提供下载:
基于hx711电子秤改进代码.rar
(1.16 KB, 下载次数: 49)
|