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