问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

51单片机驱动HX711芯片详解

创作时间:
作者:
@小白创作中心

51单片机驱动HX711芯片详解

引用
CSDN
1.
https://m.blog.csdn.net/weixin_51452951/article/details/136722234

HX711是一款专为高精度电子秤设计的24位A/D转换器芯片,具有集成度高、响应速度快、抗干扰性强等特点。本文将详细介绍HX711的工作原理,并提供具体的驱动代码示例,帮助读者快速掌握其使用方法。

HX711介绍

HX711采用了海芯科技集成电路专利技术,是一款专为高精度电子秤而设计的24位A/D转换器芯片。与同类型其他芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其他同类芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。

HX711具有以下特点:

  • 两路可选择差分输入
  • 片内低噪声可编程放大器,可选增益为32、64和128
  • 片内稳压电路可直接向外部传感器和芯片内A/D转换器提供电源
  • 片内时钟振荡器无需任何外接器件,必要时也可使用外接晶振或时钟
  • 上电自动复位电路
  • 简单的数字控制和串口通讯:所有控制由管脚输入,芯片内寄存器无需编程
  • 可选择10Hz或80Hz的输出数据速率
  • 同步抑制50Hz和60Hz的电源干扰
  • 耗电量(含稳压电源电路):典型工作电流<1.6mA,断电电流<1uA
  • 工作电压范围:2.6~5.5V
  • 工作温度范围:-40~+85℃

HX711工作原理

HX711的内部结构如下:

芯片的封装如下:

如果将管脚XI接地,HX711将自动选择使用内部时钟振荡器,并自动关闭外部时钟输入和晶振的相关电路。这种情况下,典型输出数据速率为10Hz或80Hz。

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

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

HX711驱动代码

下面是HX711的驱动代码实现:

hx711.c

#include "hx711.h"
unsigned int weight_1kg = 0;
void delay_ms(unsigned char ms)
{
    {
        unsigned char i, j;
        _nop_();
        _nop_();
        _nop_();
        i = 11;
        j = 190;
        do
        {
            while (--j);
        } while (--i);
    }while(ms--);
}
void delay_us(unsigned char us)
{
    {
        _nop_();
        _nop_();
        _nop_();
    }while(us--);
}
unsigned long Get_1kg_weight(void) //函数调用前需要放一千克的物体在平台上
{
    weight_1kg =  Read_HX711();
    return weight_1kg;
}
unsigned long Get_weight(void)
{
    unsigned int weight = 0;
    weight = Read_HX711();
    weight /= weight_1kg;
    return weight;
}
unsigned long Read_HX711(void) //CLK为25,输入通道A
{
    unsigned long count;
    unsigned char i;
    HX711_CLK = 0;
    count = 0;
    while(HX711_DATA);  // 等待DATA变低
    for (i = 0; i < 24; i++) {
        HX711_CLK = 1;   // CLK变高,准备读取数据位
        count = count << 1;  // 左移一个位,为下一个数据位腾出位置
        HX711_CLK = 0;   // CLK变低,实际上在CLK的上升沿读取数据位
        if (HX711_DATA)
            count++;
    }
    HX711_CLK = 1;     // 发送额外的脉冲,设定下一次读取的增益
    count = count ^ 0x800000; // 如果需要的话可以转换为负数
    HX711_CLK = 0;
    return (count);
}
void main(void) {
    unsigned long weight;
    // 进行任何必要的初始化
    // ...
    while(1) {
        weight = Read_HX711();
        // 使用读取到的weight值
        // ...
    }
}

hx711.h

#ifndef _HX711_H_
#define _HX711_H_
#include "reg52.h"
#include "intrins.h"
#define HX711_DATA  P10 // 假设连接到P1.0口
#define HX711_CLK   P11 // 假设连接到P1.1口
unsigned long Read_HX711(void);
unsigned long Get_weight(void);
unsigned long Get_1kg_weight(void);
void delay_ms(unsigned char ms);
void delay_us(unsigned char us);
#endif

app.c

#include "hx711.h"
#include "stdio.h"
void main()
{
    Get_1kg_weight();//上电前把1kg物体放上去
    while(1)
    {
        unsigned int weight = 0;
        weight = Get_weight();
        delay_ms(500);
    }
}

总结

HX711主要用来测量重量,也可以当作24位的ADC使用,在读取数据之前,可以延时一段时间等待数值稳定,避免由于振动等引起的读数误差。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号