简介:这是一份关于便携式电子秤设计实现的实验报告文档,面向电子信息、自动化等相关专业学生,可用于课程设计、综合实验或电子测量系统入门参考。报告以电阻应变式传感器为测量核心,系统介绍了箔式电阻应变片E350-ZAA将力转换为电压信号、INA114差动放大电路处理微弱信号、ICL7107双积分A/D转换以及LED数码管显示等关键环节,并围绕单片机方案、普通A/D编码器方案和ICL7107方案展开对比论证,最终选择了电路最简、成本最低且易于调试的第三方案。文件中给出了完整的摘要、方案选型、单元电路设计与误差分析,称重范围0~2kg,最终最大绝对误差仅5g。资源仅1个doc文档,压缩包约456KB,便于保存和打印;目前已有604人浏览学习。对想快速理解电子秤硬件链路、掌握应变片与放大电路设计方法的学生,这份报告可提供清晰的电路框图、参数推导思路和实物制作参考。
1. 电子秤实验报告背后:一次完整的称重链路设计
第一次看到《电子秤实验报告.doc》这个文件名,多数人会以为只是个课程作业模板。但把它当成一个项目去看,你会发现电子秤恰好是一块非常完整的嵌入式实践:电阻应变片把重力变成微伏级电压,24 位 ADC 把电压变成数字码,单片机做滤波、标定、去皮,最后送到液晶屏显示。任何一个环节的噪声、温漂或接地问题,都会直接变成显示屏上跳动的数字。这篇博文就顺着这条链路,把「电子秤实验报告」里最该写清楚的东西讲透:从传感器选型到实际能复现的 C 代码,再到实验报告里那些容易被追问的坑。适合正在做课程设计、准备技术面试,或者想在工控场景里快速搭一个称重节点的人——你会知道为什么同一个 HX711 模块,有人做到 ±0.1g,有人连稳定都做不到。
2. 电子秤的硬件选型:应变式传感器与 HX711 的前端设计
2.1 为什么称重方案几乎都选电阻应变式桥式传感器
常见的电子秤称重原理有电磁力平衡、电容式、电阻应变式三种。前两者精度高但成本也高,实验室或小商品场景下,电阻应变式是绝对主流。它的核心是一个惠斯通电桥,四片应变片贴在弹性体上,受力后电阻变化,电桥输出差分电压。这个电压非常小,满量程时通常只有 1~2 mV/V 的灵敏度。也就是说,5V 供电下满量程输出才 5~10 mV,送到单片机 ADC 前必须放大。
这里要理解一个容易混淆的概念:传感器铭牌上的「激励电压」不是输出,而是桥路供电。很多人把 HX711 的 AVDD 当成传感器激励,结果发现输出码异常。HX711 模块上通常有稳压电路,AVDD 是经过稳压后的模拟电源,它同时给传感器供电并作为 ADC 的参考。常见的 5V 模块实际 AVDD 大概是 4.2V 左右,这会导致计算量程时需要按实际 AVDD 而不是 5V 来算。
选传感器时主要看量程和灵敏度。比如 5kg 的传感器,推荐激励电压 5V,灵敏度 1.0 ± 0.1 mV/V,那么满量程差分输出约 5mV。如果 HX711 的增益选 128,满量程输入就是 0.64V,而 HX711 内部 PGA 的差分输入范围大约在 ±0.5 * Vref,所以需要检查是否匹配。常见的做法是选增益 64,配合灵敏度更高的传感器,或使用 2kg 量程的传感器做小称重。
2.2 HX711 的差分输入、增益与采样率怎么设
HX711 是一颗带 24 位 Δ-Σ ADC 的专用称重芯片,它内部集成了低噪声 PGA,增益可选 32、64、128。通道 A 的输入是差分对,通道 B 固定增益 32,通常接压力传感器或不用。我们在简易电子秤方案里只用通道 A。
引脚说明可以看下面这张表:
| 引脚 | 方向 | 说明 |
|---|---|---|
| E+(VCC) | 输出 | 传感器激励正 |
| E-(GND) | 输出 | 传感器激励负 |
| A+ / A- | 输入 | 通道 A 差分输入 |
| B+ / B- | 输入 | 通道 B 差分输入 |
| SCK | 输入 | 时钟,上升沿读数,下降沿驱动 |
| DOUT | 输出 | 数据就绪/串行数据 |
| AVDD | 模拟电源 | 接 2.6~5.5V,经内部稳压后给传感器 |
| VFB | 反馈 | 接 AGND,配合 RATE 调整输出速率 |
注意 DOUT 的时序:DOUT 从高电平降到低电平表示 ADC 转换完成,此时 SCK 给 25 个脉冲,前 24 个脉冲读出 24 位数据,第 25 个脉冲把 DOUT 拉回高电平并决定下一次增益。第二个通道和增益配置是通过第 25 个脉冲的个数来区分的:25 个脉冲表示通道 A 增益 128,26 个脉冲表示通道 B,27 个脉冲表示通道 A 增益 64。很多人只发了 24 个脉冲就继续读,导致数据漂移,这是最常见的手写驱动 bug。
采样率由 RATE 引脚决定:接高电平为 80 SPS,接低电平为 10 SPS。做电子秤实验建议用 10 SPS,内部数字滤波器对工频干扰的抑制更好,数据更稳。如果你后面要加滤波算法,10 SPS 也够用,因为称重本身是个缓变物理量,不需要高速采样。
2.3 接线与供电:不要让地环路毁掉你的精度
模块和传感器的接线非常直观,但工程问题往往出在供电地上。绝大多数实验者会把 HX711 模块的 VCC 和单片机的 3.3V 或 5V 共用,然后 DOUT 和 SCK 直接接 GPIO。这本身没问题,前提是传感器的激励电平和 ADC 参考电压同源。
但如果你同时用 USB 给单片机供电、再用另一个变压器给显示器供电,地电位差就会注入噪声。此时表现为称重数据在零点附近以 50Hz 或 100Hz 分量抖动。解决办法是:把 HX711 的模拟地(AGND)和数字地(DGND)单点连接,传感器屏蔽层靠近模块端接地,并且避免使用面包板上的长跳线。另一个容易忽略的是 AVDD 到传感器 E+ 之间的走线电阻,导线太细太长会导致激励电压在传感器端下降,影响线性度。
对于液晶显示的简易电子秤,通常用锂电池供电,这时要注意 AVDD 不能低于传感器的最低激励电压。如果使用 5V 传感器而电池电压只有 3.7V,需要选支持低压激励的传感器,或者用升压电路。不过大多数小量程传感器在 3.3V 激励下也能工作,只是灵敏度和温漂特性会变化,需要重新标定。
3. 从原始码到克重:电子秤的标定与数据滤波实现
3.1 读取 HX711 原始值的裸机代码(C 语言)
先给出一段可直接在 STM32 或 51 上移植的 HX711 读取函数。这里用 GPIO 模拟时序,避免依赖具体硬件库,逻辑更清楚。
// hx711.h #define HX711_SCK_PIN GPIO_PIN_x // 替换为实际引脚 #define HX711_DOUT_PIN GPIO_PIN_y uint32_t HX711_Read(void) { uint32_t raw = 0; while (HAL_GPIO_ReadPin(GPIO_PORT, HX711_DOUT_PIN)); // 等待 DOUT 拉低 for (uint8_t i = 0; i < 24; i++) { HAL_GPIO_WritePin(GPIO_PORT, HX711_SCK_PIN, GPIO_PIN_SET); raw <<= 1; // 在SCK高电平期间读取DOUT,注意判断顺序 if (HAL_GPIO_ReadPin(GPIO_PORT, HX711_DOUT_PIN)) { raw |= 1; } HAL_GPIO_WritePin(GPIO_PORT, HX711_SCK_PIN, GPIO_PIN_RESET); } // 第25个脉冲,保持通道A增益128 HAL_GPIO_WritePin(GPIO_PORT, HX711_SCK_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIO_PORT, HX711_SCK_PIN, GPIO_PIN_RESET); // HX711输出是二进制补码,转成有符号数 if (raw & 0x800000) { raw |= 0xFF000000; } return (int32_t)raw; }这段代码的要点在于时序:DOUT 拉低后必须尽快开始读,SCK 上升沿期间 DOUT 有效,所以先拉高 SCK、再读数据、再拉低,顺序不能反。有些 MCU 的 GPIO 翻转速度慢,高电平时间太短会导致 DOUT 还没有稳定就被采样,需要在 SCK 拉高后加一个__NOP()或延时。此外,24 位数据按最高位在前输出,所以每一轮先移位再读位。
读取频率由你调用HX711_Read()的间隔决定。但要注意,HX711 内部转换是连续进行的,如果你用轮询方式,可能在一次转换中途读,导致前一个数据上叠加了部分新数据。常见做法是用定时器以 10Hz 频率调用读取,每次读取前等待 DOUT 拉低,读取完成后立即处理,不要做阻塞式长延时。
3.2 两点标定法:零点和已知砝码的斜率计算
拿到原始码后,需要把它映射成克重。HX711 是线性 ADC,理想情况下重量和原始码成线性关系:
weight = (raw - raw_zero) / scaleraw_zero是空秤时的读数,scale是每克对应的原始码数。求scale最简单的办法是放一个已知重量的砝码,记录读数,然后:
scale = (raw_weight - raw_zero) / weight实际操作中要注意:称重传感器有轻微的非线性,所以选砝码时尽量选接近量程 2/3 的重量,这样标定的线性区间更贴近使用范围。比如 5kg 传感器,用 3kg 砝码做标定点。如果只有 1kg 砝码,标出来的 scale 在小重量段还算准,到 4kg 以上误差会变大。
在代码里做标定时,我一般会连续读 20 次求平均,作为稳定读数。直接读一次就计算会把振动、电源噪声带进来,标定结果每次都不一样。标定流程可以做成一个命令行式函数,通过串口发送指令进入标定模式:
// 标定流程伪代码 void HX711_Calibrate(void) { float raw_zero = 0; float raw_weight = 0; float known_weight = 1000.0f; // 砝码克数 for (int i = 0; i < 20; i++) { raw_zero += HX711_Read(); delay_ms(100); } raw_zero /= 20; printf("Please place known weight...\n"); // 等待用户放上砝码,按串口确认 while (!serial_available()); for (int i = 0; i < 20; i++) { raw_weight += HX711_Read(); delay_ms(100); } raw_weight /= 20; float scale = (raw_weight - raw_zero) / known_weight; // 将 scale 写入 EEPROM 或 Flash }注意known_weight用浮点数,避免整数除法导致误差。标定完成后,把raw_zero和scale存储在非易失区,下次开机直接读取,不用重新标定。存储时建议结构体打包加校验和,防止写一半掉电,否则设备就可能用错误的 scale 显示完全离谱的数值。
3.3 滑动平均与去毛刺:称重数据为什么会跳
原始码在静态时也会有 ±几分度的波动,这是热噪声和 ADC 量化噪声的叠加。如果每毫秒读一次并直接显示,数字会不停跳动。解决方法是滤波,但滤波不是无脑取平均,要区分「物体刚放上来的阶跃响应」和「静态噪声」。
最常用的是滑动平均加一阶低通。滑动平均窗口选 4~8 个点即可,窗口太大会让称重响应变慢,用户放上物体后要等两三秒才稳定,体验很差。一阶低通公式如下:
filtered = filtered_old * (1 - alpha) + raw * alphaalpha在 0.1~0.3 之间,取值越小越稳定但响应越慢。我会让alpha动态切换:检测到连续几个采样点的变化量超过阈值时,认为发生了真正的重量变化,此时把alpha临时提高到 0.8,让数据快速逼近真实值;等数据平稳后再把alpha调回 0.2。这种策略在皮带秤、分拣机这类动态称重场景里非常重要,虽然实验室电子秤不需要那么快,但理解了动态响应和噪声抑制的取舍,写进实验报告里会更有分量。
此外还要做「死区」处理:当滤波值和目标显示值相差小于 0.5g 时,直接显示目标值不变,避免屏幕上的数字因为最低位抖动而不断变化。这个死区设置要小于系统允许的误差,否则小重量增减会反映不出来。
4. 液晶显示的简易电子秤:LCD1602 显示与按键去皮实战
4.1 LCD1602 驱动与显示格式
液晶显示是电子秤实验报告里最直观的部分。LCD1602 是 16x2 的字符液晶,内置 HD44780 控制器,可以用 4 线或 8 线模式驱动。4 线模式省引脚,但初始化时序复杂一些,容易踩坑。这里给出一段简洁的初始化代码,按标准时序操作:
void LCD_WriteNibble(uint8_t nibble) { D4 = (nibble >> 3) & 1; D5 = (nibble >> 2) & 1; D6 = (nibble >> 1) & 1; D7 = nibble & 1; EN = 1; delay_us(10); EN = 0; delay_us(10); } void LCD_Command(uint8_t cmd) { RS = 0; LCD_WriteNibble(cmd >> 4); LCD_WriteNibble(cmd); delay_ms(2); } void LCD_Init(void) { delay_ms(50); LCD_WriteNibble(0x03); // 切换到4线模式 delay_ms(5); LCD_WriteNibble(0x03); delay_ms(5); LCD_WriteNibble(0x03); LCD_WriteNibble(0x02); // 进入4线模式 LCD_Command(0x28); // 4线、2行、5x7字体 LCD_Command(0x0C); // 开显示,关光标 LCD_Command(0x06); // 光标右移,不滚动 LCD_Command(0x01); // 清屏 delay_ms(2); }这段初始化里最容易被忽略的是前三个0x03脉冲,它们是用来让 LCD 无论上电时处于什么状态都能正确识别 4 线模式。很多人直接发0x28,结果屏幕显示乱码或完全不亮。
显示称重数值时,需要把浮点数格式化成字符串。LCD1602 没有字符映射表外的字形,所以自定义单位符号可以用0xDF表示度数,或者直接在第二行写 "Unit:g"。我习惯这样布局:
第一行: Weight: 1234g 第二行: Zero: 0000g去皮后可以在第二行后面加一个T标志,表示当前处于去皮状态,防止用户误解当前是清空重量。
4.2 按键去皮与上下限报警逻辑
电子秤实验报告里,去皮是必考功能。一个按键按下后,把当前滤波值作为新的零点偏移保存起来,下次计算重量时减去这个偏移。注意去皮和标定零点是两回事:标定零点是物理空秤读数的零点,去皮是在秤上有容器或物体时把当前读数归零。
去皮后,如果拿掉容器,显示会变成负数。处理方式有两种:一种是限制最小显示为 0,负值一律显示 0;另一种是允许显示负值,方便用户判断重量是否恢复了。简易电子秤一般用前者,因为消费者不懂负值代表什么。但作为实验报告,建议把两种逻辑都写出来,并解释为什么采用其中一种。
上下限报警可以用在两个场景:一是包装秤,设定目标重量和允许误差范围,超差就亮灯或蜂鸣;二是配料秤,达到设定重量停止加料。报警逻辑很简单,但要注意「回差」问题:如果不设回差,临界点附近数据抖动会导致蜂鸣器反复触发。正确做法是设定一个滞回区间,例如上限 1000g,回差 2g,则报警解除需要降到 998g 以下。这个细节面试官喜欢问,实验报告里写了会显得你考虑过工程实际。
4.3 低功耗与电池供电注意事项
液晶显示的简易电子秤通常用电池供电,主控可能是 STC 或 STM32L 系列。HX711 在休眠模式下电流小于 1μA,唤醒方式是拉低 SCK 并保持一段时间。实际使用时,不要一上电就连续转换,应该先初始化,然后让 HX711 进入休眠,按键触发唤醒后等 100ms 再读取,因为唤醒后的第一组数据可能不稳定。
LCD1602 的背光是耗电大户,一颗 200mAh 纽扣电池可能撑不了太久。如果产品要求长续航,可以加一个背光开关,或使用 LED 背光 PWM 调光,在暗光环境下降低占空比。还有一个小技巧:称重稳定后 30 秒无变化,关闭背光;再次有重量变化时唤醒。这个策略在电子秤实验报告里作为「低功耗设计」章节很加分。
此外还要注意 LCD 的对比度引脚 Vo,通常接一个 10k 电位器,或者用 PWM 输出来调整偏压。如果 LCD 显示异常,先查这一脚的电压,而不是急着改代码。固定偏压电阻的阻值在不同批次的 LCD 之间差异很大,设计量产时最好用数字电位器或软件校准。
5. 实验报告里最容易被追问的三个坑:温漂、非线性与校准周期
5.1 温漂怎么补偿
电阻应变片受温度影响极大,主要体现为零点漂移和灵敏度漂移。零点漂移是电桥四个桥臂匹配不完全造成的,灵敏度漂移是因为应变片灵敏系数随温度变化。实验报告里,如果你只记录常温数据,几乎必然会被问到「温度变化后还准吗」。
最实用的补偿方法是软件温度补偿:在传感器附近放一个 NTC 或 DS18B20,测出不同温度下的零点和scale,拟合出一条曲线,运行时查表插值。由于电子秤通常工作在 0~40°C 环境,可以用二次多项式来拟合零点偏移:
zero_corrected = zero_25 + a * (T - 25) + b * (T - 25)^2其中a、b通过实验数据拟合。这个工作量大,但如果你在做高精度实验,这个结论比动不动就换硬件方案要可靠得多。另外,硬件上把四个应变片尽量靠近,使它们温度一致,同样重要;不要让电源芯片紧贴着传感器,否则板上的热量会形成温度梯度。
5.2 非线性误差的修正技巧
传感器的输出与重量之间并不是完美直线,在量程的 20%、60%、90% 处偏差各不相同。两点标定只保证零点和标定点准确,中间段最多便宜 10%。如果实验报告追求精度,可以用多点分段线性插值。
做法是取 0、1/4、1/2、3/4、满量程五个标准砝码,记录每个点的scale,然后建立一张查找表。实际称重时,先根据raw找到所在区间,再按区间两端点的斜率计算重量。分区越多越接近真实曲线,但需要更多个标准砝码,实验成本高。我在实际项目中通常用三段:0~30%、30%~70%、70%~100%,每段独立scale,效果已经能满足 0.5% 的精度要求。
注意分段点之间要平滑过渡,不要让某一段的末尾和下一段的开头产生跳变。可以在交界处做线性插值,或者重叠 5% 的范围。实验报告里画一张实测曲线对比直线模型,这个图表最有力。
5.3 实验报告要写出哪些数据才有说服力
一份电子秤实验报告除了原理图和代码,真正能证明你做过的必填数据有三块:重复性、迟滞和偏载误差。
- 重复性:同一砝码放上去、拿下来重复 10 次,记录每次的稳定读数,计算极差。
- 迟滞:从零开始逐渐加砝码到满量程,再逐步减回零,观察同一砝码在加、减两个方向的读数差。差值大说明弹性体有内摩擦或应变片粘贴不牢。
- 偏载误差:把砝码放在秤盘的四个角和中心,读数差异超过允许值,说明传感器受侧向力或秤盘支撑结构有问题。
把这些表放进实验报告里,比写一百行「实现了精确称重」更有价值。最后一个建议:每次重开机后,先空秤读零点,如果和上次存储的零点偏差超过一定阈值(比如 10 个码),先自动校准零点再进入称重状态。这能抵消大部分温度变化和弹性体蠕变带来的误差,也是商用电子秤最基础的自检逻辑。装完样机后,放一个 1kg 砝码,连续开关机测试 50 次,看误差是否稳定在 ±0.5g 以内——这个指标可以直接写进你的结论段。
本文还有配套的精品资源,点击获取