在许多嵌入式项目中,如智能家居、物流管理等,都需要用到精确的重量测量功能。STM32F407作为一款高性能的微控制器,搭配HX711称重传感器,可以轻松实现这一需求。本文将详细介绍如何将STM32F407与HX711称重传感器进行连接和编程,以实现重量数据的采集和显示。
一、硬件准备
STM32F407开发板 :作为主控芯片,负责数据处理和通信。
HX711称重传感器模块:用于将重量信号转换为数字信号。
RS232打印 :用于显示重量数据,方便直观读取。
杜邦线 :用于连接各个模块。
电源适配器 :为开发板和传感器模块供电。
二、硬件连接
1、连接STM32F407与HX711
2、将STM32F407的PE7引脚连接至HX711的SCK引脚。
3、将STM32F407的PE5引脚连接至HX711的DT引脚。
4、将STM32F407的5V和GND引脚分别连接至HX711的VCC和GND引脚。
5、将RS232接电脑
三、软件设计
- 开发环境搭建
软件工具:使用Keil uVision5进行项目开发和编译。
固件库:导入STM32HAL库。 - 驱动代码编写
hx711.c
#include "stm32f4xx_hal.h"
#include "hx711.h"
#include "./usart/bsp_debug_usart.h"
// HX711引脚定义
#define HX711_SCK_PIN GPIO_PIN_7
#define HX711_SCK_PORT GPIOE
#define HX711_DT_PIN GPIO_PIN_5
#define HX711_DT_PORT GPIOE
#define W_SCK(X) HAL_GPIO_WritePin(HX711_SCK_PORT, HX711_SCK_PIN, (GPIO_PinState)(X))
#define R_DT HAL_GPIO_ReadPin(HX711_DT_PORT, HX711_DT_PIN)
// 校准参数
#define GapValue 3125.91
uint32_t HX711_Buffer;
uint32_t Weight_Maopi;
int32_t Weight_Zhengshu;
void HX711_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能GPIOB时钟
__HAL_RCC_GPIOE_CLK_ENABLE();
// SCK引脚配置
GPIO_InitStruct.Pin = HX711_SCK_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(HX711_SCK_PORT, &GPIO_InitStruct);
// DT引脚配置
GPIO_InitStruct.Pin = HX711_DT_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(HX711_DT_PORT, &GPIO_InitStruct);
// 初始化SCK为高电平
W_SCK(1);
}
unsigned long HX711_Read(void) {
unsigned long Count = 0;
uint8_t i;
W_SCK(0); // 拉低SCK
while (R_DT); // 等待DT拉低
for (i = 0; i < 24; i++) {
W_SCK(1);
//Delay_us(2);
Count = Count << 1; // 左移一位
W_SCK(0);
if (R_DT) {
Count++;
}
}
W_SCK(1);
Count = Count ^ 0x800000; // 最高位取反
W_SCK(0);
return Count;
}
void Get_Maopi(void) {
Weight_Maopi = HX711_Read();
//printf("Weight_Maopi=%d\n",Weight_Maopi);
}
unsigned long HX711_Read_Stable(uint8_t readTimes) {
unsigned long sum = 0;
uint8_t i;
for (i = 0; i < readTimes; i++) {
sum += HX711_Read();
}
return (sum / readTimes);
}
unsigned long Get_Weight(void) {
float Weight_tmp;
int32_t xiaoshu;
HX711_Buffer = HX711_Read_Stable(10);
if (HX711_Buffer > Weight_Maopi) {
Weight_Zhengshu = HX711_Buffer - Weight_Maopi;
Weight_Zhengshu = (int32_t)(((float)Weight_Zhengshu / GapValue) * 20 * 0.8 / 1.082);
return Weight_Zhengshu;
} else {
return 0;
}
}
hx711.h
#ifndef __HX711_H
#define __HX711_H
#include "stm32f4xx_hal.h"
unsigned long HX711_Read(void);
void HX711_Init(void);
void Get_Maopi(void);
unsigned long Get_Weight(void);
#endif
四、效果如下:
在这里插入图片描述