电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
[经验分享]解决体重称HX711芯片的隐藏BUG问题
分 享
扫描二维码分享
[经验分享]解决体重称HX711芯片的隐藏BUG问题
HX711
bug
电子秤
川楠
关注
发布时间: 2019-10-10
丨
阅读: 6019
**前言** 之前做了一个项目,里面有一个体重检测的功能,查阅了很多的资料,最后锁定使用HX711芯片,这个国产的芯片功能集成的很完善,TB上也有现成的模块,而且价格很便宜。 就在这个简单的芯片上,我遇到了一个坑。这个坑,坑的我莫名其妙。如果亲爱的读者你也使用过这或者正在使用这个芯片,那么此文可以可有效的避免,你和我踩上同样的坑。 **硬件设计** 关于HX711的电路设计,这个不是重点,官方的数据手册上有推荐的设计电路。 ![](https://cf01.ickimg.com/bbsimages/201910/3d9aac80a61f65cba6c90baefad08709.jpg) 传感器使用电阻应变半桥式传感器。 ![](https://cf01.ickimg.com/bbsimages/201910/2480e0c1d7fd37b84884beff67b77090.jpg) 使用4个半桥传感器组成电阻桥就能测量 ![](https://cf01.ickimg.com/bbsimages/201910/daa87bf0e5638f387a8eebe43dc168db.jpg) 以上设计都是通用设计,绝大多数家用的体重秤都是采用的这样的传感器方案。当然各家的ADC芯片可能是有差异的,我的项目使用的就是HX711芯片。 **驱动简介** 芯片的是两个控制引脚,PD_SCK、DOUT,单片机MCU只需要按照下图的时序,发送时钟和读取数据即可。 ![](https://cf01.ickimg.com/bbsimages/201910/e122b67e2bb82e4600c525870de89fbc.jpg) 另外,HX711的引脚控制输出数据速率控制,0: 10Hz; 1: 80Hz,我在硬件设计上,已经将该引脚下拉为低,所以芯片数据输出周期为100MS。 **编程思路** 首先单片机相关引脚初始化。 然后检测DOUT引脚的电平,当DOUT为低的时候(芯片ADC已经将数据转换OK),PD_SCK开始发送脉冲,DOUT需要在发送脉冲的下降沿读取数据。 DOUT的前24位是ADC采集的数据,后面可以根据自己设计的增益倍数,发送1-3个时钟。 ![](https://cf01.ickimg.com/bbsimages/201910/f79e39cdc5e120626feddb520e30d3bc.jpg) 然后使用定时器,在定时器中断里面定义了一个100MS的标志Flag_100MS。然后在主函数中读取HX711数据,并计算体重。 ![](https://cf01.ickimg.com/bbsimages/201910/bcdbe274a0b6a02fbda2747ad3d8c09f.jpg) 最后通过串口打印数据,体重数据正常,校准之后,体重的斜率线性度也不错。 项目进行到了这里,一切顺风顺水,按理说也是算完满的收官了。产品也开始在陆陆续续的小批量供货了,但此时的BUG问题才开始崭露头角。 因为我们的体重结果关联到另外的一个设备,通过我们的体重结果去联动触发。 从用户那边反馈设备偶尔会突然的动一下(一开始以为是上位机的控制逻辑问题)。带着这样的问题,我们开始排查。从新改了一版程序,加强了日志的记录。 最后确定的问题是:上位机正常,突然异常动,是体重秤这边给了一个比较大的体重值,触发了上位机的联动。但是我这边空称的时候,查看并没有一个大的数据。 最后没办法,那就从新做一个测试程序,将体重秤的所有数据通过串口打印出来,并保存。 然后通过excel去处理和分析。所以就有了下面的这个表。 ![](https://cf01.ickimg.com/bbsimages/201910/5b88fc8b18169e02587196410f112da0.jpg) 18万个数据,中间就出现了一次,几个小时才出现一次。有时候连续测试12个小时都没有这种突变数据。所以这个问题一藏的够深的。 问题是发现了,但是怎么分析? 一开始我想的是,难道是信号干扰? 所以我降低了PD_SCK的频率,但是问题依然有。 那我就减短HX711芯片与MCU的距离(我之前的距离是1.5米),还是不行。 那就用示波器看看PD_SCK、DOUT的波形 虽然毛刺比较严重,但是对比正常数据的时候,毛刺也一样多,感觉还是没找到问题的症结所在。 或许是旁观者清,别人提醒我,仔细的对比下时序看看! 这样,我就重新开始测试,去除我定时器的100mS的Flag_100MS。 ![](https://cf01.ickimg.com/bbsimages/201910/7c0ad76e44e833507ab70958b36de5ff.jpg) 就这么一个小小的程序,发现了原来手册上说的数据输出10HZ真的有问题,通过示波器检测电平翻转测试,实际上采样一个周期的时间是90多ms。 这样就存在着一个问题我单片机固定时间是100MS采集一次,HX711转换周期为90ms,在某个时间肯定会当单片机采集与HX711存在重合。个人推测,出现这种情况时候,可能会导致ADC采集数据出现异常。 ![](https://cf01.ickimg.com/bbsimages/201910/d0d9d93a1599ec09fea8ad0dbce217be.jpg) 所以,后面的改进程序一定要以HX711的采集转换周期为基准时基。 程序设计思路如下: 在定时器中断函数里面,周期性的扫描DOUT的引脚,当DOUT为低的时候,开始计时,在1MS后,开一个10MS的窗口,MCU只能在这个10MS的窗口内读取ADC数据,其他的时间段,则不允许MCU读取。如下图虚线框所示。 ![](https://cf01.ickimg.com/bbsimages/201910/64a65cff11cc4d42266a6ccceec47075.jpg) 关键程序代码设计如下: 在定时器中断函数中,设计开窗时间,定时器中断函数周期为50uS ![](https://cf01.ickimg.com/bbsimages/201910/f43893164e3d96d127213ecdd811e1e7.jpg) 当(Event_WEGIT.Flag== 1)&&(Event_WEGIT.En==1)条件为真的的时候,则到了MCU的读取HX711的窗口时间。 ![](https://cf01.ickimg.com/bbsimages/201910/7c3b4372ff3166058f6a1cff6a088f85.jpg) 当读取完HX711的数据之后,在把对应的窗口标志清零即可。下面使用示波器查看一下HX711的通讯波形。 测试1:使用示波器查看体重数据HX711波形,验证HX711通讯波形。 ![](https://cf01.ickimg.com/bbsimages/201910/d738023b056d91f01aeee37c4fc73f91.jpg) 结果:上图中蓝线为HX711的SCK,黄线为DOUT数据。程序在DOUT数据准备好1MS时候开始采集数据。 测试2:验证HX711数据开窗功能(在DOUT产生下降沿之后,1MS-10MS时间为数据采集时间,超过时间则放弃采集,等待下次),微调程序,加入指示灯。使用示波器查看开窗和DOUT时序。 ![](https://cf01.ickimg.com/bbsimages/201910/8580f4c51777728ca36c4d252407f21a.jpg) 结果:黄色线为开窗时间,蓝色为DOUT波形。 可以看到,这个程序已经完全满足了我的设计要求,当然新的程序也是需要经过测试,连续48小时不断电测试,再也没有出现空称条件下的数据突变了。 **总结** 对于这次的问题,我只能说,手册上说的将RATE引脚拉低就是10HZ的数据输出频率,我编程也是按照100ms的周期去读取数据,这样也会翻船。归其原因,是我没有更深层次的去理解其时序的本质。 同时测试环节,在简单的东西也是需要认真、完善的测试。出现问题不可怕,可怕的是出现了问题我们没有去及时的发现它。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
1
)
川楠
擅长:单片机综合应用 硬件设计
关注
评论
(2)
登录后可评论,请
登录
或
注册
14a1c2f27e411073
170
天前...
nice
0
回复
发布
megar
168
天前...
感谢大神分享经验
0
回复
发布
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交