HX711 AD芯片详解电子秤制作oled显示(附:32源码)
本文首先对HX711 AD芯片以及其使用方法进行了详细的介绍,然后介绍了全桥应变传感器,最后介绍了简易电子秤的制作方法。(文末附有32控制源码)
一、HX711 AD芯片介绍
HX711为一款包含前置放大器的24位AD转换芯片,内部集成了差分处理电路、稳压电源、片内时钟振荡器等,因此极大的简化了芯片外围电路。HX711 AD芯片主要用于微小信号的处理(约为uV),这些输出很难由控制器直接处理(如:12位AD转化控制精度约为0.8mv),因此我们可以使用HX711 AD芯片对电压信号进行放大后转化为24位数字信号供处理器读取。由于电子秤测量重量的传感器提供远低于毫伏级别的电压输出,所以使用HX711 AD芯片对其电压信号进行处理是十分合适的。
HX711芯片主要参数:
- 工作电压范围:2.6~5.5V;
- 共有A B两个通道(同一时刻只能使用一个通道)。
- 内部差分电路可编程增益为32,64,128,其中通道A可以选择使用64和128增益,通道B固定增益为32;
- 可选择10Hz或者80Hz的数据输出速率(内部);
- 低功耗,其工作电流<1.6mA,断电电流<1uA;
- 工作温度范围:-40℃至+ 85℃;
- 串口数据输出速率可以达到500KHz;
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工作方式设置位,不同位数表示不同转换方式。返回的数据类型为有符号数据(因为称重传感器有上下两个施力方向,当不同时刻在两个方向施加相同的力时,应变桥输出的变化时一样的,只是方向不同),因此数据是有符号的。可以通过符号判断施力方向,但是一般用不到。
数据输出共有以下三种格式:
- 通道A,增益128:(25个脉冲为一个周期) 前24个脉冲为数据存储位(存储的是采集数据的补码,一个位为最高位),最后一位设置工作方式。
- 通道B,增益32:(26个脉冲为一个周期) 前24个脉冲为数据存储位(存储的是采集数据的补码,一个位为最高位),最后两位设置工作方式。
- 通道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文件文章来源:https://www.toymoban.com/news/detail-534243.html
#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文件文章来源地址https://www.toymoban.com/news/detail-534243.html
#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
到了这里,关于HX711 AD芯片详解电子秤制作oled显示(附:32源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!