STM32传感器模块编程实践(八) HX711压力传感器称重模块简介及驱动源码

一.概要

电子秤是将检测与转换技术、计算机技术、信息处理、数字技术等技术综合一体的现代新型称重仪器。主要以单片机作为中心控制单元,通过称重传感器进行模数转换单元。HX711采用了海芯科技集成电路专利技术,是一款专为高精度电子秤而设计的 24位 A/D 转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。

在这里插入图片描述

在这里插入图片描述

二.HX711主要技术指标

1.两路可选择差分输入
2.片内低噪声可编程放大器,可选增益为32,64 和128
3.片内稳压电路可直接向外部传感器和芯片内A/D 转换器提供电源
4.片内时钟振荡器无需任何外接器件,必要时也可使用外接晶振或时钟
5.简单的数字控制和串口通讯:所有控制由管脚输入,芯片内寄存器无需编程
6.可选择10Hz或80Hz的输出数据速率
7.耗电量(含稳压电源电路):
8.典型工作电流:< 1.6mA, 断电电流:< 1µA
9.工作电压范围:2.6 ~ 5.5V
10工作温度范围:-40 ~ +85℃

三.HX711模块参考原理图

HX711模块参考原理图如下:
在这里插入图片描述

模块应用电路
在这里插入图片描述

四.模块接线说明

在这里插入图片描述

在这里插入图片描述

用4根杜邦线连接开发板和称重模块
板子的GND—–模块的GND
板子的3V3——模块的VCC
板子的PB0——模块的SCK
板子的PB1——模块的DT

电桥传感器和称重模块
电桥传感器红色-------模块的E+
电桥传感器白色-------模块的A-
电桥传感器黑色-------模块的E-
电桥传感器绿色-------模块的A+

五.模块工作原理介绍

电阻应变式传感器是一种利用电阻应变效应,将各种力学量转换为电信号的结构型传感器。电阻应变片式电阻应变式传感器的核心元件,其工作原理是基于材料的电阻应变效应,电阻应变片即可单独作为传感器使用,通过粘贴在弹性体表面的电阻应变片将机械变形转换为电阻值的变化。随后,这个电阻变化被转换为电信号(电压或电流),再经过测量电路处理,最终以数字形式显示出被测物的质量。

在这里插入图片描述

在这里插入图片描述

HX711 模块 A 通道带有 128 倍信号增益,可以将 5mV 的电压放大 128 倍,然后采样输出 24bit AD 转换的值,单片机通过指定时序将 24bit 数据读出。
HX711可以在产生VAVDD和AGND电压,即HX711模块上的E+和E-电压该电压通过VAVDD=VBG(R1 +R2)/R2 计算。VBG 为模块儿基准电压 1.25v,R1=20K,R2=8.2K 因此得出 VAVDD=4.3V。
假设重力为AKg,(x<5Kg),测量出来的AD值为y传感器输出,发送给AD模块的电压为AKg4.3mV/5Kg=0.86A mV,经过 128倍增益后为1280.86A=110.08AmV,转换为24bit数字信号为110.08AmV*224/4.3V= 429496.7296A,所以y=429496.7296A。
因此得出A=y/429496.7296(y是测量出来的AD值)。

六.模块通讯协议介绍

串口通讯线由管脚 PD_SCK 和 DOUT 组成,用来输出数据,选择输入通道和增益。 当数据输出管脚 DOUT 为高电平时,表明A/D 转换器还未准备好输出数据,此时串口时钟输入信号PD_SCK 应为低电平。当DOUT从高电平变低电平后,PD_SCK应输入25至27个不等的时钟脉冲。其中第一个时钟脉冲
的上升沿将读出输出 24 位数据的最高位(MSB),直至第24个时钟脉冲完成,24位输出数据从最高位至最低位逐位输出完成。

在这里插入图片描述

七.STM32单片机与HX711模块实现重量测量实验

1.硬件准备

STLINK接STM32F103C8T6开发板,STLINK接电脑USB口。

用4根杜邦线连接开发板和称重模块
板子的GND—–模块的GND
板子的3V3——模块的VCC
板子的PB0——模块的SCK
板子的PB1——模块的DT

电桥传感器和称重模块
电桥传感器红色-------模块的E+
电桥传感器白色-------模块的A-
电桥传感器黑色-------模块的E-
电桥传感器绿色-------模块的A+

2.软件工程

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F103C8,再双击就创建新的工程
在这里插入图片描述
配置下载口引脚
在这里插入图片描述
配置外部晶振引脚
在这里插入图片描述

配置系统主频
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述

添加代码

添加HX711.C驱动文件
在这里插入图片描述

修改驱动引脚,跟板子接的匹配
在这里插入图片描述

添加称重代码
在这里插入图片描述

3.软件主要代码

int main(void)
{
  /* USER CODE BEGIN 1 */
  uint8_t Counter=0;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();//8M外部晶振,72M主频

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
	MX_GPIO_Init();//GPIO初始化
	HAL_Delay_us_init(SystemCoreClock);//初始化us
	/* USER CODE BEGIN 2 */
	OLED_Init();//OLED初始化  
	OLED_Clear();//清屏
	Init_HX711pin();//HX711模块初始化
	/* USER CODE END 2 */
	Get_Maopi();		//去皮,称到的重量就是物体本身的重量
	HAL_Delay(2000);//等待2秒
	Get_Maopi();		//去皮,称到的重量就是物体本身的重量
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	Counter++;
	if(Counter>=5)
	{
	Counter=0;
	OLED_Clear();//清屏
	}
	OLED_ShowCHinese(18,0,0);//光
	OLED_ShowCHinese(36,0,1);//子
	OLED_ShowCHinese(54,0,2);//物
	OLED_ShowCHinese(72,0,3);//联
	OLED_ShowCHinese(90,0,4);//网
	OLED_ShowCHinese(36,3,6);//电
	OLED_ShowCHinese(54,3,7);//子
	OLED_ShowCHinese(72,3,8);//秤
	Get_Weight();//读取重量	
	HAL_Delay(1000);//等待1000ms
	OLED_ShowNum(18,6,Weight_Shiwu,4,16);//显示重量
	OLED_ShowCHinese(72,6,5);//克
		
  }
  /* USER CODE END 3 */
}

//****************************************************
//获取托盘的重量,方便后面减去托盘的重量,就是实际实物的重量
//****************************************************
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 = (int32_t)((float)Weight_Shiwu/GapValue); 	//计算实物的实际重量
																		//因为不同的传感器特性曲线不一样,因此,每一个传感器需要矫正这里的GapValue这个除数。
																		//当发现测试出来的重量偏大时,增加该数值。
																		//如果测试出来的重量偏小时,减小改数值。
	}

	
}

4.实验效果

称重一块开发板的重量
在这里插入图片描述

八.小结

HX711压力传感器广泛应用于重量测量、压力监测等场景,使用STM32驱动该模块,能开发出电子秤等产品。

### HX711 称重传感器代码移植示例 对于HX711称重传感器,在GD32F470微控制器上的代码移植主要涉及初始化设置、数据读取以及处理逻辑。以下是具体实现方式: #### 初始化配置 根据硬件连接情况,需先定义好相应的GPIO引脚并完成基本的外设初始化工作。 ```c #include "gd32f4xx.h" // 定义HX711使用的IO端口 #define SCK_PIN GPIO_PIN_8 #define DT_PIN GPIO_PIN_9 #define GPIO_PORT GPIOB void hx711_gpio_init(void){ rcu_periph_clock_enable(RCU_GPIOB); // 开启GPIOB时钟 gpio_mode_set(GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SCK_PIN); gpio_output_options_set(GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SCK_PIN); gpio_mode_set(GPIO_PORT, GPIO_MODE_INPUT, GPIO_PUPD_PULLDOWN, DT_PIN); } ``` 此部分完成了对SCK和DT信号线对应的物理管脚设定及其属性调整[^1]。 #### 数据交互函数编写 接着构建用于与HX711通信的核心功能——发送时钟脉冲以获取测量结果。 ```c uint32_t read_hx711(void){ uint32_t count = 0; while(gpio_input_bit_get(GPIO_PORT, DT_PIN)); // 等待DT变为低电平表示准备就绪 for(int i=0; i<24; ++i){ // 进行24位的数据接收循环 gpio_bit_reset(GPIO_PORT, SCK_PIN); // 下降沿触发采样 if(i >= 1 && (gpio_input_bit_get(GPIO_PORT, DT_PIN))) { count |= (1 << ((23-i)-1)); } delay_us(1); // 微秒级延时确保稳定转换时间 gpio_bit_set(GPIO_PORT, SCK_PIN); // 上升沿结束一次传输 } gpio_bit_reset(GPIO_PORT, SCK_PIN); // 额外下降沿使能通道切换(可选) gpio_bit_set(GPIO_PORT, SCK_PIN); return count ^ 0x800000; // 对最高位求反补偿偏移误差 } ``` 上述代码实现了完整的SPI-like通讯流程,并返回由HX711计算得出的原始数值。 #### 测试验证环节 为了检验程序是否正常运作,可以加入简单的测试用例来打印输出每次读数的结果。 ```c int main(){ usart_config(); // 假设有现成串口调试工具可用 hx711_gpio_init(); while(1){ uint32_t raw_data = read_hx711(); printf("Raw Data: %lu\r\n",raw_data); delay_ms(1000); // 每隔一秒刷新一次显示 } } ``` 这段主函数不断调用`read_hx711()`方法并将获得的信息经由UART接口传送给上位机查看。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值