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