电子秤芯片hx711原理图分享
- 一、hx711介绍
-
- 1、芯片概述
- 2、内部结构框图
- 3、关键特性详解
- 4、引脚功能
- 5、工作时序
- 6、设计注意事项
- 7、常见故障排查
- 二、原理图分享
- 三、驱动代码
一、hx711介绍
1、芯片概述
HX711是一款专为高精度电子秤设计的24位模数转换器(ADC),具有以下核心特性:
2、内部结构框图
+———————–+
| 模拟输入 (IN+/-) |→ PGA → ΣΔ调制器 → 数字滤波器 → 串行接口
| 基准电压 (V_{BG}) |↑
| 时钟管理 (OSC) |
+———————–+
3、关键特性详解
差分输入设计
- 通道A:
V
I
N
=
(
A
+
−
A
−
)
V_{IN} = (A+ – A-)
- 通道B:
V
I
N
=
(
B
+
−
B
−
)
V_{IN} = (B+ – B-)
- 共模抑制比(CMRR):>100dB
可编程增益放大器(PGA)
A | 128 | 桥式传感器(默认) |
A | 64 | 大信号输入 |
B | 32 | 外部电压测量 |
输出数据速率
f
s
=
f
C
L
K
I
N
2
24
f_s = \\frac{f_{CLKIN}}{2^{24}}
fs=224fCLKIN
- 典型值:80Hz(
f
C
L
K
I
N
=
5.17
M
H
z
f_{CLKIN}=5.17MHz
4、引脚功能
1 | VSUP | 模拟电源(2.6~5.5V) |
2 | VBAT | 桥式传感器供电 |
3 | IN- | 通道A负输入 |
4 | IN+ | 通道A正输入 |
11 | PD_SCK | 电源控制/串行时钟输入 |
12 | DOUT | 串行数据输出 |
5、工作时序
___ ___ ___ ___
PD_SCK _| |___| |___| |___| |__…
_______ _______ _______ _______
DOUT __|DATA24|DATA23|… |DATA0|_____
↑T1 ↑T2 ↑T3
- T1:SCK下降沿后DOUT准备数据
- T2:SCK上升沿锁存数据
- T3:25个脉冲后自动进入休眠模式
6、设计注意事项
电源噪声抑制
- 在VSUP和VBAT引脚增加10μF+0.1μF电容
- 模拟地与数字地单点连接
温度漂移补偿
Δ
V
o
f
f
s
e
t
=
α
⋅
(
T
−
T
0
)
\\Delta V_{offset} = \\alpha \\cdot (T – T_0)
ΔVoffset=α⋅(T−T0) 建议每10℃重新校准零点
信号调理
- 满量程输入电压:±20mV(增益128时)
- 输入阻抗:>1MΩ
7、常见故障排查
读数跳变 | 电源纹波过大 | 增加电源滤波电容 |
输出全零 | PD_SCK信号异常 | 检查MCU时钟引脚配置 |
数据不稳定 | 传感器激励不足 | 检查VBAT电压(≥3.3V) |
注:完整技术参数请参考官方数据手册(HX711 Rev 1.5)。实际设计中建议预留增益选择跳线,以适应不同灵敏度传感器。
二、原理图分享
板子画了4路每一路电源分开,下图只是其中一路。
三、驱动代码
#include "stm32f10x.h" // Device header
#include "HX711.h"
#include "Delay.h"
floatBiaoDing=384.7; //标定系数,根据自己的传感器调节
void HX711_GPIO_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //时钟线推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //数据线浮空输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void HX711_W_PD_SCK(uint8_t BitValue) //写时钟线
{
GPIO_WriteBit(GPIOA, GPIO_Pin_1, (BitAction)BitValue);
}
void HX711_W_DOUT(uint8_t BitValue) //写数据线,开始时,需要拉高DOUT电平
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_WriteBit(GPIOA, GPIO_Pin_2, (BitAction)BitValue);
}
uint8_t HX711_R_DOUT(void) //读数据
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2);
}
void HX711_Reset(void) // 传感器复位,去皮
{
HX711_W_PD_SCK(1); //拉高,延时60us
Delay_us(60);
}
uint32_t HX711_ReadData(void) //读数据
{
uint8_t i;
uint32_t value = 0; //接收HX711采集的AD值
HX711_W_DOUT(1); //初始DOUT为高电平
HX711_W_PD_SCK(0); //初始PD_SCK为低电平
Delay_us(1);
HX711_R_DOUT(); //DOUT转换为输入
while(HX711_R_DOUT()); //等待DOUT引脚变为高电平
Delay_us(1);
for(i=0;i<24;i++) //按照HX711时序接收数据
{
HX711_W_PD_SCK(1); // PD_SCK置高,发送脉冲
value = value << 1; //下降沿来时变量左移一位,右侧补零,
Delay_us(1);
HX711_W_PD_SCK(0); // PD_SCK置低
if(HX711_R_DOUT()) //读取一位数据,如果高电平,加一,低电平不变。
value++;
Delay_us(1);
}
HX711_W_PD_SCK(1); //最后一个脉冲,增益为128
value = value^0x800000; //第25个脉冲转换数据,24位AD转换,最高位为符号位,其余为有效位
Delay_us(1);
HX711_W_PD_SCK(0);
Delay_us(1);
return value;
}
uint32_t Get_Pi(void) //皮重函数
{
uint8_t MEDIAN_LEN=5,MEDIAN=3; //中值滤波参数,冒泡排序法
uint32_t buffer[MEDIAN_LEN]; //储存数组
uint32_t HX711_dat,pi_weight,num;
uint8_t i,medleng = 0;
for(i=0;i<MEDIAN_LEN;i++)
{
HX711_dat=HX711_ReadData();
if(medleng == 0) //第1个元素,直接放入,不需要排序
{
buffer[0] = HX711_dat;
medleng = 1;
}
else //中值滤波,取中间值,冒泡排序法
{
for(i = 0; i < medleng; i ++)
{
if( buffer[i] > HX711_dat)
{
num = HX711_dat; HX711_dat = buffer[i]; buffer[i] = num;
}
}
buffer[medleng] = HX711_dat;
medleng++;
}
if(medleng >= MEDIAN_LEN)
{
HX711_dat = buffer[MEDIAN]; //取排序好的中间值,
medleng = 0;
}
}
pi_weight=HX711_dat;
return pi_weight;
}
uint32_t Get_Weight(uint32_t pi_weight) //称重函数
{
uint32_t get_weight;
uint32_t weight;
get_weight=HX711_ReadData(); //HX711数据采集函数
if(get_weight>pi_weight)
{
get_weight=HX711_ReadData(); //重新采集HX711数据
weight=(uint32_t)(((float)(get_weight–pi_weight))/BiaoDing);//修改标定系数,根据传感器不同
}
else
weight=0;
return weight;
}
评论前必须登录!
注册