当前位置: 首页 > news >正文

基于STM32的电子秤PCB程序实现

一、硬件设计要点

  1. 核心器件选型

    • 主控芯片:STM32F103C8T6(72MHz Cortex-M3,64KB Flash)

    • 传感器模块:HX711(24位ADC,内置PGA,支持增益128/64/32)

    • 称重传感器:Zemic L6G(5kg量程,C3级精度)

    • 显示模块:SSD1306 OLED(I2C接口)

    • 电源管理:TP4056(锂电池充电)+ MT3608(升压至5V)

  2. PCB布局规范

    • 四层板结构:信号层(Top)→ 地平面(GND)→ 电源平面(VCC)→ 信号层(Bottom)

    • 关键布线

      • 传感器信号线(A+/A-)长度≤10cm,差分走线(间距≤0.2mm)

      • HX711的PD_SCK和DOUT线远离数字信号(如MCU时钟)

      • 电源输入端并联10μF电解电容+0.1μF陶瓷电容


二、软件架构设计

// 主程序流程图
int main() {硬件初始化();      // GPIO、时钟、外设HX711_Init();      // 传感器校准与参数配置OLED_Init();       // 显示模块初始化while(1) {读取重量数据(); // HX711数据采集与滤波更新显示();     // OLED刷新重量值处理按键();     // 去皮/单位切换低功耗管理();   // 闲置时进入休眠}
}

三、关键代码实现

1. HX711驱动模块
// hx711.h
#ifndef __HX711_H
#define __HX711_H
#include "stm32f1xx_hal.h"#define HX711_SCK_PIN  PB0
#define HX711_DOUT_PIN PB1void HX711_GPIO_Init();
int32_t HX711_Read_RawData();
float HX711_Get_Weight(float scale, float offset);#endif// hx711.c
#include "hx711.h"void HX711_GPIO_Init() {GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitStruct.Pin = HX711_SCK_PIN | HX711_DOUT_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}int32_t HX711_Read_RawData() {int32_t raw = 0;for (int i=0; i<24; i++) {HAL_GPIO_WritePin(GPIOB, HX711_SCK_PIN, GPIO_PIN_SET);HAL_Delay(0.1);  // 100ns延时raw <<= 1;HAL_GPIO_WritePin(GPIOB, HX711_SCK_PIN, GPIO_PIN_RESET);if (HAL_GPIO_ReadPin(GPIOB, HX711_DOUT_PIN)) raw |= 1;HAL_Delay(0.1);}HAL_GPIO_WritePin(GPIOB, HX711_SCK_PIN, GPIO_PIN_SET);  // 增益选择HAL_Delay(0.1);HAL_GPIO_WritePin(GPIOB, HX711_SCK_PIN, GPIO_PIN_RESET);return raw;
}float HX711_Get_Weight(float scale, float offset) {int32_t raw = HX711_Read_RawData();return (raw - offset) * scale / 8388608.0f;  // 24位满量程转换
}
2. 滑动平均滤波算法
#define FILTER_SIZE 16
static float weight_buffer[FILTER_SIZE] = {0};
static uint8_t index = 0;float MovingAverageFilter(float new_value) {weight_buffer[index++] = new_value;if (index >= FILTER_SIZE) index = 0;float sum = 0;for (int i=0; i<FILTER_SIZE; i++) sum += weight_buffer[i];return sum / FILTER_SIZE;
}
3. OLED显示驱动
// oled.c
#include "ssd1306.h"void OLED_Display_Weight(float weight) {char buf[16];sprintf(buf, "Weight: %.2f g", weight);SSD1306_Clear();SSD1306_GotoXY(0, 0);SSD1306_Puts(buf, &Font_7x10, 1);SSD1306_UpdateScreen();
}
4. 按键中断处理
// key.c
volatile uint8_t key_flag = 0;void EXTI0_IRQHandler() {if (EXTI_GetITStatus(EXTI_Line0) != RESET) {key_flag = 1;EXTI_ClearITPendingBit(EXTI_Line0);}
}void Process_Key() {if (key_flag) {key_flag = 0;// 切换去皮/单位static uint8_t mode = 0;mode = (mode + 1) % 2;if (mode == 0) OLED_Display_String("Tare Mode");else OLED_Display_String("Unit: kg");}
}

四、校准流程

  1. 去皮操作

    float tare = HX711_Get_Weight(1.0, 0.0);  // 空载读取
    offset = tare;  // 存储至EEPROM
    
  2. 标定砝码

    // 使用1kg砝码
    float raw = HX711_Read_RawData();
    scale = 1000.0 / (raw - offset);  // 计算比例系数
    EEPROM_Write(0x10, scale);        // 存储至EEPROM
    

五、低功耗优化

// 进入睡眠模式
void Enter_LowPower() {HAL_PWR_DisablePVD();          // 关闭电压检测HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
}// 唤醒处理
void SysTick_Handler() {if (WakeUp_Flag) {HAL_PWR_EnablePVD();SystemClock_Config();      // 重新配置时钟}
}

参考代码 基于STM32设计的电子秤PCB,原理图加程序 www.youwenfan.com/contentcnr/101822.html

六、PCB设计文件示例

文件名 内容说明
STM32F103C8T6.lpf 低通滤波配置(抑制高频噪声)
HX711.SCH 传感器接口原理图
PCB_Layout 四层板堆叠结构(信号-地-电源-信号)

七、调试与验证

  1. 串口调试

    printf("Raw Data: %ld, Weight: %.2f g\n", raw, current_weight);
    
  2. 示波器观察

    • HX711的DOUT信号应呈现稳定的24位脉冲序列

    • PD_SCK时钟频率需严格控制在10MHz以内

  3. 实物测试

    测试项 合格标准
    零点漂移 空载波动≤±0.5g
    线性度 1kg~5kg误差≤±0.2% FS
    响应时间 100ms内稳定显示

通过上述方案,可实现精度达±0.2% FS的电子秤系统。实际开发中需根据传感器特性调整滤波算法,并通过多次校准提高稳定性。

http://www.jsqmd.com/news/424772/

相关文章:

  • 2026年京东e卡回收公司权威推荐,高价诚信回收平台 - 品牌鉴赏师
  • 硬件黑客 --- 什么是一个好的笔记本电脑
  • 排序算法
  • 深度测评AI论文平台,千笔 VS 灵感ai,本科生写作新选择
  • 专科生也能用!全民喜爱的降AIGC工具 —— 千笔·降AIGC助手
  • 不踩雷! 9个AI论文工具测评:本科生毕业论文写作全攻略
  • AVIF转JPG怎么选?几款在线工具实测对比与推荐
  • 京东e卡用不上怎么处理?亲测有效,不踩坑攻略 - 抖抖收
  • 【开题答辩全过程】以 高校学生竞赛模拟系统为例,包含答辩的问题和答案
  • SpringBoot + Vue3 开源OA、CRM、ERP、合同管理一体化企业管理平台——RuoYi Office 全面解析
  • 2026年京东卡回收公司权威推荐,快速到账放心选择 - 品牌鉴赏师
  • 系统级自我优化手册:OS + DB 双架构重构指南
  • 通过conda本地部署Qwen3-ASR-1.7B
  • 瑞祥商联卡闲置处理|3个核心问题,帮你避开所有坑 - 抖抖收
  • 告别MongoDB运维阵痛:一次零中断、高性能的国产数据库迁移实战
  • 手把手教你用6款AI论文工具,1天搞定全文告别熬夜赶稿 - 麟书学长
  • 力扣热题100实战 | 第9期:回文数——从字符串到整数的双重视角
  • 2026年柯桥阿里巴巴面料运营公司权威推荐,专注面料电商服务 - 品牌鉴赏师
  • 力扣热题100实战 | 第10期:正则表达式匹配——动态规划的巅峰之作
  • ④python基础课-这道题(A+B问题 IV)是动态输入处理的典型案例。它与之前的题目最大的不同点在于:每行需要求和的数字个数是不固定的,且每行的第一个数字充当了“计数器”或“指挥官”的角色。
  • 凯丽《主咖》老友相聚爆梗输出笑声不断 提倡穿衣自由上热搜引共鸣
  • [免费]hosts管理器 1.1.0
  • 使用javaw启动无命令行的java GUI应用程序
  • 东方博宜OJ 1415:10进制转D进制 ← 栈(STL stack) + 字符串
  • 2026成都GEO优化公司推荐|AI搜索优化认准橙鱼传媒,本土标杆更靠谱 - 速递信息
  • springboot+vue3医院医疗挂号信息管理系统
  • 成都党建法治文化墙设计公司TOP3:基于综合评分与核心优势评测推荐 - 速递信息
  • 2026年评价高的推拉门窗,折叠门窗厂家口碑推荐榜 - 品牌鉴赏师
  • 混凝土脱模剂选购指南:2026年科学选择的五大核心标准 - 速递信息
  • 全屋智能选哪个品牌?美的全屋智能凭全场景定制优势引领行业 - 速递信息