☰
STM32电子秤完整设计方案:HX711称重传感器与高精度标定
2026/10/21 4:46:14 网站建设 项目流程

简介:这是一份基于STM32单片机的电子秤完整设计资料,面向嵌入式入门学习者、电子类课程设计及毕业设计人员,可系统解决称重传感器信号采集、重量计算与显示控制的工程实现问题。压缩包共225个文件,以C/C++源码、H头文件和Keil工程配置文件为主,同时包含原理图、PCB预览、物料清单(BOM)与项目报告,整体大小约18.89MB,目录结构清晰,便于按模块查阅。目前已有3093人学习下载,适合课程设计、毕业设计或电子竞赛备赛使用。资料中程序模块覆盖STM32的GPIO初始化、ADC采集、HX711驱动、数字滤波和LCD显示等关键环节;原理图与BOM可直接用于硬件制作和元器件采购;报告记录了设计思路、实施步骤及测试结果,能为复现和二次开发提供明确指引。整份资料实验性与工程性兼备,适合作为单片机应用开发的高价值参考模板。

1. 从称重不稳到量程标定:STM32电子秤方案先解决什么

做电子秤课设时,最容易踩的坑是把称重传感器直接接到 STM32 的片上 ADC 上。称重传感器是电阻应变式电桥,满量程输出只有 1~2mV/V,按 3.3V 激励算,满量程信号也就 3.3mV,单片机内置 12 位 ADC 在这个量级上分辨率不够,称重值会一直跳,读数根本没法用。这套基于 STM32 单片机的电子秤设计方案,第一步就是砍掉内置 ADC,改用 24 位专用采集芯片做前端,把信号链路先立住。方案面向单片机课程设计、电子秤毕设,以及想快速搭一台可交付称重原型的工程师:从硬件选型、驱动代码、校准流程,一路讲到验收用例和答辩提纲,照着做就能把实物跑起来。

2. 总体架构设计:信号链路、功能模块与状态机划分

2.1 硬件选型:主控、传感器与 ADC 的搭配逻辑

我一般会把这套系统拆成五块硬件:主控、称重传感器、ADC 前端、人机交互、报警输出。主控选 STM32F103C8T6,理由是这类最小系统板资料最全,48 脚封装自己画板也好焊接。它内部不是没有 ADC,而是这个项目里不能用它直接测桥式传感器,原因在第 1 章已经说过:满量程差分信号才 3mV 上下,内置 12 位 ADC 的理论分辨率虽然到 4096 级,但折到 3.3V 基准上,每级对应约 0.8mV,也就是说满量程信号只占大约 4 个码,这显然没法用。

所以前端必须外扩一片 24 位 ADC。这个方案里我用的是 HX711,它内部带 PGA,增益可以选 32、64、128,我一般固定在 128,对应满量程差分输入约 20mV,跟传感器的 3.3mV 满量程输出正好匹配。HX711 还有两个很实际的优点:一是数据输出是串行的,只占两根 IO,主控随便挑两个引脚就能驱动;二是它对 50Hz 工频干扰有硬件抑制,这在实验室台面上特别重要,开关电源、日光灯都会在信号线上耦合 50Hz 分量。

对比项STM32 内置 ADC外置 HX711
分辨率12 位24 位
差分输入支持,但需外接运放调增益内置 PGA,增益 32/64/128
50Hz 工频抑制无,需软件滤波内置数字滤波,抑制良好
小信号适配差,3mV 信号只占几个码好,满量程约 20mV
驱动难度标准 ADC 配置两根 IO 时序,稍麻烦
成本无额外成本模块几元,可忽略

传感器选型上,做课设通常用悬臂梁式电阻应变传感器,量程 5kg 或 10kg,灵敏度 1.0mV/V ±10%,输入阻抗 350~400 欧姆。这类传感器输出是差分信号,绝大多数带四根线:E+、E- 是激励,S+、S- 是信号,接的时候最需要注意的是激励线和信号线不能接反,否则读数直接满偏,这在第 5 章会专门讲。显示我用 LCD1602,两行十六字符,第一行显示实时重量,第二行显示单位和状态,字符屏在强光下比数码管清楚,而且接线少、驱动代码成熟;如果想做得更像产品,可以换成 128x64 OLED,分辨率更高,但 I2C 版本刷新率略低,称重显示会有一点粘滞感,这个要考虑。

键盘用 4x4 矩阵键盘,虽然电子秤实际只需要去皮、单位切换、校准三个功能键,但矩阵键盘能演示行列扫描算法,答辩时比三个独立按键更有说头。报警输出端接一个有源蜂鸣器和一颗 LED,超限时蜂鸣器响、LED 闪烁。

2.2 系统模块划分与数据流

软件上我把系统分成四个功能模块,每个模块只做一件事:

  • 采集模块:负责 HX711 时序读取、滑动平均滤波、把原始码换算成重量。对外只提供一个函数 get_weight_g()。
  • 人机交互模块:负责矩阵键盘扫描、按键消抖、键值分发,以及 LCD1602 的刷新。
  • 业务逻辑模块:负责去皮、单位切换、超限判定、稳定判定,是整个系统的状态中枢。
  • 参数存储模块:负责把零点值、标定系数、单位标志写进内部 Flash 的最后一个扇区,掉电不丢失。

数据流是单向的:应变电桥产生差分电压,HX711 把它变成 24 位数字码,采集模块读出原始码后先减掉零点偏移,再乘标定系数,得到克为单位的名义重量;业务逻辑模块在此基础上做去皮、单位切换和超限判断;最终由显示和报警输出。这套单向数据流的价值在于,任何一个环节的 bug 都能定位到具体模块——读数不对先看原始码,原始码对但显示不对就看换算系数,换算对但报警不响就看阈值判定。整个系统没有共享全局缓冲,中间状态都封装在模块内。

2.3 状态机设计与参数存储结构

称重系统不是一口气跑完就结束的,它有明显的状态迁移。我把它建模成四状态状态机:空闲 IDLE、采样 SAMPLE、稳定判定 STABLE、输出 OUTPUT。上电后进入 IDLE,此时只刷新显示但不更新重量;检测到键盘任意操作后进入 SAMPLE,连续采集 N 次原始值;采集结束后进入 STABLE,用最近几次的极差判断重量是否稳定;稳定进入 OUTPUT 并刷新显示,不满足则回到 SAMPLE 继续采。超限报警不是独立状态,而是在 OUTPUT 状态下根据阈值触发的一个分支动作,这样避免报警状态把主流程卡死。

参数存储是这套方案里最容易忽略、但答辩必被问的部分。标定系数和零点如果每次开机都要重新校准,那产品没法用。STM32F103C8T6 不带 EEPROM,但内部 Flash 的最后一块扇区可以用来存参数,写入前先擦除,写入后用魔术字确认。结构体定义如下:

typedef struct { uint32_t magic; // 固定值 0xA5A5A5A5,用于判断参数是否有效 int32_t zero_offset; // 空载零点原始码,经滤波后保存 float scale; // 标定系数:克 / 原始码,浮点保存 uint8_t unit; // 0=kg,1=g uint8_t reserved[3]; // 预留,保证结构体对齐 } ScaleParam;

保存时有两点要注意:第一,Flash 写入前必须按扇区擦除,F103 小容量芯片扇区约 1KB,写这个 16 字节结构体也得整扇区擦;第二,读出来先校验 magic,不一致就说明 Flash 是空白或数据损坏,此时必须回退到默认参数,并把零点和默认系数先算一遍,而不是用乱码继续跑。很多同学看到称重值莫名其妙巨大,就是没做这个校验。

3. 核心功能实现:HX711 驱动、重量换算与稳定判定

3.1 HX711 时序驱动:两根 IO 读出 24 位原始码

HX711 的通信方式是典型的串行位流:DOUT 为高表示数据未就绪,DOUT 拉低表示新数据已准备好;主控给 SCK 发 24 个脉冲,DOUT 在每个脉冲的上升沿依次输出一位,先发最高位 MSB;第 25 个脉冲用于选择下一次转换的增益通道,发 1 个脉冲是 128 倍增益。最小周期约 0.1us,用 GPIO 翻转完全够,不需要硬件 SPI。驱动代码我一般这么写:

// 宏定义:DOUT 接 PA6,SCK 接 PA7 #define HX711_DOUT GPIO_Pin_6 #define HX711_SCK GPIO_Pin_7 #define HX711_PORT GPIOA // 从 HX711 读一次 24 位原始码,返回有符号 32 位值 int32_t HX711_Read(void) { uint32_t raw = 0; uint8_t i; // 等待 DOUT 拉低,表示数据就绪;最多等 100ms 防卡死 uint16_t timeout = 50000; while (GPIO_ReadInputDataBit(HX711_PORT, HX711_DOUT) == Bit_SET) { if (--timeout == 0) return 0x7FFFFFFF; // 超时返回异常值 } // 24 个 SCK 脉冲读出 24 位数据,MSB 在前 for (i = 0; i < 24; i++) { GPIO_SetBits(HX711_PORT, HX711_SCK); raw = raw << 1; if (GPIO_ReadInputDataBit(HX711_PORT, HX711_DOUT) == Bit_SET) { raw |= 1; } GPIO_ResetBits(HX711_PORT, HX711_SCK); } // 第 25 个脉冲:选择增益,这里选 128 倍(A 通道) GPIO_SetBits(HX711_PORT, HX711_SCK); GPIO_ResetBits(HX711_PORT, HX711_SCK); // HX711 输出的是二进制补码,把 24 位扩展成 32 位有符号数 if (raw & 0x800000) { raw |= 0xFF000000; } return (int32_t)raw; }

逻辑说明:超时保护很重要,如果传感器没上电或接线断了,DOUT 会一直保持高电平,没有超时保护程序就会死等在这个函数里,整个系统卡死,这是最常见的排查点之一。补码扩展这一步也不能省,HX711 输出的 24 位是带符号的补码,正方向的拉力对应正值,压力或接反时是负值;不扩展符号位,负值会被当成 0x800000 到 0xFFFFFF 的大正数,换算出来的重量会突然变成几千公斤。扩展后用一个异常值 0x7FFFFFFF 做错误标记,业务层看到这个值直接报传感器错误,而不是显示一个离谱重量。

采样节奏上,HX711 的内部转换速率默认是 10SPS,也就是每 100ms 出一个新数据。读数据的代码不要放进主循环里无限跑,最好用一个 10ms 的定时器节拍去查询 DOUT,读到就取一次数,没读到就跳过,这样既不会漏数据,也不会一直死等。

3.2 零点获取与重量换算公式

拿到原始码之后,第一步不是直接换算重量,而是先标定零点和系数。零点就是空载时传感器输出的原始码,这个值理论上每次上电都不同,受温度、机械应力、传感器安装姿态影响。我一般在上电初始化时连续读 10 次,去掉最大值和最小值,剩下 8 次取平均,作为本次开机零点:

// 连续采样 n 次,去掉最大最小后取平均,得到稳定零点 int32_t Get_Average(int32_t *buf, uint8_t n) { int32_t sum = 0; int32_t max, min; uint8_t i; max = buf[0]; min = buf[0]; for (i = 0; i < n; i++) { sum += buf[i]; if (buf[i] > max) max = buf[i]; if (buf[i] < min) min = buf[i]; } sum -= max + min; return sum / (n - 2); }

重量换算只有一个公式:

weight_g = (raw - zero_offset) / scale

其中 scale 是标定系数,单位是“克 / 原始码”。标定系数的来源是实测:放一个 500g 标准砝码,读回原始码 raw_std,则 scale = (raw_std - zero_offset) / 500。这个值在调试时算出来,写进 Flash,以后每次开机直接用。换算时要注意,raw 和 zero_offset 都是原始码量级,F103 的 int32_t 足够放,但除法时如果先做减法再做除法,中间结果不会溢出;如果先乘后除反而可能溢出,因为原始码差值和系数相乘可能超过 20 亿,这个坑要绕开。

校准流程通常的做法是两点法:先空载取零点,再放满量程一半的砝码(比如 5kg 传感器放 2kg),算出斜率。为什么不用满量程砝码?因为便宜的小砝码精度不够,而且满量程时传感器的非线性略大,取半量程标定能让实际使用区间落在线性度最好的中段。校准参数可以做成一个菜单:上电时按住“校准”键进入校准模式,LCD 第一行提示放砝码,第二行显示当前读数,按下确认键后自动计算并保存 scale,重启后生效。

3.3 滤波与稳定判定

即使硬件上有 HX711 的工频抑制,机械振动、气流、台面晃动都会让原始码在真实值附近摆动。我一般做两级处理:第一级是采集侧的滑动平均滤波,窗口取 5 点,每来一个新数据就替换最老的一个,输出平均值;第二级是稳定判定,用于决定什么时候才刷新显示和允许去皮。

稳定判定的做法是:连续 5 次采样,每次间隔一个采样周期(100ms),记录这 5 次的极差(最大值减最小值),如果极差小于阈值就判定为稳定。阈值怎么定?我通常取传感器量程的 0.05%,5kg 传感器就是 2.5g,也就是说显示能稳定在 2g 以内。代码逻辑如下:

// 稳定判定:最近 5 个滤波后的重量值,极差小于 2g 则认为稳定 uint8_t Is_Stable(int32_t *recent, uint8_t n) { int32_t max = recent[0], min = recent[0]; uint8_t i; for (i = 1; i < n; i++) { if (recent[i] > max) max = recent[i]; if (recent[i] < min) min = recent[i]; } return (max - min) <= 2; // 阈值 2g,可配置 }

参数设计说明:阈值不能设成 0,那永远稳定不了;也不能设太大,否则重量没停稳就显示,读者会认为秤不准。2g 对应 5kg 量程的 0.04%,肉眼看起来是比较稳的。如果实际环境振动大,可以把阈值放宽到 5g,并把采样间隔缩短到 50ms,这是速度和稳定性的权衡。另外要强调,稳定判定用的是“滤波后”的重量值,不是原始码,否则滑动平均还没收敛就判定,会过早进入稳定态。

4. 核心功能实现:键盘扫描、显示刷新与报警逻辑

4.1 矩阵键盘扫描与按键消抖

人机交互这边我用一个 4x4 矩阵键盘,16 个键位里实际定义 6 个功能:0~9 数字键留作扩展(比如预置皮重),F1 去皮,F2 单位切换,F3 进入校准,F4 退出/确认。扫描用行列反转法:先把 4 根行线设为输出低电平,4 根列线设为带上拉的输入;读列值,若某一列为低,说明该列有按键按下;再反过来把列线设输出低,行线设为输入,读行值,就定位到了唯一按键。核心代码:

// 行列反转法扫描,返回键值(1~16),无按键返回 0 uint8_t Key_Scan(void) { uint8_t row, col, value; // 阶段1:行输出低,读列 GPIO_WriteBit(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3, Bit_RESET); col = Read_Column(); // 读 4 根列线,拼成一个字节 if (col == 0x0F) return 0; // 没有按键 // 阶段2:列输出低,读行 GPIO_WriteBit(GPIOB, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7, Bit_RESET); row = Read_Row(); // 行列拼出键值:低电平位对应行列号 value = Combine(row, col); return value; }

说明:按键按下时对应的引脚会读到低电平,这是因为扫描侧输出低、按键把该点拉到低。Read_Column 和 Read_Row 是两个读引脚并拼装字节的函数,写法就是把四个输入引脚的电平按位拼起来。扫描结果还要做消抖:检测到按键后延时 10ms 再读一次,两次一致才确认按下;释放时同样要检测到高电平才算一次完整按键,否则一次长按会触发多次。主循环里每 20ms 扫一次键盘,键值通过一个队列交给业务层,业务层拿到 F1 就执行去皮,F2 切换单位,逻辑和扫描完全解耦。

4.2 LCD1602 显示刷新与单位切换

显示布局上,第一行固定显示重量,格式是 “W: 1234.5 g”,第二行显示当前状态:空载显示 READY,去皮后显示 TARE +123g,超限显示 OVER LOAD,校准模式显示 CAL xxx。刷新策略是距离上次内容变化才重写整屏,因为 LCD1602 写 32 个字符要几百微秒,如果每 100ms 全量重写,主循环会被占掉一大块时间。具体做法是:把要显示的一行字符串先格式化进缓冲区,和上一帧缓冲区比较,有变化才调用 LCD 写函数。

重量显示的小数位和单位有关。默认单位是 kg,显示两位小数,比如 “1.234 kg”;按下 F2 切换成 g,显示一位小数,比如 “1234.5 g”。这里有一个容易翻车的点:单位切换只是改一个显示系数,不能改标定系数 scale。标定系数永远定义成“克 / 原始码”,显示层再除以 1000 得到 kg,这样校准数据、去皮逻辑都不受单位影响。如果你把 scale 也顺带除了一下,下次再切回 kg 时重量就差了 1000 倍,这个 bug 很隐蔽。

4.3 去皮逻辑与超限报警

去皮不是简单地把当前重量清零。正确的做法是:按 F1 时,把当前稳定的毛重值存进 tare_offset(单位是克),业务逻辑计算净值时用毛重减去 tare_offset;再次按 F1 或长按则清除皮重。为什么不直接清零?因为零点 zero_offset 是空载参考,去皮是把“当前承载的容器重量”临时当作零,如果直接把零点改成当前值,会污染 Flash 里的校准数据,下次上电零点就错了。去皮值只是临时变量,掉电丢失是正常行为,这也是产品秤的真实逻辑。

超限报警的判定放在 OUTPUT 状态里:当净重大于量程的 95% 时,立刻进入报警分支。报警分支做三件事:蜂鸣器以 1Hz 频率鸣叫、LED 以 500ms 周期闪烁、LCD 第二行显示 OVER LOAD。同时要防止重复触发——加一个标志位,只在“未报警到报警”的边沿触发一次,否则每次刷新都会重新鸣叫,蜂鸣器变成一直响。报警解除的条件是净重低于量程的 90%,这里加了一个回差,避免在阈值附近反复进入退出报警,这就是工业上说的施密特触发特性。

5. 避坑与排查:称重跳变、零点漂移、校准失灵的四种典型故障

5.1 读数一直跳,稳定判定永远不通过

现象:空载时显示值在 ±5g 甚至 ±20g 之间乱跳,稳定状态指示灯从来不亮,去皮也去不了。

原因:最常见的是供电问题。传感器激励电压来自单片机的 3.3V LDO,而 HX711 和传感器共用同一个 3.3V,数码管或蜂鸣器动作时电流波动直接串进电桥激励,信号测出来就是噪声。还有一种情况是传感器信号线用了杜邦线飞线,长度超过 20cm,又没有双绞,50Hz 和开关电源噪声全耦合进来。

解决:把激励改走独立的 5V(HX711 模块多数支持 5V 激励),并在 HX711 的电源脚并 100uF 电解电容和 0.1uF 陶瓷电容;传感器信号线尽量短,S+、S- 两根线绞在一起走。软件上再把采样节拍固定在一个定时器中断里,不要在按键响应等随机时刻去读,因为 HX711 的数据就绪时刻是固定的,随机读会把转换中间的半稳定值采进来。

5.2 每次开机零点都不一样,且越差越多

现象:同一台机器,空载时昨天开机显示 0.0g,今天开机显示 -3.2g,放上同一个 500g 砝码,两次显示的重量差了几克。

原因:零点漂移一方面来自传感器本身,电阻应变片受温度影响会改变阻值,电桥平衡点就飘了;另一方面来自机械结构,传感器安装螺丝没拧紧、秤盘和传感器之间有应力,热胀冷缩后应力重新分布,零点就变了。

解决:每次开机强制做一次自动清零,读 10 次原始码取平均作为本次零点,这个值只保存在 RAM,不写 Flash,因为它是本次上电的参考,掉电清零反而对。标定系数 scale 写 Flash,它只随温度缓慢变化,零点随环境快速变化,两者分开处理。如果零点漂移超过满量程的 5%(5kg 就是 250g),程序要提示“请空载重启”,因为机械上已经出了问题,软件补不回来。还有一种很隐蔽的情况:秤盘压到了传感器量程之外的物体,比如秤盘碰到旁边的支架,零点是会飘的,先检查机械。

5.3 校准后小重量准、大重量偏,误差不是线性

现象:放 100g 砝码很准,放 2kg 砝码差了 15g,比例不是固定的。

原因:这里要区分两个概念,标定系数是线性斜率,它修正的是“整体比例偏差”;而传感器应变片的非线性误差(通常 0.02%~0.05% FS)和安装偏心载荷造成的机械非线性,单靠一个斜率系数是修不回来的。如果只做了一点校准,大称量段必然偏。

解决:要么接受这个误差范围(课设精度要求一般 0.5% FS 就够,即 5kg 允许 25g,非线性偏差点通常不超过这个数);要么做两点标定,在校准菜单里允许存两个点的系数,程序里做分段线性插值。实操里更推荐一个笨办法:至少用满量程 50% 的砝码校准,不要只用 100g 小砝码,这样斜率更接近真实曲线。另外确认一下砝码本身,有些几块钱的“标准砝码”误差远超宣称等级,换一套精度高的砝码重测,问题可能直接消失。

5.4 接上传感器后数值满偏、为负值或固定不变

现象:HX711 读回来的原始码不是接近 0xFFFFFF 就是接近 0x800000,或者无论怎么压秤盘读数都不动。

原因:九成是接线错误。E+、E-(激励)和 S+、S-(信号)接反了,电桥输出的差分信号极性反,读出来就是负满偏;S+、S- 其中一根接触不良,信号悬空,HX711 输入共模不对,也会打出极端值。还有一种情况是传感器信号线和激励线短路,读数固定在一个值上,放东西完全没反应。

解决:先断电,用万用表量传感器四根线之间的阻值:E+ 和 E- 之间一般 350~400 欧姆,S+ 和 S- 之间也是 350~400 欧姆,E 和 S 之间不应短路。如果 S 之间开路,传感器内部断了,换传感器。接线确认后上电,空载读一次原始码,正常 5kg 传感器在 128 增益下零点应该在几十万到一百万左右;如果读出 0x7FFFFFFF,检查是否是 3.1 节里写的超时异常值,那是 DOUT 一直没就绪,优先查 HX711 供电和 SCK/DOUT 引脚配置。

6. 验收与答辩:测试用例、演示流程与常见提问

6.1 功能验收测试用例

实物做出来不能只靠“感觉挺准”,我一般会列一张验收表,每个用例跑两遍,一遍在实验台上,一遍放在有人走动的地面上,两个场景的结论分开记录。这套电子秤的核心测试用例大概有六条:

编号操作步骤预期结果判定
T01上电空载显示 0.0g,稳定指示灯亮读数在 ±2g 内
T02放 500g 标准砝码显示 500.0g误差 ≤ 2.5g(0.5% FS)
T03重复放 5 次 500g 砝码每次读数与平均值的偏差 ≤ 2g重复性合格
T04放 2kg 砝码后按去皮显示 0.0g,再放 500g 显示 500.0g去皮正确
T05按 F2 单位切换2.000kg 与 2000.0g 互切,重量不跳变切换正确
T06加载超过量程 95%蜂鸣器鸣叫、LED 闪烁、显示 OVER报警触发

验收时我会先跑 T01 到 T03,这三条过不了说明采集链路或校准有问题,不要急着改显示格式;T04 和 T05 是功能正确性的验证,主要看状态逻辑;T06 单独跑,因为超限报警要避免误触发,手动加砝码到接近量程,确认回差逻辑正常。答辩时能把这张表和实测数据放出来,说服力远大于口头说“我测过没问题”。

6.2 十分钟演示流程

演示不是把每个按键都按一遍,而是按一个“故事线”走。我通常按这个顺序:先讲硬件组成(30 秒),指着板子说明传感器、HX711、主控、键盘、显示各自的作用;然后上电,先让大家看到空载清零这个自动过程,强调“每次开机自动找零点”是为了抗温漂;接着放 500g 砝码,读 500.0g,顺手把滤波窗口和稳定判定的设计参数讲掉;再按去皮,放第二个砝码,把“去皮是临时零参考、不动 Flash 零点”这个点讲出来;切一次单位,说明显示系数和标定系数分离;最后人工推到超限,演示报警并解释回差。每个步骤控制在 1~2 分钟,留出时间给导师提问。

6.3 答辩高频问题怎么答

答辩问得最多的是三个问题。第一个是“为什么不用 STM32 内置 ADC”,标准答法是先讲传感器满量程信号只有 3mV 左右,12 位 ADC 在 3.3V 基准下分辨不了这么小的信号,再讲 HX711 的 24 位分辨率和内置 PGA 匹配了信号量级,最后补一句“内置 ADC 没有差分小信号放大能力,需要额外运放,反而增加硬件复杂度”。第二个是“校准系数为什么存 Flash 不存 RAM”,答:Flash 掉电不丢失,F103 内部 Flash 最后一个扇区足够存放参数,写入时先擦后写,用 magic 校验防止误读空白区。第三个是“稳定判定的阈值怎么定的”,答:按量程的 0.05% 取,5kg 传感器取 2g,采样间隔 100ms,这是速度和稳定性的折中,并且阈值是可配置参数,不是写死的。

我的习惯是答辩前把每个高频问题的答案压缩成“现象 + 根因 + 取舍”三句话,现场只讲根因和取舍,不背原理课。做这个电子秤时,我第一次交付前没有跑重复性测试,结果答辩现场放 500g 砝码连续三次读数差了 6g,当场被问得有点下不来台。后来我每次做带传感器的项目,都会强制先跑一遍 5 次重复性测试再谈别的。希望这套从选型到验收的完整方案能帮到你,照着做,至少能让你的秤在讲台上稳得住。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询