STM32读取HX711压力传感器芯片数据

这篇具有很好参考价值的文章主要介绍了STM32读取HX711压力传感器芯片数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、HX711压力传感器芯片介绍

1.1 HX711芯片介绍

1.2 芯片管脚与描述

1.3 芯片特点

二、测量原理

2.1 芯片原理图

2.2 压力传感器输出电压值

2.3 芯片原理概述

2.4 数据输出,输入通道和增益选择时序图

2.5 程序计算原理

2.5.1 如何计算传感器供电电压?

 2.5.2 如何将 AD 值反向转换为重力值?

三、单片机介绍

3.1 STM32F103C8T6最小系统板

四、接线说明

4.1 称重模块实物图

4.2 压力传感器与HX711芯片接线图

4.3 HX711芯片与单片机接线

五、代码编写

5.1 HX711.C

5.2 HX711.H 

5.3 MAIN.C

5.3.1 添加头文件

 5.3.2 初始化

 5.3.3 初始化完成后首先进行一次去皮

5.3.4 测重函数

5.3.5 完整main函数(带显示屏显示)

六、测量效果


一、HX711压力传感器芯片介绍

1.1 HX711芯片介绍

       HX711 是一款专为高精度电子秤而设计的 24 位 A/D 转 换器芯片。与同类型其它芯片相比,该芯片集 成了包括稳压电源、片内时钟振荡器等其它同 类型芯片所需要的外围电路,具有集成度高、 响应速度快、抗干扰性强等优点。降低了电子 秤的整机成本,提高了整机的性能和可靠性。

        该芯片与后端 MCU 芯片的接口和编程非常 简单,所有控制信号由管脚驱动,无需对芯片 内部的寄存器编程。输入选择开关可任意选取 通道 A 或通道 B,与其内部的低噪声可编程放 大器相连。通道 A 的可编程增益为 128 或 64, 对应的满额度差分输入信号幅值分别为±20mV 或±40mV。通道 B 则为固定的 32 增益,用于系 统参数检测。芯片内提供的稳压电源可以直接 向外部传感器和芯片内的 A/D 转换器提供电 源,系统板上无需另外的模拟电源。芯片内的 时钟振荡器不需要任何外接器件。上电自动复 位功能简化了开机的初始化过程。

1.2 芯片管脚与描述

hx711 stm32,stm32,单片机

hx711 stm32,stm32,单片机

VCC和GND引脚分别为HX711芯片的电源输入端口,供电2.6-5.5V。

DOUT是HX711芯片的数据输出引脚,它输出经过传感器A/D转换处理后的24位压力数据。

SCK是HX711芯片的时钟输入引脚,用于控制传感器进行A/D转换的时钟信号。

1.3 芯片特点

1.两路可选择差分输入

2.片内低噪声可编程放大器,可选增益为 32,64 和 128

3.片内稳压电路可直接向外部传感器和芯片内 A/D 转换器提供电源

4.片内时钟振荡器无需任何外接器件,必要时 也可使用外接晶振或时钟

5.上电自动复位电路 • 简单的数字控制和串口通讯:所有控制由管 脚输入,芯片内寄存器无需编程

6. 可选择 10Hz 或 80Hz 的输出数据速率

7.同步抑制 50Hz 和 60Hz 的电源干扰

8.耗电量(含稳压电源电路): 典型工作电流:< 1.6mA, 断电电流:< 1µA

9.工作电压范围:2.6 ~ 5.5V

10.工作温度范围:-40 ~ +85℃

11.16 管脚的 SOP-16 封装

二、测量原理

2.1 芯片原理图

hx711 stm32,stm32,单片机

2.2 压力传感器输出电压值

满量程输出电压=激励电压*灵敏度 1.0mv/v 例如:供电电压是 5v 乘以灵敏度 1.0mv/v=满量程 5mv。 相当于有 5Kg 重力产生时候产生 5mV 的电压。

2.3 芯片原理概述

711 模块 A 通道带有 128 倍信号增益,可以将 5mV 的电压放大 128 倍,然后采样输 出 24bit AD 转换的值,单片机通过指定时序将 24bit 数据读出。

2.4 数据输出,输入通道和增益选择时序图

hx711 stm32,stm32,单片机

1. 当DOUT(数据输出引脚)为高电平时,表明A/D转换器还未准备好输出数据,此时串口时钟输入信号PD_SCK应为低电平;

2. 当DOUT从高电平变低电平后,PD_SCK应输入25至27个不等的时钟脉冲(其中前24各时钟脉冲输出的是传感器测得的ADC数据,第25-27个时钟脉冲与数据无关,仅用于选择下一次传感器的输出增益和输出通道)。

hx711 stm32,stm32,单片机

 3. 在第一个时钟脉冲的上升沿会读取出输出的24位数据的最高位(即最高有效位,MSB),然后在接下来的时钟脉冲中,逐位输出这24位数据,从最高位到最低位。这个过程会一直持续,直到24位数据全部输出完成。传感器的数据输出是从高位到低位的。

2.5 程序计算原理

2.5.1 如何计算传感器供电电压?

       HX711 可以在产生 VAVDD 和 AGND 电压,即 711 模块上的 E+和 E-电压。 该电压通过 VAVDD=VBG(R1 +R2 )/R2 计算。 VBG 为模块儿基准电压 1.25v R1 = 20K,R2 = 8.2K 因此得出 VAVDD = 4.3V (为了降低功耗,该电压只在采样时刻才有输出,因此用万用表读取的值可能低于 4.3v,因 为万用表测量的是有效值。)

 2.5.2 如何将 AD 值反向转换为重力值?

        假设重力为 A Kg,(x<5Kg),测量出来的 AD 值为 y 传感器输出,发送给 AD 模块儿的电压为 A Kg * 4.3mV / 5Kg = 0.86A mV 经过 128 倍增益后为 128 * 0.86A = 110.08AmV 转换为 24bit 数字信号为 110.08A mV * 224 / 4.3V = 429496.7296A 所以 y = 429496.7296A 因此得出 A = y / 429496.7296 。

所以得出程序中计算公式 Weight_Shiwu = (unsigned long)((float)Weight_Shiwu/429.5);

特别注意: 因为不同的传感器斜率特性曲线不是完全一样,因此,每一个传感器需要矫正这里的 429.5 这个除数,才能达到精度很高。

#define GapValue 430

当发现测试出来的重量偏大时,增加该数值。 如果测试出来的重量偏小时,减小改数值。该值可以为小数,例如 429.5 等。

三、单片机介绍

3.1 STM32F103C8T6最小系统板

hx711 stm32,stm32,单片机

本文使用的开发板为STM32F103C8T6最小系统板,HX711芯片使用到的引脚为PB0和PB1引脚。

四、接线说明

4.1 称重模块实物图

hx711 stm32,stm32,单片机

4.2 压力传感器与HX711芯片接线图

hx711 stm32,stm32,单片机

4.3 HX711芯片与单片机接线

HX711芯片与单片机的接线取决于HX711.H中的引脚宏定义:

#define HX711_SCK PBout(0)// PB0
#define HX711_DOUT PBin(1)// PB1

此处定义了SCK时钟引脚为PB0,DOUT输出引脚为PB1,则模块上的SCK接PB0,DT接PB1。

如果需要修改引脚,直接修改此处的宏定义。

注意:这两个引脚在HX711.C中会先初始化,修改了宏定义之后需要去HX711.C中将初始化的引脚也进行修改! 引脚初始化函数为:void Init_HX711pin(void);

五、代码编写

5.1 HX711.C

#include "HX711.h"
#include "delay.h"

u32 HX711_Buffer;
u32 Weight_Maopi;
s32 Weight_Shiwu;
u8 Flag_Error = 0;

//校准参数
//因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很准确。
//当发现测试出来的重量偏大时,增加该数值。
//如果测试出来的重量偏小时,减小改数值。
//该值可以为小数
#define GapValue 106.5


void Init_HX711pin(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能PF端口时钟

	//HX711_SCK
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;				 // 端口配置
	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_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//输入上拉
    GPIO_Init(GPIOB, &GPIO_InitStructure);  
	
	GPIO_SetBits(GPIOB,GPIO_Pin_0);					//初始化设置为0
}



//****************************************************
//读取HX711
//****************************************************
u32 HX711_Read(void)	//增益128
{
	unsigned long count; 
	unsigned char i; 
  	HX711_DOUT=1; 
	delay_us(1);
  	HX711_SCK=0; 
  	count=0; 
  	while(HX711_DOUT); 
  	for(i=0;i<24;i++)
	{ 
	  	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();	
} 

//****************************************************
//称重
//****************************************************
void 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); 	//计算实物的实际重量
																		//因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正这里的GapValue这个除数。
																		//当发现测试出来的重量偏大时,增加该数值。
																		//如果测试出来的重量偏小时,减小改数值。
	}

	
}

代码 u32 HX711_Read(void) 说明:

函数中,count是一个无符号长整型变量,用于存储从HX711获取的数据。

i是一个无符号字符型变量,用于循环读取HX711芯片数据的次数。

延时1微秒用于确保时序的准确性。

函数通过设置HX711_DOUT和HX711_SCK的电平,使HX711传感器进入读取状态。接下来,函数使用while语句来等待DOUT的第一个脉冲到来。当DOUT为高电平时,表示HX711传感器还没有准备好,此时需要等待。当DOUT为低电平时,表示HX711传感器已经准备好,可以开始读取数据了。

当传感器准备好读取后,函数使用一个for循环来读取HX711芯片的i个数据位。在每个时钟周期中,函数将SCK设为高电平,然后将count左移一位。如果此时DOUT为高电平,则表示在该时钟周期内,HX711传感器向count的当前位中写入了1,此时需要将count的最低位设为1。

读取完24个数据位后,此时count变量中存储着24位的数据。此时需要将count的最高位设为1,以便扩展到32位。这可以通过将count异或0x800000来实现。

最后,函数将SCK设为高电平,并延时一个周期,然后将SCK设为低电平。该函数返回count变量作为结果,即为从HX711传感器读取到的数据。经过转换后即可得到被测物体的重量。

5.2 HX711.H 

#ifndef __HX711_H
#define __HX711_H

#include "sys.h"

#define HX711_SCK PBout(0)// PB0
#define HX711_DOUT PBin(1)// PB1


extern void Init_HX711pin(void);
extern u32 HX711_Read(void);
extern void Get_Maopi(void);
extern void Get_Weight(void);

extern u32 HX711_Buffer;
extern u32 Weight_Maopi;
extern s32 Weight_Shiwu;
extern u8 Flag_Error;

#endif

5.3 MAIN.C

5.3.1 添加头文件

#include "delay.h"
#include "HX711.h"

 5.3.2 初始化

Init_HX711pin();
delay_init();

延时函数需要自己加入,用于确保读取的准确性。

 5.3.3 初始化完成后首先进行一次去皮

Get_Maopi();				//称毛皮重量
delay_ms(2000);
Get_Maopi();				//重新获取毛皮重量

系统初始化过程中,需要确保压力传感器上没有物品,否则系统初始化会将当前的重量作为初始值,影响后面物体的实际重量。

5.3.4 测重函数

while(1)
	{
		Get_Weight();

	}

5.3.5 完整main函数(带显示屏显示)

#include "stm32f10x.h"
#include "delay.h"
#include "HX711.h"
#include "oled.h"
#include "stdio.h"

int main(void)
{
	Init_HX711pin();
	delay_init();
	
	OLED_Init();
	OLED_ColorTurn(0);//0正常显示,1 反色显示
	OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
	OLED_Clear();
	
	Get_Maopi();				//称毛皮重量
	delay_ms(2000);
	Get_Maopi();				//重新获取毛皮重量
	
	OLED_ShowChinese(0,0,0,16,1);  //当
	OLED_ShowChinese(16,0,1,16,1);  //前
	OLED_ShowChinese(32,0,2,16,1);  //重
	OLED_ShowChinese(48,0,3,16,1);  //量
	OLED_ShowChar(64,0,':',16,1);  //:
	OLED_ShowChar(112,0,'g',16,1);  //g
	
	while(1)
	{
		OLED_Refresh();
		Get_Weight();

	}
}

显示屏相关教学看我主页另外一篇文章:

0.96寸OLED显示屏显示字符串、汉字(stm32标准库)_stm32oled文字库-CSDN博客

六、测量效果

hx711 stm32,stm32,单片机

当前重量即单片机读取HX711芯片数据后经过转换得到的重量。文章来源地址https://www.toymoban.com/news/detail-852736.html

到了这里,关于STM32读取HX711压力传感器芯片数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32+hx711+称重传感器

    本项目使用主控stm32f103c8t6(最小系统核心板),称重模块hx711,串口打印到电脑端显示数值。   这个传感器内部是一组半桥应变片,使用方法可以有以下三种: 1、使用一只传感器配合外接电阻组成全桥测量,量程为一个传感器的量程:50kg。对外接电阻要求较高。 2、使用二只传

    2024年02月08日
    浏览(20)
  • 电子模块|压力传感器模块HX711---硬件介绍

    HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性

    2024年02月07日
    浏览(24)
  • 物联网AI MicroPython传感器学习 之 HX711称重传感器

    学物联网,来万物简单IoT物联网!! 下图是一款量程为5kg的称重传感器,采用悬臂梁方式安装。传感器主体结构是一个开孔金属条,金属条上下表面各贴有两个应变电阻,当金属条受力发生变形时时,应变电阻的阻值也会随之发生变化。电子秤的原理便是根据测量到的电阻变

    2024年02月03日
    浏览(32)
  • 称重传感器的24位A/D模块——HX711

    HX711是一种专门用于称重传感器的24位A/D模块。该模块可以将接收到的模拟信号转换为数字值,以便进行后续的处理和数据分析。下面是HX711计算公式: 首先,HX711采样得到的原始值是一个带符号的24位整数,它由以下3个字节组成:DOUT[23:0]、PD_SCK和GAIN。 通过向HX711模块发送脉

    2024年02月11日
    浏览(21)
  • STM32读取24位模数转换(24bit ADC)芯片HX711数据

    HX711是一款国产低成本24位ADC芯片,常用于与称重传感器配合实现体重计的应用。这里介绍STM32读取HX711的电路和代码实现。 HX711的内部原理如下图所示: 市面上有普通和带屏蔽的两种模块: STM32可直接与HX711进行连接,选择2个具有FT(5V耐压)的管脚,将其中对应时钟输出的管

    2023年04月08日
    浏览(19)
  • STM32开发(15)----芯片内部温度传感器

    本章介绍STM32芯片温度传感器的使用方法和获取方法。 STM32 有一个内部的温度传感器,可以用来测量 CPU 及周围的温度( 内部温度传感器更适合于检测温度的变化,需要测量精确温度的情况下,应使用外置传感器 )。对于 STM32F103来说,该温度传感器在内部和 ADC1_IN16 输入通道相

    2024年02月05日
    浏览(18)
  • 基于STM32F103——XGZP6847D压力传感器+串口打印

    XGZP6847D 型压力传感器尺寸小、易安装,广泛用于医疗电子、汽车电子、消费电子、运动健身器材、 物联网等领域 Reg0x30(测量命令寄存器) Measurement_control2:0( 工作模式 ) 010b ,组合采集模式(一次温度采集后立即进行一次传感器压力信号采集)。 011b ,休眠工作模式(定期的执

    2023年04月24日
    浏览(51)
  • stm32读取BH1750光照传感器

    BH1750是用IIC协议进行数据传输的。有SCL,SDA,VCC,GND四根线。下图是原理图 我们先看芯片手册的操作指令(下图)含有掉电,上电,连续转化,一次转化以及转化的分辨率等。具体可以看下面的表格写的很详细。写代码时候需要用到(非常关键)。 这里我也整理出来了一个指令

    2024年02月10日
    浏览(15)
  • STM32实现薄膜压力传感器数据采集(标准库和HAL库实现)

    单片机型号及压力传感器: STM32F103C8T6 最小系统板 压力传感器选用的是薄膜压力传感器 生活中经常遇到需要测量压力值,因此,考虑到这样的需求从网上买了一个薄膜压力传感器,实物图如下: 柔性薄膜压力传感器的 产品特点 : 超薄,厚度小于0.3mm 响应速度快 寿命长,通

    2024年02月02日
    浏览(21)
  • stm32读取DHT11温湿度传感器

    我们知道DHT11是单总线协议,只有一根数据线。 且内部有个上拉电路(下图)。那么数据线默认就是高电平那接下来就可以讲解主机如何和DHT11通讯的 读取DHT11的芯片手册,可以知道,DHT11一次完成的数据输出是40bit,高位先出。 格式:8bit湿度整数数据+8bit湿度小数数据 +8bi温

    2024年02月09日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包