HX711 AD芯片详解及电子秤制作教程(附32源码和OLED显示)

HX711 AD芯片详解电子秤制作oled显示(附:32源码)

本文首先对HX711 AD芯片以及其使用方法进行了详细的介绍,然后介绍了全桥应变传感器,最后介绍了简易电子秤的制作方法。(文末附有32控制源码)
HX711 AD芯片

一、HX711 AD芯片介绍

HX711为一款包含前置放大器的24位AD转换芯片,内部集成了差分处理电路、稳压电源、片内时钟振荡器等,因此极大的简化了芯片外围电路。HX711 AD芯片主要用于微小信号的处理(约为uV),这些输出很难由控制器直接处理(如:12位AD转化控制精度约为0.8mv),因此我们可以使用HX711 AD芯片对电压信号进行放大后转化为24位数字信号供处理器读取。由于电子秤测量重量的传感器提供远低于毫伏级别的电压输出,所以使用HX711 AD芯片对其电压信号进行处理是十分合适的。
HX711芯片主要参数:

  1. 工作电压范围:2.6~5.5V;
  2. 共有A B两个通道(同一时刻只能使用一个通道)。
  3. 内部差分电路可编程增益为32,64,128,其中通道A可以选择使用64和128增益,通道B固定增益为32;
  4. 可选择10Hz或者80Hz的数据输出速率(内部);
  5. 低功耗,其工作电流<1.6mA,断电电流<1uA;
  6. 工作温度范围:-40℃至+ 85℃;
  7. 串口数据输出速率可以达到500KHz;
    HX711内部结构以及使用电路
    VSUP 为供电电源
    BASE 为片内稳压电路控制输出端
    AVDD 为模拟电源
    VFB 为稳压电路的控制输入
    AGND 为模拟地
    VBG 为模拟输出
    INA+、INB+、INA-、INB- 分别为AB通道的输入端
    PD_SCK 为串口时钟输入
    DOUT 串口数据输出
    XO XI 外部晶振输入 使用内部晶振时候 XI为0
    RATE 芯片输出数据速率控制 0:10Hz 1:80Hz
    DVDD 数字电源
    内部稳压电路为芯片内部各模块电路提供稳定的工作电压。 S8550用于稳压电路的控制模拟输入电源,为传感器提供稳定的模拟输入电压。内部稳压电路的输出电压Vavdd由R1、R2电阻和芯片的输出参考电压决定,

即:Vavdd=Vbg(R1+R2)/R2(其中Vbg=1.25V)

二、HX711 数据格式

控制时序
数据传输方式为同步半双工的方式。时钟线空闲时置为低电平,采集数据前,需要判断数据线的电平,当数据线电平为低时,表明HX711芯片已经准备就绪,否则需要等待其成功就绪后再进行数据采集,进行等待时,时钟线应该为低电平。数据线在时钟线上升沿时改变数据状态,其他时间数据线保持稳定。数据线返回数据的前24位为采集到的AD值,后1、2或3位为HX711工作方式设置位,不同位数表示不同转换方式。返回的数据类型为有符号数据(因为称重传感器有上下两个施力方向,当不同时刻在两个方向施加相同的力时,应变桥输出的变化时一样的,只是方向不同),因此数据是有符号的。可以通过符号判断施力方向,但是一般用不到。
数据输出共有以下三种格式:

  1. 通道A,增益128:(25个脉冲为一个周期) 前24个脉冲为数据存储位(存储的是采集数据的补码,一个位为最高位),最后一位设置工作方式。
  2. 通道B,增益32:(26个脉冲为一个周期) 前24个脉冲为数据存储位(存储的是采集数据的补码,一个位为最高位),最后两位设置工作方式。
  3. 通道A,增益64:(27个脉冲为一个周期) 前24个脉冲为数据存储位(存储的是采集数据的补码,一个位为最高位),最后三位设置工作方式。
    注意:1.时钟线输入脉冲个数应该保持在25至27之间,否则会导致通信错误。
    2.当芯片工作方式改变时,其需要4个数据输出周期的时间才能稳定输出数据,即:四个周期后,数据线才会变为低电平。

三、全桥式应变传感器(称重使用)

应变片安装位置示意图
全桥式应变传感器原理图
没有施加压力时,四个桥臂上的电阻值相同,因此白色信号线和绿色信号线输出的电压相同,进入到HX711通道的两个信号相同,所以输出数据为0(注意:前为理想情况,由于制作工艺的不同,实际输出的两个信号会有一定差异,所以需要去皮处理)。当对传感器在受理点施加力F后,应变片R1和R4拉伸,电阻值变大,R2和R3收缩,电阻值变小。此时白色信号线和绿色信号线的电压值就会发生变化,此变化反应的是外界压力的大小。

四、简易电子秤制作

硬件组装

此设计的硬件包括:STM32F103C8T6芯片一颗(主流芯片都可以,因为我们的外设较少),轻触按键一个,0.96寸IIC OLED显示屏一个、称重传感器一个。
硬件连接如下:
oled: SCL———–PB11
SDA———–PB10
称重传感器 SCK———-PB14
DOUT——–PB15
按键连接PB1
oled电源选择3.3V(5V也可),称重传感器电源选择5V。

工作原理

当对压力传感器施加力时,应变片会发生形变,从而导致桥式应变传感器的输出信号出现变化,使用HX711对变化进行放大转换后,传送给主控芯片进行处理,显示。

五、32源码

HX711.c文件

#include "HX711.h"
#include "tim.h"

u32 HX711_Buffer;  //HX711读取数据存储变量,由于读取24位,所以开辟32位空间
u32 Weight_Maopi;  //电子秤皮重存储变量
s32 Weight_Shiwu;  //放置重物体后,读取数据存储变量
u8 Flag_Error = 0;
/**********************************
校准参数
因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。
当发现测试出来的重量偏大时,增加该数值。
如果测试出来的重量偏小时,减小改数值。
该值可以为小数,最后选择两个点进行二次校准
**********************************/
#define GapValue 412

/**********************************
定时器3延时us函数
需要在cunemx中设置预分频系数为71 或使用库函数或寄存器版本时初始化定时器3预分频系数为71
***********************************/
void Delay_us(uint16_t t)
{
	uint16_t counter = 0;
	__HAL_TIM_SET_AUTORELOAD(&htim3, t); 	// 设置定时器自动加载值,到该值后重新计数   
	__HAL_TIM_SET_COUNTER(&htim3, 0);       // 设置定时器初始值
	HAL_TIM_Base_Start(&htim3);             // 启动定时器,定时器预分频系数为72,所以一个数为1us
	while(counter != t)                     // 直到定时器计数从 0 计数到 us 结束循环,刚好  us
	{
		counter = __HAL_TIM_GET_COUNTER(&htim3);  // 获取定时器当前计数
	}
	HAL_TIM_Base_Stop(&htim3);              // 停止定时器
}
/*****************************
HX711通信引脚初始化
DOUT 配置为双拉输入
SCK 配置为推挽输出
库函数和寄存器在初始化时配置,HAL库在CUBEMX配置
此类历程为HAL版本 所以对库函数初始化进行了屏蔽处理
***************************************/
//void Init_HX711pin(void)
//{
//	GPIO_InitTypeDef GPIO_InitStructure;
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能PF端口时钟

//	//HX711_SCK
//	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;				 // 端口配置
//	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
//	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
//	GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB
//	
//	//HX711_DOUT
//    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
//    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//输入上拉
//    GPIO_Init(GPIOB, &GPIO_InitStructure);  
//	
//	GPIO_SetBits(GPIOB,GPIO_Pin_14);					//初始化设置为0
//}
/***************************************************
读取HX711
count :是读出的AD数据
count :读出的数据是24位有符号,二进制补码是: 0x800000 - 0x7FFFFF (-8388607 ~ 8388607)				
count = count ^ 0x800000;   这里的意思是将二进制补码换算为 0~16777214的正数
****************************************************/
u32 HX711_Read(void)	//增益128
{
	unsigned long count; 
	unsigned char i; 
  	HX711_SCK(0);  //拉低时钟引脚
  	count=0; 
	Delay_us(1);
  	while(HX711_DOUT);   //读取数据引脚状态,等待AD芯片准备好,为低电平时是准备好了
  	for(i=0;i<24;i++)  //时钟周期500Khz
	{ 
	  	HX711_SCK(1); 
	  	count=count<<1; 
		Delay_us(1);
		HX711_SCK(0); 
	  	if(HX711_DOUT)
			count++; 
		Delay_us(1);
	} 
 	HX711_SCK(1); 
    count=count^0x800000;//第25个脉冲下降沿来时,转换数据 
	Delay_us(1);
	HX711_SCK(0);  
	return(count);
}

/****************************************************
获取毛皮重量函数
****************************************************/
void Get_Maopi(void)
{
	Weight_Maopi = HX711_Read();	
} 

/****************************************************
称重函数
****************************************************/
s32 Get_Weight(void)
{
	HX711_Buffer = HX711_Read();
	if(HX711_Buffer > Weight_Maopi)			
	{
		Weight_Shiwu = HX711_Buffer;
		Weight_Shiwu = Weight_Shiwu - Weight_Maopi;				//获取实物的AD采样数值。
	
		Weight_Shiwu = (s32)((float)Weight_Shiwu/GapValue); 	//计算实物的实际重量
		return 	Weight_Shiwu;	//因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正这里的GapValue这个除数。																//当发现测试出来的重量偏大时,增加该数值																	//如果测试出来的重量偏小时,减小改数值。
	}
	else
	{
		return 0;
	}
}

HX711.h文件

#ifndef __HX711_H
#define __HX711_H
#include "main.h"
#define HX711_SCK(a)   (a==GPIO_PIN_RESET) ? HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, 0) 
#define HX711_DOUT   HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_15)//数据引脚
typedef uint8_t u8;
typedef uint32_t u32;
typedef int32_t s32;
extern void Init_HX711pin(void);
extern void Get_Maopi(void);
extern s32 Get_Weight(void);
#endif
物联沃分享整理
物联沃-IOTWORD物联网 » HX711 AD芯片详解及电子秤制作教程(附32源码和OLED显示)

发表评论