feat: 添加HX711称重传感器支持并清理旧文档
- 新增HX711称重传感器驱动(bsp_hx711.c/h) - 添加HX711相关文档和README - 更新MP3驱动和FreeRTOS配置 - 修改CMakeLists.txt构建配置 - 删除旧的DX-WF24 WiFi模块开发文档和示例代码 - 整理Development_Docs目录结构
This commit is contained in:
46
Core/Bsp/BSP_Device/bsp_hx711/README.md
Normal file
46
Core/Bsp/BSP_Device/bsp_hx711/README.md
Normal 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以获得最高精度
|
||||
96
Core/Bsp/BSP_Device/bsp_hx711/bsp_hx711.c
Normal file
96
Core/Bsp/BSP_Device/bsp_hx711/bsp_hx711.c
Normal 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;
|
||||
}
|
||||
26
Core/Bsp/BSP_Device/bsp_hx711/bsp_hx711.h
Normal file
26
Core/Bsp/BSP_Device/bsp_hx711/bsp_hx711.h
Normal 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 // 通道A,128倍增益(推荐)
|
||||
#define HX711_GAIN_64 2 // 通道A,64倍增益
|
||||
#define HX711_GAIN_32 3 // 通道B,32倍增益
|
||||
// 函数声明
|
||||
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
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user