社区导航

 

搜索
查看: 3258|回复: 3
打印 上一主题 下一主题

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

[复制链接]

6080

TA的帖子

19

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

跳转到指定楼层
楼主
发表于 2019-10-11 09:56 | 只看该作者 |倒序浏览 |阅读模式

前言
     之前做了一个项目,里面有一个体重检测的功能,查阅了很多的资料,最后锁定使用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的周期去读取数据,这样也会翻船。归其原因,是我没有更深层次的去理解其时序的本质。
      同时测试环节,在简单的东西也是需要认真、完善的测试。出现问题不可怕,可怕的是出现了问题我们没有去及时的发现它。

评分

2

查看全部评分

0

9761

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

沙发
发表于 2019-10-11 10:13 | 只看该作者

这种问题找出来真不容易,内部时钟应该是RC振荡器,精度容易受到环境影响造成的。


421

TA的帖子

2

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

板凳
发表于 2019-10-11 10:38 | 只看该作者

感觉设计之初就应该考虑到不能用单片机的100ms定时去读数据,而是从传感器方面考虑读数据,因为二者之间时间不同步。


982

TA的帖子

6

TA的资源

版主

Rank: 6Rank: 6

4
发表于 2019-10-11 14:14 | 只看该作者

思路很明确,谢谢楼主分享


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

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( )

GMT+8, 2020-2-14 15:50 , Processed in 0.152860 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表
易中彩票开户 快乐赛车开奖纪录 快乐赛车平台官网 快乐赛车单双 快乐飞艇平台注册 pk10机器人 快乐赛车免费计划软件 内蒙古11选5走势图 快乐赛车冠军公式规律 安徽快3走势