51单片机(八)驱动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的内部结构如下:

0f2d4196b03b4b569d60d0f858541207.png

芯片的封装如下:

eb16a7cec68a4213a197f156a843c163.png

        如果将管脚 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 转换的 输入通道和增益,参见下表:

ea10853e99ea458bbd4c7f394119582c.png

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

1704aaacde214df79d858b1f61618eb4.png

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使用,在读取数据之前,可以延时一段时间等待数值稳定,避免由于振动等引起的读数误差。

 

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值