[转资][经验分享]解决体重称HX711芯片的隐藏BUG问题

川楠

关注

发布时间: 2019-10-10

阅读: 903

前言
之前做了一个项目,里面有一个体重检测的功能,查阅了很多的资料,最后锁定使用HX711芯片,这个国产的芯片功能集成的很完善,TB上也有现成的模块,而且价格很便宜。
就在这个简单的芯片上,我遇到了一个坑。这个坑,坑的我莫名其妙。如果亲爱的读者你也使用过这或者正在使用这个芯片,那么此文可以可有效的避免,你和我踩上同样的坑。

硬件设计
关于HX711的电路设计,这个不是重点,官方的数据手册上有推荐的设计电路。

传感器使用电阻应变半桥式传感器。

使用4个半桥传感器组成电阻桥就能测量

以上设计都是通用设计,绝大多数家用的体重秤都是采用的这样的传感器方案。当然各家的ADC芯片可能是有差异的,我的项目使用的就是HX711芯片。

驱动简介
芯片的是两个控制引脚,PD_SCK、DOUT,单片机MCU只需要按照下图的时序,发送时钟和读取数据即可。

另外,HX711的引脚控制输出数据速率控制,0: 10Hz; 1: 80Hz,我在硬件设计上,已经将该引脚下拉为低,所以芯片数据输出周期为100MS。

编程思路
首先单片机相关引脚初始化。
然后检测DOUT引脚的电平,当DOUT为低的时候(芯片ADC已经将数据转换OK),PD_SCK开始发送脉冲,DOUT需要在发送脉冲的下降沿读取数据。
DOUT的前24位是ADC采集的数据,后面可以根据自己设计的增益倍数,发送1-3个时钟。

然后使用定时器,在定时器中断里面定义了一个100MS的标志Flag_100MS。然后在主函数中读取HX711数据,并计算体重。

最后通过串口打印数据,体重数据正常,校准之后,体重的斜率线性度也不错。

项目进行到了这里,一切顺风顺水,按理说也是算完满的收官了。产品也开始在陆陆续续的小批量供货了,但此时的BUG问题才开始崭露头角。
因为我们的体重结果关联到另外的一个设备,通过我们的体重结果去联动触发。
从用户那边反馈设备偶尔会突然的动一下(一开始以为是上位机的控制逻辑问题)。带着这样的问题,我们开始排查。从新改了一版程序,加强了日志的记录。
最后确定的问题是:上位机正常,突然异常动,是体重秤这边给了一个比较大的体重值,触发了上位机的联动。但是我这边空称的时候,查看并没有一个大的数据。
最后没办法,那就从新做一个测试程序,将体重秤的所有数据通过串口打印出来,并保存。
然后通过excel去处理和分析。所以就有了下面的这个表。

18万个数据,中间就出现了一次,几个小时才出现一次。有时候连续测试12个小时都没有这种突变数据。所以这个问题一藏的够深的。
问题是发现了,但是怎么分析?
一开始我想的是,难道是信号干扰?
所以我降低了PD_SCK的频率,但是问题依然有。
那我就减短HX711芯片与MCU的距离(我之前的距离是1.5米),还是不行。

那就用示波器看看PD_SCK、DOUT的波形
虽然毛刺比较严重,但是对比正常数据的时候,毛刺也一样多,感觉还是没找到问题的症结所在。

或许是旁观者清,别人提醒我,仔细的对比下时序看看!
这样,我就重新开始测试,去除我定时器的100mS的Flag_100MS。

就这么一个小小的程序,发现了原来手册上说的数据输出10HZ真的有问题,通过示波器检测电平翻转测试,实际上采样一个周期的时间是90多ms。
这样就存在着一个问题我单片机固定时间是100MS采集一次,HX711转换周期为90ms,在某个时间肯定会当单片机采集与HX711存在重合。个人推测,出现这种情况时候,可能会导致ADC采集数据出现异常。

所以,后面的改进程序一定要以HX711的采集转换周期为基准时基。

程序设计思路如下:

在定时器中断函数里面,周期性的扫描DOUT的引脚,当DOUT为低的时候,开始计时,在1MS后,开一个10MS的窗口,MCU只能在这个10MS的窗口内读取ADC数据,其他的时间段,则不允许MCU读取。如下图虚线框所示。

关键程序代码设计如下:
在定时器中断函数中,设计开窗时间,定时器中断函数周期为50uS

当(Event_WEGIT.Flag== 1)&&(Event_WEGIT.En==1)条件为真的的时候,则到了MCU的读取HX711的窗口时间。

当读取完HX711的数据之后,在把对应的窗口标志清零即可。下面使用示波器查看一下HX711的通讯波形。
测试1:使用示波器查看体重数据HX711波形,验证HX711通讯波形。

结果:上图中蓝线为HX711的SCK,黄线为DOUT数据。程序在DOUT数据准备好1MS时候开始采集数据。

测试2:验证HX711数据开窗功能(在DOUT产生下降沿之后,1MS-10MS时间为数据采集时间,超过时间则放弃采集,等待下次),微调程序,加入指示灯。使用示波器查看开窗和DOUT时序。

结果:黄色线为开窗时间,蓝色为DOUT波形。

可以看到,这个程序已经完全满足了我的设计要求,当然新的程序也是需要经过测试,连续48小时不断电测试,再也没有出现空称条件下的数据突变了。

总结
对于这次的问题,我只能说,手册上说的将RATE引脚拉低就是10HZ的数据输出频率,我编程也是按照100ms的周期去读取数据,这样也会翻船。归其原因,是我没有更深层次的去理解其时序的本质。
同时测试环节,在简单的东西也是需要认真、完善的测试。出现问题不可怕,可怕的是出现了问题我们没有去及时的发现它。

  • 38
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值