【STM32技巧】HX711称重芯片详细说明

2023-11-11

概述

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

如何计算传感器供电电压

HX711 可以在产生 VAVDD 和 AGND 电压,即 711 模块上的 E+和 E-电压。
该电压通过 :

VAVDD=VBG(R1 +R2 )/R2

例如:

VBG 为模块儿基准电压 1.25V,R1 = 20K,R2 = 8.2K,因此得出 VAVDD = 4.3V

(为了降低功耗,该电压只在采样时刻才有输出,因此用万用表读取的值可能低于 4.3v,因为万用表测量的是有效值。)

测重原理讲解

满量程输出电压 = 激励电压 * 灵敏度 1.0mv/v
例如:

供电电压是 5V 乘以灵敏度 1.0mV/V = 满量程 5mV。
相当于有 5Kg 重力产生时候产生 5mV 的电压。

如何将 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
这个除数,才能达到精度很高。

压力传感器安装方法

在这里插入图片描述

知识点:官方例程为什么要将读出的AD数据 异或 0x800000

count :是读出的AD数据
count :读出的数据是24位有符号,二进制补码是: 0x800000 - 0x7FFFFF-8388607 ~ 8388607)				
count = count ^ 0x800000;   这里的意思是将二进制补码换算为 0 ~ 16777214,如果采集到的	INP-INN ≈ 0,那么 count = count ^ 0x800000 = 838860716777214 / 2, 误差的大小实际值也会在这数增大减少)		
本次例程中,实际测试没有用到:count = count ^ 0x800000,直接使用AD原始数据 count >> 8 后的数据,做成16位精度


实际测试例程,STM32测试例程

注意:本人使用100kg的拉力传感器测试,灵敏度是2mV/V

#include "includes.h"


/*
*********************************************************************************************************
*                                             寄存器
*********************************************************************************************************
*/
#define  DWT_CYCCNT  *(volatile unsigned int *)0xE0001004
#define  DWT_CR      *(volatile unsigned int *)0xE0001000
#define  DEM_CR      *(volatile unsigned int *)0xE000EDFC
#define  DBGMCU_CR   *(volatile unsigned int *)0xE0042004

#define  DEM_CR_TRCENA               (1 << 24)
#define  DWT_CR_CYCCNTENA            (1 <<  0)

#define		WEIGHT_CAP_NUM							1		//重量采集数量 滤波使用

uint8_t		ucWeightCapCompleteFlag= 0;     //重量采集完成标志
uint8_t		ucWeightCapCount 			 = 0;			//重量采集计数
int32_t   ilWeightRawDataAddToal = 0;			//重量AD数据累计
int16_t		iWeightRawData = 0;							//重量AD数据


/*
*********************************************************************************************************
*	函 数 名: bsp_InitDWT
*	功能说明: 初始化DWT. 
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitDWT(void)
{
	DEM_CR         |= (unsigned int)DEM_CR_TRCENA;   /* Enable Cortex-M4's DWT CYCCNT reg.  */
	DWT_CYCCNT      = (unsigned int)0u;
	DWT_CR         |= (unsigned int)DWT_CR_CYCCNTENA;
}

/*
*********************************************************************************************************
*	函 数 名: DWT_DelayUS
*	功能说明: 这里的延时采用CPU的内部计数实现,32位计数器
*             	OSSchedLock(&err);
*				bsp_DelayUS(5);
*				OSSchedUnlock(&err); 根据实际情况看看是否需要加调度锁或选择关中断
*	形    参: _ulDelayTime  延迟长度,单位1 us
*	返 回 值: 无
*   说    明: 1. 主频168MHz的情况下,32位计数器计满是2^32/168000000 = 25.565秒
*                建议使用本函数做延迟的话,延迟在1秒以下。  
*             2. 实际通过示波器测试,微妙延迟函数比实际设置实际多运行0.25us左右的时间。
*             下面数据测试条件:
*             (1). MDK5.15,优化等级0, 不同的MDK优化等级对其没有影响。
*             (2). STM32F407IGT6
*             (3). 测试方法:
*				 GPIOI->BSRRL = GPIO_Pin_8;
*				 bsp_DelayUS(10);
*				 GPIOI->BSRRH = GPIO_Pin_8;
*             -------------------------------------------
*                测试                 实际执行
*             bsp_DelayUS(1)          1.2360us
*             bsp_DelayUS(2)          2.256us
*             bsp_DelayUS(3)          3.256us
*             bsp_DelayUS(4)          4.256us
*             bsp_DelayUS(5)          5.276us
*             bsp_DelayUS(6)          6.276us
*             bsp_DelayUS(7)          7.276us
*             bsp_DelayUS(8)          8.276us
*             bsp_DelayUS(9)          9.276us
*             bsp_DelayUS(10)         10.28us
*            3. 两个32位无符号数相减,获取的结果再赋值给32位无符号数依然可以正确的获取差值。
*              假如A,B,C都是32位无符号数。
*              如果A > B  那么A - B = C,这个很好理解,完全没有问题
*              如果A < B  那么A - B = C, C的数值就是0xFFFFFFFF - B + A + 1。这一点要特别注意,正好用于本函数。
*********************************************************************************************************
*/
void DWT_DelayUS(uint32_t _ulDelayTime)
{
  uint32_t tCnt, tDelayCnt;
	uint32_t tStart;
		
	tStart = DWT_CYCCNT;                                     /* 刚进入时的计数器值 */
	tCnt = 0;
	tDelayCnt = _ulDelayTime * (SystemCoreClock / 1000000);	 /* 需要的节拍数 */ 		      

	while(tCnt < tDelayCnt)
	{
		tCnt = DWT_CYCCNT - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */	
	}
}


/*
*********************************************************************************************************
*	函 数 名: HX711_GPIOInit
*	功能说明: 重量芯片HX711 GPIO初始化
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void  HX711_GPIOInit(void)
{

	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	//使能PORTA

 	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;				      //PA7 推挽输出 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		  //推挽输出
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;				      //PA6 推挽输出 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 		  	//上拉输入
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
}


/*
*********************************************************************************************************
*	函 数 名: HX711_Init
*	功能说明: 重量芯片HX711初始化
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/

void HX711_Init(void)
{
	CH376_SPI_SCS = 1;					//CH376 片选失能	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, DISABLE);	
	SPI_Cmd(SPI1, DISABLE);			//禁止SPI
	HX711_GPIOInit();						//初始化IO
}


/*
*********************************************************************************************************
*	函 数 名: Task_WeightCap
*	功能说明: 重量采集任务
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void Task_WeightCap(void)
{
	uint32_t	count = 0;
	int16_t		raw_data = 0;
	uint8_t		i;	
	HX711_Init();						//HX711重新初始化
	
	
	ADSK = 0;
	count= 0;
	while(ADDO);
	
	for(i=0; i<24; i++)
	{	
		ADSK = 1;
		DWT_DelayUS(1);
		count = count << 1;
		ADSK = 0;
		DWT_DelayUS(1);

		if(ADDO) 
		{
			count++;		
		}
	}
	
	//第25个时钟信号
	ADSK=1;
	DWT_DelayUS(1);
	ADSK=0;
	DWT_DelayUS(1);
	
	
	/*
		count :读出的数据是24位有符号,二进制补码是: 0x800000 - 0x7FFFFF (-8388607 ~ 8388607)				
		count = count ^ 0x800000;   这里的意思是将二进制补码换算为 0 ~ 16777214,如果采集到的	INP-INN ≈ 0,那么 count = count ^ 0x800000 = 8388607 (16777214 / 2, 误差的大小实际值也会在这数增大减少)		
		这里不用 count = count ^ 0x800000; 这么换算,直接使用 count >> 8 后的数据,做成16位精度
		
		1. 拉力传感器灵敏度S 2mV/V,  实际供电电源Uin 5.08V,满负载输出电压:Uout = S * Uin ≈ 10.16mV
		2. 这里是128倍放大 10.16mV * 128 = 1300.48mV
		3. 16位精度最小分辨率 Uin / 2^16 ≈ 0.00007751V,满量程输出AD值:1300.48	mV / 0.00007751V ≈ 16778
		4. 1g 对应的电压值是:10.16mV / 100kg = 0.0000001016V  换算实际的AD值:0.0000001016V * 128(放大倍数)/ 0.00007752V ≈ 0.16778
		5. 满量程AD值 16778 / 0.16778(1gAD值) = 实际的重量
		6. 注意:使用前要去皮
	*/
	
	
	//count = count ^ 0x800000;
	
	raw_data = count >> 8;
	
	ilWeightRawDataAddToal = raw_data + ilWeightRawDataAddToal;
	ucWeightCapCount++;
	
	if(ucWeightCapCount == WEIGHT_CAP_NUM)
	{
		ucWeightCapCount 				= 0;
		iWeightRawData = ilWeightRawDataAddToal / WEIGHT_CAP_NUM;
		ilWeightRawDataAddToal  = 0;
		ucWeightCapCompleteFlag = 1;
	}
	//raw_data = raw_data ^ 0x8000;
//	if(raw_data < 0)
//	{
//		raw_data = -raw_data;
//	}
	
//  printf("count %d raw_data %d  %f  %f kg\r\n", count, raw_data, (((double)raw_data) * 0.00007751) / 128, (float)(raw_data / 0.16778) / 1000);													//数据打印出来	
}

/*
*********************************************************************************************************
*	函 数 名: GetWeightRawData
*	功能说明: 得到重量的原始值 
*	形    参: iRawData 原始值
*	返 回 值: 1 已经得到 0 没有得到
*********************************************************************************************************
*/
uint8_t  GetWeightRawData(int16_t *iRawData)
{
		if(ucWeightCapCompleteFlag == 1)
		{
			*iRawData = iWeightRawData;
			ucWeightCapCompleteFlag = 0;
			return 1;
		}
		
		return 0;
}




两点直线方程校准算法,用于校准实际数据

	注意: 使用直线方程的首要条件是 重量传感器的线性度要好,可以使用标准砝码测试

/*
*********************************************************************************************************
*	函 数 名: CaculTwoPoint
*	功能说明: 根据2点直线方程,计算Y值
*	形    参: 2个点的坐标和x输入量,x1: 最小千克的AD值,y1:最小千克值,x2: 最大千克的AD值, 
*	y2: 最大千克值, x:输入的当前AD值
*	返 回 值: x对应的y值  返回实际的重量
*********************************************************************************************************
*/
static float  CaculTwoPoint(int16_t x1, int16_t y1, int16_t x2, int16_t y2, int16_t x)
{
  float value;
  value = y1 + (float)((int64_t)(y2 - y1) * (x - x1)) / (x2 - x1);
	return value;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STM32技巧】HX711称重芯片详细说明 的相关文章

  • 使用 GCC 编译器为代码的特定部分保留寄存器

    是否可以为 C 代码的特定部分保留寄存器 ffixed reg 选项或声明全局寄存器变量不是我正在寻找的答案 我想保留特定范围 比如说特定函数 的寄存器值 使用局部寄存器变量是不可能的 因为它不能保证在整个范围内保留寄存器的值 我正在寻找类
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • 警告:可加载部分“my_section”位于 ELF 段之外

    我使用 Cortex R4 的 Arm Compiler v6 9 构建了一个 axf elf 文件 但是 当我使用 Arm MCU Eclipse J link GDB 插件将其加载到目标时 它无法加载我的段的初始化数据 如果我使用 Se
  • ARM Neon:如何从 uint8x16_t 转换为 uint8x8x2_t?

    我最近发现了关于vreinterpret q dsttype src类型转换运算符 https stackoverflow com a 43519190 2436175 但是 这似乎不支持所描述的数据类型的转换这个链接 http infoc
  • 在 ARM 处理器上执行存储在外部 SPI 闪存中的程序

    我有一个 ARM 处理器 能够与外部闪存芯片连接 写入芯片的是为 ARM 架构编译的程序 可供执行 我需要知道如何将这些数据从外部闪存获取到 ARM 处理器上以供执行 我可以提前运行某种复制例程 将数据复制到可执行内存空间吗 我想我可以 但
  • C 嵌入式应用程序中 time() 函数的问题

    我在用time 在 ARM 微控制器上 处理器一到达此函数就会重新启动 奇怪的是 当我处于调试模式时 代码运行得很好 但一旦我想将其应用到独立模式 我就会遇到重置 我是否忽略了什么 这个功能有替代品吗 代码部分是这样的 include
  • 源和目标具有不同的 EABI 版本

    我正在尝试使用 ARM 工具链编译 so 文件 但是我不断收到这个错误 错误 源对象的 EABI 版本为 0 但目标对象的 EABI 版本为 5 我无法更改工具链中的任何内容 因为我必须使用给定的工具链 我以前从未见过这个错误 我使用了这个
  • 如何在 Android 设备上运行 VS Code [重复]

    这个问题在这里已经有答案了 我有 Galaxy Tab S6 它具有替代笔记本电脑的很酷的功能 例如连接鼠标和键盘 但不幸的是它运行 Android 操作系统 并且没有很多开发应用程序可用于 Android 所以我想是否有一个选项可以在至少
  • arm-thumb指令集的blx指令如何支持4MB范围

    读自https www keil com support man docs armasm armasm dom1361289866046 htm https www keil com support man docs armasm arma
  • 交叉编译 Qt 4.7 时出现“非法指令”

    我已经在这个问题上苦苦挣扎了一个多星期了 但仍然找不到解决方案 我正在尝试为 ARM 设备交叉编译 Qt 4 7 嵌入式开源版本 构建过程本身可以顺利完成 但生成的二进制文件似乎包含处理器无法理解的指令 构建主机是 i386 上的 Debi
  • ARM 调用约定是否允许函数不将 LR 存储到堆栈中?

    正如标题所示 我在理解 ARM 架构的调用约定时遇到问题 特别是 我仍然很难知道当你调用子程序时 LR 寄存器会发生什么 我认为 当您进入子程序时 处理 LR 寄存器的最明显 最安全的方法是将其存储到堆栈中 但该行为没有出现在文档中 因此我
  • 使用 Android NDK 使用 -fsigned-char 进行构建安全吗?

    为了与其他平台保持一致 我需要使用signed char在我正在处理的一些本机代码中 但默认情况下在Android NDK上char类型是unsigned 我尝试明确使用signed char类型 但它生成太多警告differ in sig
  • 是否可以将 SpaCy 安装到 Raspberry Pi 4 Raspbian Buster

    我一整天都在安装 SpaCy sudo pip install U spacy Looking in indexes https pypi org simple https www piwheels org simple Collectin
  • 在 Intel 机器上构建 Apple Silicon 二进制文件

    如何在 macOS 11 Intel 上编译 C 项目以在 Silicon 上运行 我当前的构建脚本很简单 configure make sudo make install 我尝试过使用 host and target标志与aarch64
  • 了解 U-Boot 内存占用

    我不明白加载 U Boot 时 RAM 中发生了什么 我正在开发 Xilinx Zynq ZC702 评估套件 并尝试使用 U Boot 在其上加载 Linux 内核 于是我使用Xilinx工具Vivado和SDK生成了一个BOOT bin
  • AOSP 的“午餐”组合是什么意思?我需要选择什么?

    我是 Android 设备 ROM 开发的新手 无论如何 我现在正在为具有 64 位处理器的中国设备构建 AOSP 我按照 source android com 上的菜单进行操作 当我运行 午餐 命令时 终端显示 午餐菜单 选择一个组合 我
  • 使用 NEON 内在函数除以浮点数

    我当时正在处理四个像素的图像 这是在armv7对于 Android 应用程序 我想分一个float32x4 t向量由另一个向量组成 但其中的数字与大约不同0 7 to 3 85 在我看来 除法的唯一方法是使用右移 但这是针对一个数字2 n
  • iPhone 3GS 上的 ARM 与 Thumb 性能比较,非浮点代码

    我想知道是否有人有关于 iPhone 3GS 上 ARM 与 Thumb 代码性能的硬性数据 特别是对于非浮点 VFP 或 NEON 代码 我知道 Thumb 模式下的浮点性能问题 更大的 ARM 指令的额外代码大小是否会在某个时刻成为性能
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s

随机推荐

  • 预处理命令 文件包括

    预处理命令 源程序中以 开头的行称为预处理指令 预处理指令并不是C语言的语法成分 而是传给编译程序的指令 包括 宏定义 define undef 文件包含 include 条件编译 if ifdef else elif endif 其他 l
  • Webmin--一个用于Linux基于Web的系统管理工具

    Webmin是一个用于Linux系统管理的开源的基于web的系统管理配置工具 有了这个工具的帮助 我们可以管理内部的系统配置 诸如设置用户账户 磁盘配额 像Apache DNS PHP MySQL 文件共享的服务等 Webmin应用程序是基
  • 问题 J: 36.for循环求阶乘

    题目描述 利用for循环来计算n 的值 输入格式 输入一个整数n n lt 20 输出格式 输出n 的结果是多少 输入样例 3 输出样例 6 这是一道肥肠煎蛋的递归题 边界是n 0 注意定义函数时要用long long哦 完整代码如下 in
  • c++ 第五章 模板

    模板 程序 算法 数据结构 数据结构 能够存储任意类型 算法 能够操作存储任意类型数据结构 泛型编程 泛型编程 面向过程编程 用模板实现函数过程 面向对象编程 用模板实现类 一 基本范例 a 模板定义是以template关键字开头 b 类型
  • Redis高可用高性能缓存的应用系列03 - 缓存过期淘汰策略LRU、LFU

    概述 Redis高可用高性能缓存的应用系列的第3篇 主要介绍Redis缓存过期淘汰策略和内存淘汰策略回收的LRU和LFU的知识点进行说明 Redis过期键删除策略 Redis设置key时 都会设置一个过期时间 那么当过期时间到了都是怎么处理
  • 【地理空间】轨迹相似度算法(DTW、LCSS)

    序列相似度 在现实生活中我们常常需要比较两串数字的相似度 比如两串数字 一维 再比如两条轨迹 二维 那么如何计算两个序列的相似度呢 有人提出了DTW算法 一种计算序列距离的方法 DTW算法原理 算法原理主要参考 https blog csd
  • Databend 设计概述

    Databend 是一个开源的 完全面向云架构的新式数仓 它提供快速的弹性扩展能力 并结合云的弹性 简单性和低成本 使 Data Cloud 构建变得更加容易 Databend 把数据存储在像 AWS S3 Azure Blob 这些云上的
  • JDBC连接数据库的几种方法与简单解析

    首先要知道jdbc 使用Java代码发送sql语句的技术就是jdbc技术 即jdbc是一个接口 用于不同的数据库 oracle mysql sqlserver 的操作 使用jdbc发送sql语句的前提 登录数据库服务器 连接数据库服务器 数
  • windows杀死进程命令

    有时候由于病毒或其他原因 启动了一系列的进程 并且有时杀了这个 又多了那个 这时候我们可以特定选择一种杀 很多人对windows杀死进程命令比较感兴趣 所以今天小编就为大家来详细讲一讲windows命令行关闭进程教程 感兴趣的用户一起来看看
  • LNK2001无法解析的外部符号 _vfprintf

    legacy stdio definitions lib
  • 感动了千千万万人们的西单女孩

    任月丽出生在河北涿州偏僻的农村 由于父母多病 自小由奶奶带大 为了减轻家庭负担 年仅16岁的她孤身一人来到北京 开始在一小餐馆打工 满1个月后老板没给工资 流浪街头时看到有地下歌手在卖唱 从小就喜欢唱歌的她萌生了也要唱歌的想法 遂与一流浪歌
  • 步步为营--深入研究react技术栈 系列一 (jsx、组件、数据流)

    相关技术博客 1 步步为营 深入研究react技术栈 系列一 jsx 组件 数据流 2 步步为营 深入研究react技术栈 系列二 事件 组件性能优化 更多系列文章持续更新中 一 React简介 React 是一个用于构建用户界面的 Jav
  • python出现indexerror,Python:IndexError:列表索引超出范围错误

    Updated look bottom I am stuck I get a IndexError list index out of range Error def makeInverseIndex strlist numStrList
  • 常用4线风扇接口定义

    4根线分别是GND VCC FG PWM 位置可能不同 FG是转速信号 用于CPU侦测转速 转速 频率 30 4极风扇 PWM通过方波占空比控制转速 PWM接地 最低转速 PWM不接最高转速 频率25KHZ 一般Duty 0 20 转速是相
  • 图灵赠书——程序员11月书单

    10月书讯中奖名单 wudalang gd 精通Git 第2版 chszs CCNA学习指南 路由和交换认证 第2版 sujun10 同构JavaScript应用开发 dongfeng9ge 学习JavaScript数据结构与算法 第2版
  • 目标检测基础

    什么是目标检测 简单来说就是 检测图片中物体所在的位置 本文只介绍用深度学习的方法进行目标检测 同过举出几个特性来帮助各位理解目标检测任务 同时建议学习目标检测应先具备物体人工智能算法基础和物体分类现实基础 特性1 Bounding Box
  • 解决华为手机不能用USB链接电脑的问题

    可能是由于USB空松动 所以总是安装不完驱动程序 USB调试开关自动关闭 导致安装不完驱动程序 手机的USB调试开关就关闭了 可以这样解决 以下为花粉俱乐部转载 我们经常这样的事情 打开USB调试之后 本来用得好好的 点了下USB连接选项
  • VS 静态库lib如何依赖动态库dll

    一般来说 vs可以提供正常的依赖输入窗口用于依赖动态库 但是当工程设置生成静态库之后 VS默认不支持给静态库增加依赖动态库 链接器选项没有了 此时只能够把静态库所依赖的动态库也改成静态库 这样这个静态库才能被正常编译 否则编译的时候会报错
  • golang并发编程基础

    go并发编程 1waitgroup WaitGroup就是等待所有的goroutine全部执行完毕 add方式和Down方法要配套使用 package main import fmt sync func main var wq sync W
  • 【STM32技巧】HX711称重芯片详细说明

    概述 HX711 模块 A 通道带有 128 倍信号增益 可以将 5mV 的电压放大 128 倍 然后采样输 出 24bit AD 转换的值 单片机通过指定时序将 24bit 数据读出 如何计算传感器供电电压 HX711 可以在产生 VAV