feat: 添加HX711称重传感器支持并清理旧文档

- 新增HX711称重传感器驱动(bsp_hx711.c/h)
- 添加HX711相关文档和README
- 更新MP3驱动和FreeRTOS配置
- 修改CMakeLists.txt构建配置
- 删除旧的DX-WF24 WiFi模块开发文档和示例代码
- 整理Development_Docs目录结构
This commit is contained in:
2026-02-25 14:06:47 +08:00
parent 97d6d10731
commit d184d96052
1369 changed files with 383 additions and 406067 deletions

View File

@@ -0,0 +1,46 @@
# HX711 称重传感器驱动
## 目录结构
- `bsp_hx711.h` - 驱动头文件
- `bsp_hx711.c` - 驱动源文件
- `README.md` - 说明文档
## 功能特性
- 支持HX711称重传感器的基本操作
- 提供单次读取和多次平均读取功能
- 支持校准功能
- 支持重量计算
## 硬件连接
- HX711_SCK -> PA3
- HX711_DOUT -> PA2
## 使用说明
### 1. 初始化
```c
HX711_Init();
```
### 2. 校准
```c
float calibration_factor = 0.0f;
HX711_Calibration(&calibration_factor);
```
### 3. 读取重量
```c
float weight = HX711_GetWeight(calibration_factor, 10);
elog_info("HX711","重量: %.2fg\r\n", weight);
```
### 4. 直接读取原始数据
```c
uint32_t raw_data = HX711_ReadData(HX711_GAIN_128);
```
## 注意事项
- GPIO初始化已在gpio.c中完成无需重复初始化
- 校准过程需要放置已知重量的物体
- 建议使用多次采样平均以提高精度
- 增益设置建议使用HX711_GAIN_128以获得最高精度

View File

@@ -0,0 +1,96 @@
#include "bsp_hx711.h"
// 全局变量(零点偏移值、标定系数)
int32_t hx711_zero_offset = 0; // 零点偏移空载时的AD值
float hx711_scale = 0.002762; // 标定系数(重量/AD差值
// #################### 基础函数 ####################
void delay_us(uint32_t us) {
uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
while (delay--) {
;
}
}
// 初始化HX711引脚SCK输出DOUT输入
void HX711_Init(void) {
}
// 读取单次AD原始数据gain增益选择
int32_t HX711_ReadData(uint8_t gain) {
int32_t data = 0;
uint8_t i = 0;
// 等待数据就绪DOUT变低
while (HAL_GPIO_ReadPin(HX711_DOUT_GPIO_Port, HX711_DOUT_Pin) == GPIO_PIN_SET);
// 读取24位数据先MSB后LSB
for (i = 0; i < 24; i++) {
// 发送时钟脉冲SCK高电平
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_SET);
delay_us(1); // 延时1us保证时序稳定关键
// 移位读取数据DOUT为当前位
data |= (HAL_GPIO_ReadPin(HX711_DOUT_GPIO_Port, HX711_DOUT_Pin) << (23 - i));
// 时钟脉冲拉低
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_RESET);
delay_us(1);
}
// 发送增益选择脉冲1~3个
for (i = 0; i < gain; i++) {
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_SET);
delay_us(1);
HAL_GPIO_WritePin(HX711_SCK_GPIO_Port, HX711_SCK_Pin, GPIO_PIN_RESET);
delay_us(1);
}
// 处理24位有符号数据HX711输出为二进制补码
if (data & 0x800000) { // 最高位为1表示负数转换为十进制
data |= ~0xFFFFFF; // 扩展符号位到32位int32_t
}
return data;
}
// #################### 校准与重量计算 ####################
// 校准零点(空载时调用,消除传感器自重误差)
void HX711_CalibrateZero(void) {
uint8_t i = 0;
int32_t temp = 0;
hx711_zero_offset = 0;
// 采样10次取平均值提高零点精度
for (i = 0; i < 10; i++) {
temp += HX711_ReadData(HX711_GAIN_128);
HAL_Delay(10); // 采样间隔
}
hx711_zero_offset = temp / 10; // 零点偏移值 = 空载平均AD值
}
// 标定量程放已知重量的物体后调用计算AD值与重量的比例
void HX711_CalibrateScale(float weight) {
uint8_t i = 0;
int32_t temp = 0;
int32_t ad_diff = 0;
// 采样10次取平均AD值
for (i = 0; i < 10; i++) {
temp += HX711_ReadData(HX711_GAIN_128);
HAL_Delay(10);
}
temp = temp / 10;
// 计算AD差值加载后AD值 - 零点AD值
ad_diff = temp - hx711_zero_offset;
if (ad_diff <= 0) {
hx711_scale = 1.0f; // 异常情况,避免除零
return;
}
// 标定系数 = 已知重量 / AD差值后续通过AD差值计算重量
hx711_scale = weight / (float)ad_diff;
}
// 获取重量sample_num采样次数次数越多精度越高推荐10~20次
float HX711_GetWeight(uint8_t sample_num) {
uint8_t i = 0;
int32_t temp = 0;
float weight = 0.0f;
if (sample_num == 0) sample_num = 1; // 避免采样次数为0
// 多次采样取平均
for (i = 0; i < sample_num; i++) {
temp += HX711_ReadData(HX711_GAIN_128);
HAL_Delay(5);
}
temp = temp / sample_num; // 平均AD值
// 计算重量 = (当前AD值 - 零点偏移) * 标定系数
weight = (temp - hx711_zero_offset) * hx711_scale;
return weight;
}

View File

@@ -0,0 +1,26 @@
#ifndef __HX711_H
#define __HX711_H
#include "stm32f1xx_hal.h"
#include "stdio.h"
// #################### 引脚定义(根据你的硬件修改!)####################
#define HX711_SCK_GPIO_Port GPIOA
#define HX711_SCK_Pin GPIO_PIN_3
#define HX711_DOUT_GPIO_Port GPIOA
#define HX711_DOUT_Pin GPIO_PIN_2
// 全局变量(零点偏移值、标定系数)
extern int32_t hx711_zero_offset; // 零点偏移空载时的AD值
extern float hx711_scale; // 标定系数(重量/AD差值
// 增益选择默认用通道A+128倍增益
#define HX711_GAIN_128 1 // 通道A128倍增益推荐
#define HX711_GAIN_64 2 // 通道A64倍增益
#define HX711_GAIN_32 3 // 通道B32倍增益
// 函数声明
void HX711_Init(void); // 初始化(引脚配置)
int32_t HX711_ReadData(uint8_t gain); // 读取原始AD数据
void HX711_CalibrateZero(void); // 校准零点(空载时调用)
void HX711_CalibrateScale(float weight); // 标定量程(放已知重量时调用)
float HX711_GetWeight(uint8_t sample_num); // 获取平均重量sample_num采样次数
#endif

View File

@@ -59,8 +59,7 @@ HAL_StatusTypeDef MP3_Init(void)
HAL_StatusTypeDef ret1 = MP3_SendCommand(init_cmd1, sizeof(init_cmd1));
elog_d("MP3", "开启声音命令返回值: %d", ret1);
// 设置为低音量-测试用
MP3_SetVolume(2);
// 延时等待模块响应
HAL_Delay(100);