粉料包装机单片机称重闭环:选型、滤波与两级给料实战 📅 发布时间:2026/9/20 4:27:22 👁 浏览次数: 简介围绕单片机控制的粉料自动包装机系统这份文档提供一套较完整的毕业设计式技术方案适合自动化、电气工程及机电一体化专业学生和初入包装设备行业的工程师参考。内容从国内外粉料包装控制系统的发展现状与现存问题切入梳理总体方案、工艺流程与设计步骤再逐项展开硬件选型与电路设计涵盖封口、装料、称重、光电检测、放大电路、显示模块、主处理器选型及系统原理图软件部分结合 Keil 讲解包装袋制作、数码管显示、MAX485 与单片机间数据传递的程序分析并给出系统调试流程与 Protel-DXP 软件介绍。资源包共 1 个 doc 文档约 410KB按绪论、方案设计、硬件、软件、调试分章编排目录清晰便于按模块查阅。目前已有 93 人学习下载可帮助读者理解粉料称重与包装控制的关键环节为课程设计、毕业设计或同类系统开发提供参考。1. 粉料包装机为什么绕不开单片机从称重闭环说起一袋标称 25kg 的腻子粉灌到 25.3kg 才关阀一天 2000 袋就是 600kg 的偏差对账时这笔账很难看。粉料包装机要解决的核心就是物料还在下落的过程中判断什么时候停。链条是称重传感器 → 放大与 AD 转换 → 单片机滤波与阈值比较 → 关阀任何一环慢半拍精度都守不住。不少人第一反应是上 PLC稳定、抗干扰、组态方便。但单工位、200600 袋/小时的小型粉料包装机用 PLC 是杀鸡用牛刀一套带称重模块的 PLC 够买几十片 STC 或 STM32。单片机的价值在于把称重采集、两级给料逻辑、串口参数下发、数码管或 LCD 显示全塞进一颗十几块钱的芯片控制板成本压得住批量出货才有利润空间。适合谁做包装机械的中小厂、机电专业的课程设计与毕业设计、老式机械秤包装机的电子称重改造。粉料之间差别很大面粉、淀粉流动性好还能靠时序凑合腻子粉、水泥扬尘重、下料冲击大必须走称重闭环。下面从选型一路讲到产线验证。2. 粉料包装机控制系统的硬件选型与称重信号链粉料包装机的控制板说穿了就是围着称重这条信号链搭起来的。选型阶段省下的时间往往是后面现场跑不稳的根源传感器量程选小被冲击力打坏选大了分辨率不够MCU 主频太低滤波窗口一拉长采样就跟不上给料节奏。2.1 单片机选型51、STC 与 STM32 在粉料包装机上的取舍先说 51 内核。STC89C52RC 是最常见的入门选择价格低、Keil C51 教程满地都是、寄存器简单。它的短板也明确片上 RAM 只有 256 字节定时器只有 T0/T1 两个串口一套堆栈空间小。做一个纯时序控制定时器到点就翻继电器的机型够用但要跑加权滤波、串口协议解析、数码管动态扫描三个任务并行代码一写厚就容易出现某一帧数码管闪一下这类时序打架。STC15/STC8 系列是 51 指令集的升级版1T 内核在同频下比 12T 的老 51 快约 12 倍片上还带 EEPROM。粉料包装机的标定系数、目标重量、粗给料提前量这些参数直接写进 EEPROM 就能掉电不丢比外挂 24C02 省一颗料、省两条 I2C 线。称重闭环 串口参数下发这种典型需求STC8H8K64 这类 8KB RAM 的型号很舒服。需要多工位、要接触摸屏、或者要做生产数据记录比如按班次存到 SD/TF 卡里以表格形式导出再考虑 STM32F103C8T672MHz、多路定时器、多路 12 位 ADC、DMA可以把采样、通信、显示拆到不同外设上跑不用再靠软件硬挤。单片机主频/内核RAM适合机型注意点STC89C52RC12MHz / 12T256B单工位、时序为主T0/T1 别用满留一个给串口波特率STC8H8K6424MHz / 1T8KB单/双工位称重闭环EEPROM 写次数有限标定参数别每袋都写STM32F103C8T672MHz / Cortex-M320KB多工位 触摸屏ADC 参考电压要单独稳别直接吃 3.3V 数字电源选型上我一般这样判断如果目标重量只能写到 0.1kg 级、给料靠时间关阀51 足够如果要求 ±20g 以内、必须做两级给料加动态提前量直接上 1T 的 STC 或 STM32省得后期为了能不能再快一点来回改板。2.2 称重传感器与 HX711 信号链的量程和接线粉料包装机的称重核心是电阻应变式称重传感器配 HX711 这类 24 位专用 AD。量程选择有个常用经验传感器额定容量取包装目标值的 1.52 倍。做 25kg 包装选 30kg 或 50kg 量程。选 30kg 是因为满量程接近工作点有效分辨率利用率高选 50kg 是留抗冲击余量代价是同样的 AD 位数下每克对应的码值更少。算一下分辨率。假设 30kg 传感器、HX711 有效位数按 18 位估算不是标称 24 位实际噪声下有效位会掉满量程码值约 262144则每克约 8.7 个码值。25kg 目标 ±25g 的精度要求对应约 ±220 个码值余量充足。换成 50kg 传感器每克约 5.2 个码值仍然够用。所以量程放大一档不至于让精度崩掉但再大就要谨慎了。接线方面四线制称重传感器是 E、E-、S、S-HX711 模块上对应 E、E-、A、A-屏蔽线单端接地走线尽量远离电机和变频器动力线。HX711 与 MCU 只要两根线DOUT 和 SCK。// HX711 读一次 24 位数据通道 A 增益 128 // DOUT 接 P2.0SCK 接 P2.1STC8 引脚直接位操作 unsigned long HX711_Read(void) { unsigned long val 0; unsigned char i; while (HX711_DOUT); // 等待 DOUT 拉低表示本次转换完成 for (i 0; i 24; i) { // 读 24 位高位在前 HX711_SCK 1; // 上升沿芯片输出当前位 val 1; if (HX711_DOUT) val; HX711_SCK 0; // 下降沿准备下一位 } HX711_SCK 1; // 第 25 个脉冲设定下一周期通道与增益 HX711_SCK 0; val ^ 0x800000; // 24 位补码转原码得到有符号差值 return val; }这段代码的关键点有三个。while (HX711_DOUT)是等转换结束如果一直卡在这里多半是 SCK 悬空或者传感器没供电。val ^ 0x800000这步不能省HX711 输出的是补码不做这步空秤时读出来会是一个接近 0x800000 的大数标定时会以为传感器坏了。第 25 个脉冲决定下个周期的通道和增益只读通道 A 增益 128 的话固定发一个脉冲就行要切通道就得按芯片时序给不同脉冲数。提示HX711 的供电和参考电压共用 AVDD如果直接用开关电源的 5V纹波会直接进 AD。控制板上给它单独加一级 LC 滤波或者用 5V 后接一颗低噪声 LDO 供 AVDD读数稳定性差别很大。2.3 给料执行机构与 IO 分配表粉料给料一般分两种执行方式。一种是螺旋给料机靠三相电机或者直流电机带动控制上就是接触器或继电器的启停另一种是振动给料靠电磁振动器用可控硅调压控制振幅。前者逻辑简单后者的振幅可以直接映射成下料速度细给料阶段把振幅调小冲击会更平缓。包装动作一共就几个夹袋气缸夹住袋口、粗给料开、细给料开、称重到位关给料、松袋、放袋。加上急停、启动、光电到位检测一个单工位的 IO 表大致如下。功能方向典型引脚说明HX711 DOUT输入P2.0需上拉内部弱上拉可用HX711 SCK输出P2.1推挽输出粗给料继电器输出P1.0经 ULN2003 或光耦驱动细给料继电器输出P1.1同上夹袋电磁阀输出P1.2加续流二极管松袋电磁阀输出P1.3与夹袋互锁启动按钮输入P3.2外部中断 INT0做急启急停按钮输入P3.3常闭断线也要停机袋到位光电输入P3.4检测袋口是否夹好蜂鸣器输出P1.4报警与到位提示急停用常闭接法是粉料包装机上很重要的一条。常开接法一旦线断了MCU 读到的一直是没按急停等于保护失效。常闭接法断线读到的是急停生效宁可误停也不能漏停。初始化阶段要注意上电先关所有输出再读一次 HX711 扔掉第一帧最后才进主循环。继电器驱动的感性负载在断开瞬间会产生反压输出脚和地之间并一颗续流二极管或者直接用 ULN2003 这类带续流二极管的驱动芯片能省掉不少跑几天继电器就偶尔不吸合的怪毛病。3. 粉料包装机的定时器采样、滤波与两级给料逻辑硬件定了真正决定包装精度的是软件里那几条判断。粉料下落的惯性和空中余料是绕不过去的物理事实控制逻辑要做的就是把传感器现在多重换算成还能不能继续喂。3.1 两级给料粗给料与细给料的阈值怎么定单级给料的问题是如果在接近目标时才关冲击大、超差多如果一开始就慢喂效率太低。业内通行做法是两级先粗给料把大部分料快速灌进去到某个阈值比如目标值的 85%90%切细给料用低速把剩下那一小截喂准。切细的阈值怎么定跟物料流动性关系最大。面粉、淀粉流动性好切细点可以设在 90%92%因为后面补料快、滞后小腻子粉、碳酸钙这类粘性大、易结拱的粉料切细点设在 80%85% 更稳妥宁可留多一点给细给料阶段也别让大量料在最后一刻一起砸下来。物料类型粗/细切换阈值细给料提前量占目标值备注面粉、淀粉目标值 × 0.900.920.3%0.8%流动性好提前量小腻子粉、碳酸钙目标值 × 0.800.851.0%2.0%防结拱留料多水泥、干混砂浆目标值 × 0.820.880.8%1.5%扬尘大检查密封提前量的含义是当称重读数还没到目标值但已进入目标值 - 提前量这个区间时就要提前关断给料剩下的量靠空中余料自然落完。提前量设太小会超差偏高设太大就会欠灌这个数只能现场试出来。3.2 51单片机定时器中断驱动的称重采样与滑动滤波称重信号里混着给料振动带来的抖动单次读数直接拿去比较会在阈值附近来回跳。常见做法是用定时器固定节拍采样再做滑动平均。STC 的定时器按 10ms 一次比较合适既跟得上给料节奏又不会让中断太频繁。#define FILTER_N 8 static long filter_buf[FILTER_N]; static unsigned char filter_idx 0; static bit sample_flag 0; // 定时器 0 初始化10ms 中断一次1T 内核24MHz void Timer0_Init(void) { TMOD 0xF0; // 保留 T1 配置清掉 T0 位 TMOD | 0x01; // T0 工作在模式 116 位定时 TH0 0xD8; // 24000 计数对应 10ms按实际主频核算 TL0 0xF0; ET0 1; // 允许 T0 中断 TR0 1; // 启动定时器 EA 1; // 开总中断 } // 定时器 0 中断服务函数只置标志不在中断里做重活 void Timer0_ISR(void) interrupt 1 { TH0 0xD8; // 重装初值 TL0 0xF0; sample_flag 1; // 交给主循环处理 } // 滑动平均滤波返回处理后的重量码值 long Weight_Filter(long raw) { long sum 0; unsigned char i; filter_buf[filter_idx] raw; filter_idx (filter_idx 1) % FILTER_N; for (i 0; i FILTER_N; i) { sum filter_buf[i]; } return sum / FILTER_N; }这段代码里有两个容易踩点。一是中断里只置标志、不读 HX711因为读一次 HX711 要等 24 个时钟周期加转换时间放在中断里会把其它中断拖住主循环看到sample_flag再读、再滤波、再做判断节奏反而更稳。二是滑动平均窗口取 8 是经验值窗口太短滤波不干净太长会让重量读数整体滞后细给料阶段判断还剩多少时就会偏乐观最终超差。试出合适的窗口长度一般用一串实际灌装数据回放对比最快。提示如果现场振动特别大滑动平均之外可以再叠一个限幅——单次读数与上次滤波值的偏差超过阈值就认为是被干扰直接丢弃这一帧。这个方法对继电器动作瞬间的尖峰抑制很有效。3.3 用状态机把夹袋、灌装、放袋串起来包装流程是典型的状态迁移用一堆 if-else 堆时序会越写越乱。写成状态机之后每个状态只关心自己这一段的进入条件、退出条件和超时保护调试时看一个状态变量就知道流程卡在哪。状态划分建议待机 → 夹袋 → 粗给料 → 细给料 → 空中余料等待 → 称重确认 → 放袋 → 回到待机。其中空中余料等待是最容易被省掉的一步但它是精度的关键给料关断之后必须留一个稳定延时等袋内物料落稳再读数确认否则确认的时刻物还在空中飘读出来永远偏低。typedef enum { ST_IDLE, ST_CLAMP, ST_COARSE, ST_FINE, ST_SETTLE, ST_CONFIRM, ST_RELEASE } PackState; static PackState state ST_IDLE; static unsigned long state_tick 0; void Pack_Step(void) { switch (state) { case ST_IDLE: if (start_btn 0) { CLAMP_ON(); state ST_CLAMP; state_tick 0; } break; case ST_CLAMP: if (state_tick 30) { // 300ms 夹袋到位 COARSE_ON(); state ST_COARSE; state_tick 0; } break; case ST_COARSE: if (weight_g target_g * 0.85) { // 切细给料阈值 COARSE_OFF(); FINE_ON(); state ST_FINE; state_tick 0; } break; case ST_FINE: if (weight_g target_g - lead_g) { // 提前量关断 FINE_OFF(); state ST_SETTLE; state_tick 0; } break; case ST_SETTLE: if (state_tick 50) { // 500ms 等余料落稳 state ST_CONFIRM; state_tick 0; } break; case ST_CONFIRM: record_weight(weight_g); // 记录本袋实际重量 state ST_RELEASE; state_tick 0; break; case ST_RELEASE: CLAMP_OFF(); RELEASE_ON(); if (state_tick 20) { RELEASE_OFF(); state ST_IDLE; } break; } }几个参数对应关系要捋清target_g是目标重量lead_g是提前量weight_g来自滤波后的码值换算。state_tick的单位是流程节拍如果主循环里用 10ms 定时标志驱动Pack_Step()那 30 个 tick 就是 300ms。所有延时都要有超时兜底——比如粗给料如果 10 秒还没到阈值说明结拱堵料了必须报警停机不能无限等下去。4. 粉料包装机控制板的串口参数下发与现场排错成品包装机交付之后客户换物料、换规格是家常便饭。如果每次改目标重量都要拆机壳重新烧录售后成本会失控。把参数做成串口下发、存进 EEPROM是一条省事又省心的路。这个串口通道同时还能承担固件升级现场维护时不用把板子拆下来。4.1 串口帧格式设计与上位机参数下发串口协议不用做得复杂但要能自校验。定长帧 帧头 校验和是工控现场最稳的写法上位机PLC、组态屏、或者一台跑串口助手的笔记本只要按格式发MCU 收到后先校验再执行。偏移字节数含义示例01帧头0xAA11命令字0x01 设目标重量 / 0x02 设提前量 / 0x03 读状态22数据高字节在前25000 表示 25.000kg单位 g41校验和前 4 字节累加取低 8 位51帧尾0x55MCU 侧接收用串口中断收满 6 字节再校验不在中断里做 EEPROM 写操作。#define FRAME_LEN 6 static unsigned char rx_buf[FRAME_LEN]; static unsigned char rx_cnt 0; static bit frame_ready 0; void UART_ISR(void) interrupt 4 { unsigned char c; if (RI) { RI 0; c SBUF; if (rx_cnt 0 c ! 0xAA) return; // 不是帧头直接丢弃 rx_buf[rx_cnt] c; if (rx_cnt FRAME_LEN) { rx_cnt 0; if (rx_buf[5] 0x55 rx_buf[4] (unsigned char)(rx_buf[0] rx_buf[1] rx_buf[2] rx_buf[3])) { frame_ready 1; // 校验通过交给主循环 } } } if (TI) TI 0; }主循环里判断frame_ready按命令字写 EEPROM 并回一帧确认。这一套也顺便把固件升级打通了上位机按固定帧格式把新固件分块发下来MCU 先写进 EEPROM 缓存区校验整体 CRC 通过后再跳转到升级引导程序擦写程序区中途断电最坏也就是升级失败旧程序还在不会变砖。这种思路和 STC 单片机常见的串口在线升级架构是一个道理。注意写 EEPROM 只在参数变更那一刻做别每袋都写。EEPROM 擦写次数一般十万次量级按袋写几天就可能写坏。4.2 称重标定与提前量参数整定标定是精度能不能守住的前提。最常用的做法是两点标定空秤读一次原始码值raw0放上已知标准砝码再读raw1两者对应的实际重量分别是 0 和W。标定系数 砝码重量 / (raw1 - raw0)。之后任意读数的重量换算# 上位机侧做标定与验收数据的记录串口读回的原始码值直接算 raw0 8312450 # 空秤码值 raw1 8720130 # 放上 20kg 砝码后的码值 W 20000.0 # 砝码重量单位 g k W / (raw1 - raw0) def to_gram(raw): return (raw - raw0) * k print(to_gram(8720130)) # 输出接近 20000.0标定完不要急着上线先做一轮空跑用正常速度灌 20 袋记录每袋实际重量。看偏差的分布形态。如果大部分偏高、随目标重量线性增大先怀疑标定系数或传感器线性如果整体偏低固定量说明提前量设小了往上调一档再试如果忽高忽低、没有规律那是滤波或干扰问题先去查信号线走线和电源纹波动参数没用。提前量整定的实操做法是从 1.0% 目标值开始每灌 10 袋统计一次均值偏差超过 ±10g 就调 0.2% 再试直到连续 30 袋都落在 ±20g 以内。换物料后必须重新整定因为流动性和堆积密度变了原来的提前量不再适用。4.3 扬尘、振动与常见故障定位粉料现场比多数电子设备环境恶劣粉尘细、湿度不定、周围有电机和变频器。故障定位顺着信号链走效率最高。现象优先排查处理方式称重读数一直不动HX711 供电、传感器接线万用表量 AVDD检查 E/E- 是否短路读数跳动 ±100g 以上电源纹波、屏蔽线接地示波器看 AVDD 纹波单端接地空秤读数缓慢漂移传感器受潮或温漂加温度补偿或更换防护等级高的传感器串口偶尔丢帧波特率偏差、线材过长用 11.0592MHz 晶振算波特率加隔离输出继电器不吸合驱动芯片或续流二极管换 ULN2003检查感性负载反压急停不起作用急停接法错误改常闭接法断线触发保护串口波特率是常被忽略的一项。51 单片机用定时器产生波特率时主频选 11.0592MHz 而不是 12MHz就是因为 11.0592 能被标准波特率整除误差最小。用 12MHz 硬算出来的波特率有固有误差实验室看不出问题到现场长线一跑就丢帧。这条经验在 STC 上依然成立虽然 STC 内部时钟可以配置但用外部晶振时还是优先 11.0592。5. 粉料包装机控制系统的稳定性验证技巧样机在实验室跑通跟产线上连续三天不掉链子是两回事。稳定性验证里我一般会做三件事把参数拉出工作范围做边界测试、上真料连续跑一批记录偏差、再模拟断电和急停看复位行为。边界测试是最快暴露问题的一步。把目标重量设到控制器允许的最小值比如 5kg跑 10 袋再设到最大值比如 50kg跑 10 袋看两级给料的阈值逻辑在小重量下是不是还成立——如果提前量按比例算目标重量小的时候提前量也跟着变小容易直接被忽略掉导致超差。反过来大重量时粗给料切细的阈值绝对量很大如果细分给料能力不够最后一个粗给料就把料砸过头了。真料连续跑这一批重点是记录每条袋子的实际重量和状态机走到的最后状态。把数据存到 SD/TF 卡里按班次生成一张表格出问题时直接对照时间戳看是哪一袋卡住、卡在哪个状态。这套数据记录不需要复杂慢速串口打点或者简单 SPI 写卡都行关键是能回溯。断电复位行为要单独测。在粗给料中途直接拔电重新上电时控制板必须先进待机、所有输出关闭绝对不能带着上次的半袋料直接进下一次灌装。复位后如果检测到袋位传感器仍被挡住应该先放袋清料再回待机不要自动续灌。这套逻辑在代码里体现为启动时先关输出、再判断传感器、最后才允许启动写在与主循环并行的初始化函数里代码不长但能挡掉不少现场事故。最后一个技巧是把参数整定的流程也做成可复现的目标重量、提前量、滤波窗口、串口波特率这几个值全部通过上位机一键下发、存进 EEPROM并在数码管上能逐项翻看当前生效值。换物料时操作员自己就能改售后不用每单都跑现场这套系统的维护成本才算真正压下来。本文还有配套的精品资源点击获取