极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 181215|回复: 233

基于24位AD转换模块HX711的重量称量实验(已补充皮重存储,线性温度漂移修正)

  [复制链接]
发表于 2012-10-28 11:38:44 | 显示全部楼层 |阅读模式
本帖最后由 shenhaiyu 于 2012-10-29 10:44 编辑

以前在X宝上买过一个称重放大器,180+大洋。原理基本上就是把桥式拉力传感器输出的mV级信号放大到5V供单片机读取。连接实验电路的时候很完美,能实现重量的转换,但是实际组装后却发现这种A/A模块受到的干扰太严重了,包括电源的干扰,导线长短的干扰,导线位置变化的干扰,无线电的干扰等等等等……实在是恼人。

后来感觉是思路错误了,就不该用模拟信号来传输,于是决定使用A/D模块来把重量转换成数字信号传输,A/D模块就固定在离传感器最近的地方,将输出的数字信号用导线传输给单片机,这样能很大程度减小各种干扰。

在网上搜了一下A/D模块,基本上有两种廉价成品:HX711和PCF8591,它们分别是8位转换模块和24位转换模块。
PCF8591:
PCF8591.png
功能简介: 基于I2C接口的AD/DA转换模块,8位精度,四通道AD,单通道DA,电压输出型
最大特点: 1. 支持两种接口类型接入目标板:排针或排座
           2. 支持I2C总线级联(通过排针、排座对接的方法,可同时使用多个I2C模块)
典型应用: 低速AD/DA转换
主要资源: PCF8591,I2C接口排针,I2C接口排座,可调电阻,AD输入口,DA输出口,地址跳线端口

HX711:
HX711.jpg
模块工作电压:4.8-5.5v
典型电流 1.6mA
体积:长 2.9cm * 宽 1.7cm * 高 0.4cm
● 带金属屏蔽,强抗干扰,预留MCU(STC15F104)位置,可自行升级二次开发。
● 两路可选择差分输入
● 片内低噪声可编程放大器,可选增益为32、64 和128
● 片内稳压电路可直接向外部传感器和芯片内A/D 转换器提供电源
● 片内时钟振荡器无需任何外接器件,必要时也可使用外接晶振或时钟
● 上电自动复位电路
● 简单的数字控制和串口通讯:所有控制由管脚输入,芯片内寄存器无需编程
● 可选择10Hz 或80Hz 的输出数据速率
● 同步抑制50Hz 和60Hz 的电源干扰
● 耗电量(含稳压电源电路):
典型工作电流:< 1.7mA, 断电电流:< 1μA
● 工作电压范围:2.6 ~ 5.5V
● 工作温度范围:-20 ~ +85℃
HX711n.jpg





===============================我叫分割线=================================






我要使用的拉力传感器为传统的桥式传感器,量程1kg,想要达到1g的精度,这就要求模块输出位数至少为10位(2^10=1024),8位的PCF8591无法胜任,因为它的精度只有2^8=256位。所以决定使用HX711作为我的A/D模块,而且我选的HX711模块还带屏蔽壳,正符合我的要求。


先来看一下该模块的常用接法:
1.jpg
模拟输入
通道 A 模拟差分输入可直接与桥式传感器的差分输出相接。由于桥式传感器输出的信号较小,为了充分利用A/D 转换器的输入动态范围,该通道的可编程增益较大,为128 或64。这些增益所对应的满量程差分输入电压分别±20mV 或±40mV。

通道B 为固定的32 增益,所对应的满量程差分输入电压为±80mV。通道B 应用于包括电池在内的系统参数检测。

供电电源
数字电源(DVDD)应使用与MCU 芯片相同的的数字供电电源。HX711 芯片内的稳压电路可同时向 A/D 转换器和外部传感器提供模拟电源。稳压电源的供电电压(VSUP)可与数字电源(DVDD)相同。稳压电源的输出电压值(VAVDD)由外部分压电阻R1、R2 和芯片的输出参考电压VBG 决定(图1),VAVDD=VBG(R1+R2)/R2。应选择该输出电压比稳压电源的输入电压(VSUP)低至少100mV。
如果不使用芯片内的稳压电路,管脚VSUP应连接到DVDD 或AVDD 中电压较高的一个管脚上。管脚VBG 上不需要外接电容,管脚VFB 应接地,管脚BASE 为无连接。时钟选择如果将管脚 XI 接地,HX711 将自动选择使用内部时钟振荡器,并自动关闭外部时钟输入和晶振的相关电路。这种情况下,典型输出数据速率为10Hz 或80Hz。如果需要准确的输出数据速率,可将外部输入时钟通过一个20pF 的隔直电容连接到XI管脚上,或将晶振连接到XI 和XO 管脚上。这种情况下,芯片内的时钟振荡器电路会自动关
闭,晶振时钟或外部输入时钟电路被采用。此时,若晶振频率为11.0592MHz, 输出数据速率为准确的10Hz 或80Hz。输出数据速率与晶振频率以上述关系按比例增加或减少。使用外部输入时钟时,外部时钟信号不一定需要为方波。可将MCU 芯片的晶振输出管脚上的时钟信号通过20pF 的隔直电容连接到XI管脚上,作为外部时钟输入。外部时钟输入信号的幅值可低至150mV。

串口通讯
串口通讯线由管脚PD_SCK 和DOUT 组成,用来输出数据,选择输入通道和增益。当数据输出管脚DOUT 为高电平时,表明
A/D 转换器还未准备好输出数据,此时串口时钟输入信号PD_SCK 应为低电平。当DOUT 从高电平变低电平后,PD_SCK 应输入25 至27 个不等的时钟脉冲(图二)。其中第一个时钟脉冲的上升沿将读出输出24 位数据的最高位(MSB),直至第24 个时钟脉冲完成,24 位输出数据从最高位至最低位逐位输出完成。第25至27 个时钟脉冲用来选择下一次A/D 转换的输入通道和增益,参见表三。
2.jpg
PD_SCK 脉冲数输入通道 增益

3.jpg
时序图

PD_SCK 的输入时钟脉冲数不应少于25 或多于27,否则会造成串口通讯错误。当A/D 转换器的输入通道或增益改变时,A/D 转换器需要4 个数据输出周期才能稳定。DOUT 在4 个数据输出周期后才会从高电平变低电平,输出有效数据。






==============================我也是分割线================================


好了,看了这么多原理很多人一定已经晕了,下面来简单的:HX711在Arduino上的使用!


经过各种搜索,仅仅在Google Project上找到了一个 phk@FreeBSD.ORG 写的 Arduino 库(感谢啊!),功能很完善,而且支持多版本的Arduino。

我备份在这里吧,以免以后找不到:
hx711-arduino-v0.01.tar.gz (1.3 KB, 下载次数: 4496)

评分

参与人数 1 +3 收起 理由
幻生幻灭 + 3 楼主强大了

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-9-30 16:57:27 | 显示全部楼层
fairsky 发表于 2013-9-25 18:24
我是1.05版本怎么编译不过呢?

你把HX711库放到IDE的对应目录了么。。。
回复 支持 0 反对 1

使用道具 举报

发表于 2012-10-28 15:08:44 | 显示全部楼层
等待后续,再问桥式拉力传感器是怎么使用的,就是重物压在上面,然后会输出与重量相关的电压?那为什么要两个呢?

点评

后续完成~~~~  发表于 2012-10-29 10:44
正在写,别急哈。桥式传感器使用一个就可以了,只不过HX711提供了两个通道,可以接两个传感器,也可以把B通道作为电压参考,一般电子称设计中常用到电压修正的  发表于 2012-10-28 15:27
回复 支持 反对

使用道具 举报

发表于 2012-10-28 15:21:36 | 显示全部楼层
强大
楼主继续

点评

呵呵,又加了点功能,这回写完了  发表于 2012-10-29 10:44
继续写后续啦  发表于 2012-10-28 15:27
回复 支持 反对

使用道具 举报

发表于 2012-10-28 16:01:10 | 显示全部楼层
这个思路太好了

点评

呵呵,就是介绍的详细点,思路很混乱  发表于 2012-10-28 16:15
回复 支持 反对

使用道具 举报

发表于 2012-10-28 20:53:28 | 显示全部楼层

感谢Shenhaiyu提供了HX711库!
太巧合了!上周我也刚好买了10片HX711,准备做拉力设备用.因为等待拉力机台和推拉力传感器,闲来就把以前报废的2000g电子天平拆了,利用旧的2000g传感器,HX711和ARDUINO,在卖家提供C程序的基础上修改成ARDUINO,也加了去皮按键,利用LCD1602显示,在量程范围内能稳定在0.2g(可能接线长,没有注意干扰),修正系数感觉也和LZ的很接似,我是用十次24位读数的平均值除874点几可惜程序都在单位的电脑里.小数部分记不清了.
有时间我也利用ARDUINO库完善一下自己的程序.

点评

EEPROM存储皮重信息搞定了,看看我的程序吧  发表于 2012-10-29 10:45
EEPROM存double数据有点麻烦,但是能实现。目前有个思路就是把修正系数拆解成:(87300+x)/10e8,这样X就差不多能在0-255之间变化了,存到EEPROM中没有压力  发表于 2012-10-28 21:47
呵呵,可以的话把你的程序共享出来呗,大家一起交流一下。我正研究如何将修正系数和偏移量存入EEPROM以备下次读取呢  发表于 2012-10-28 21:30
回复 支持 反对

使用道具 举报

发表于 2012-10-28 21:53:33 | 显示全部楼层
很好的思路啊

点评

谢谢支持!  发表于 2012-10-28 21:59
回复 支持 反对

使用道具 举报

发表于 2012-10-28 22:05:11 | 显示全部楼层
思路很好,我以前用AVR(非Arduino)做过简单的电子秤!楼主继续!

点评

版主,帖子基本上写完了,来看看我存储皮重的思路吧,呵呵  发表于 2012-10-29 10:46
嗯,以后慢慢写,加上DS18B20的温度补偿,曲线回归滤波算法之类的,没准能用上PID呢  发表于 2012-10-28 23:08
回复 支持 反对

使用道具 举报

发表于 2012-10-29 12:33:21 | 显示全部楼层
Randy 发表于 2012-10-28 22:05
思路很好,我以前用AVR(非Arduino)做过简单的电子秤!楼主继续!

好的,辛苦了!
回复 支持 反对

使用道具 举报

发表于 2012-10-30 10:52:34 | 显示全部楼层
不错,我画过基于ADS1231的板子和用51写过称重程序,国产的HX711廉价很多,不过我以前的芯片是申请的样片,嘿嘿

点评

哈哈,靠申请样片搞设计绝对是个省钱的思路  发表于 2012-10-30 13:15
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-11-24 17:38:21 | 显示全部楼层
Saint 发表于 2012-10-30 10:52
不错,我画过基于ADS1231的板子和用51写过称重程序,国产的HX711廉价很多,不过我以前的芯片是申请的样片, ...

除了 ADS1231 外还有什么好AD模块吗?
回复 支持 反对

使用道具 举报

发表于 2012-11-26 13:39:34 | 显示全部楼层
shenhaiyu 发表于 2012-11-24 17:38
除了 ADS1231 外还有什么好AD模块吗?

我觉得ADS1231对于测量体重精确度已经够高了,不用这么高的精度,这个芯片更多是做精确测量。我那个时候字从TI官网上根据自己的需求选择,然后找的一块芯片,貌似做体重测量最多的就是你用的这个过程的芯片
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-3 10:46:18 | 显示全部楼层
Saint 发表于 2012-11-26 13:39
我觉得ADS1231对于测量体重精确度已经够高了,不用这么高的精度,这个芯片更多是做精确测量。我那个时候字 ...

是啊,我这个就是高精度测量,实在是没有别的选择了……
回复 支持 反对

使用道具 举报

发表于 2013-4-4 10:25:25 | 显示全部楼层
请问楼主我连接好以后用例程输出总是不变是怎么回事?一直输出-8388608.00,传感器一侧固定,一侧悬空了,压力在悬空的一侧,求救求救

点评

估计是你接线或者通讯有问题,没有详细描述没法帮你喽  发表于 2013-9-2 21:25
回复 支持 反对

使用道具 举报

发表于 2013-6-18 14:57:38 | 显示全部楼层
Saint 发表于 2012-10-30 10:52
不错,我画过基于ADS1231的板子和用51写过称重程序,国产的HX711廉价很多,不过我以前的芯片是申请的样片, ...

我正在用hx711,我用52单片机做的求52单片机c程序

点评

这个。。。我只会Arduino  发表于 2013-9-2 21:25
回复 支持 反对

使用道具 举报

发表于 2013-7-5 00:03:54 | 显示全部楼层
板主真的很厲害

点评

谢谢支持哈~~~  发表于 2013-9-2 21:25
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2020-1-20 07:08 , Processed in 0.066334 second(s), 43 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表