十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于单片机的称重打包机设计与实现:HX711与状态机实战

基于单片机的称重打包机设计与实现:HX711与状态机实战 简介本资源是一套完整的基于单片机的称重打包机毕业设计/课程设计方案面向电子信息、自动化、机电类本科生及单片机初学者解决智能称重与自动打包系统从原理设计到功能验证的全流程实践需求。压缩包共26个文件911KB涵盖Protues仿真工程.pdsprj/.pdsbak、Keil C51源码.c/.h/.a51/.hex、原理图.SchDoc/.PDF、器件清单.xls、功能说明.txt、程序流程图.png/.bmp及多组仿真结果图.png类型分布清晰便于分模块学习与复现。已有52人下载学习适合用于课程设计答辩、毕设参考或嵌入式项目入门——读者可直接导入Protues运行仿真、加载Keil工程编译调试、对照流程图理解逻辑分支、依据元件清单采购硬件并通过PDF原理图与说明文档掌握校准、称重显示、自动打包及故障自检等核心功能实现细节。1. 方案选型这题目到底该用什么主控为什么我劝你别一上来就选PLC做毕设或者课设的同学看到“基于单片机的称重打包机设计与实现”这个题目第一反应往往是称重打包机听起来是个工业设备是不是得用PLC加触摸屏再配一堆传感器才算正规实话讲如果这个题目是给工厂现场工程做的PLC确实更抗造、更稳定、更好维护。但如果是课程设计或者本科毕设用PLC的成本和工程量都不太合适。一套入门级PLC加模拟量模块下来预算就超了而且梯形图写称重滤波、写状态控制远没有单片机这边灵活、容易出效果。更关键的是只要你把“基于单片机”这几个字读懂这个题目的考察重点就不是“你能不能用工业级设备搭一套产线”而是“你能不能把一个完整的电子系统拆解成感知、处理、执行、交互几个模块然后自己把它们拼起来”。这是一个很典型的电子系统综合设计题单片机恰恰是最合适的载体。具体到主控选型我强烈建议分两条路来考虑。如果你平时接触的是51内核比如STC89C52RC或者STC12系列这个题完全可以做51的资源虽然紧张但称重加打包控制这种场景属于慢速过程控制不需要跑复杂算法2路外部中断加几个IO口就够了。如果你对STM32比较熟或者囤了F103C8T6最小系统板那更好开发环境用STM32CubeMX生成初始化代码HAL库写起来比操作寄存器省心不少后续想扩展个OLED显示、蓝牙上传、按键菜单都会舒服很多。我的建议是不换平台你手里有什么板子就用什么重点是把称重和打包这套流程跑通这个题目对主控的算力要求真不高。再说一个容易踩坑的点很多人拿到题目第一反应是去找“称重打包机实物”的照片然后照着机械机构去设计。这个思路在机械专业行得通但在电子类的毕设里你不需要真的把一台打包机造出来。题目里强调的是“称重打包机”的控制系统和信号处理不是让你去设计机械爪手和捆扎机构。所以核心要解决的是三件事重量的准确采集与显示、按设定阈值自动判断是否到达目标重量、到达后输出控制信号驱动打包执行机构可以是电机、电磁铁或者简单的推杆。换句话说你的“打包”功能在电子层面是“输出一个动作信号”机械部分用一个LED指示灯加一个小电机演示完全够用。想明白这一点整个系统的复杂度就降下来了也更容易在答辩时讲清楚。2. 核心硬件模块拆解与应用场景剖析2.1 称重传感器电阻应变式压力传感器的原理和选型称重部分是整个系统的灵魂传感器选错后面全部白搭。市面上最常见的称重传感器是电阻应变式压力传感器原理说起来其实很简单一块金属弹性体上贴了四片应变片接成惠斯通电桥。当你把重物放在传感器上弹性体受力发生微小形变应变片的电阻值随之变化电桥失去平衡输出一个与重量成正比的差分电压信号。这个差分信号有多小呢我量过一款常见的5kg量程传感器满量程输出大概只有10mV左右也就是满量程才10毫伏。这个电压直接给单片机的ADC去读分辨率根本不够而且信号非常容易被噪声淹没所以要加一级高精度的差分放大器。HX711就是为这个场景量身定做的芯片它内部集成了24位高精度A/D转换器和低噪声放大器带两路差分输入增益可编程32、64、128用串行接口和单片机通信。换句话说HX711把“放大”和“模数转换”两件事一起干了你在单片机端只需要读它的串行数据就行了。选传感器量程的时候有个原则满量程最好是实际最大称重量的1.5到2倍。比如你要打包的物品重量范围是100g到1000g那就选2kg或者3kg的量程不要选5kg。因为传感器在量程的前20%区域线性度相对差一些选太大量程会导致小重量段读数不准反过来选太小量程又容易超载损坏弹性体。我个人的习惯是最大目标重量设为量程的70%左右留足余量同时保证精度。2.2 HX711采样电路设计AVDD、基准电压和滤波电容的处理HX711的电路设计有几个细节能直接影响最终读数质量值得好好说。第一HX711的模拟电源AVDD和数字电源VDD要分开走线而且AVDD的供电要通过一个RC滤波后进入芯片。常见做法是用VDD经一个100Ω电阻串联后给AVDD供电并在AVDD引脚对地放一个10uF电解电容加一个104陶瓷电容并联。这套组合是HX711数据手册上推荐的标准接法实际做下来能明显减少电源纹波对称重数据的干扰。第二差分输入引脚INNA、INPB的走线要尽量短最好从传感器出来的信号线直接进入HX711中间不要经过其他IC。传感器那端的屏蔽线要单点接地别让屏蔽层两端都接否则容易形成地环路引入工频干扰。第三HX711的参考电压由AVDD决定所以AVDD的稳定性直接影响称重精度。如果你用的是5V供电AVDD在5V供电下不支持128增益档位但64和32档没问题。如果项目精度要求比较高可以尝试把增益设为64档配合适当的标定系数效果通常不错。我见过很多人画HX711电路时只在VDD放一个104电容AVDD直接串个10K电阻接电源结果读数漂得厉害。这种细节你在做板子的时候觉得无所谓实际测量起来才知道影响有多大。2.3 执行机构驱动打包电机与继电器的隔离设计称重完成之后系统要输出动作信号去执行“打包”这个动作。这里我用的方案是继电器驱动一个小型直流电机模拟打包机构的动作电机转动几秒钟代表执行了一次打包流程。驱动电路的关键是隔离和续流。单片机是弱电器件继电器线圈是感性负载动作瞬间会产生很大的反向电动势如果不处理轻则干扰单片机正常运行重则直接把IO口打坏。正确的接法是用三极管比如S8050作为开关管驱动继电器线圈线圈两端反向并联一个1N4148二极管作为续流保护同时三极管基极串联一个1kΩ限流电阻由单片机IO口控制。继电器选5V线圈版本的触点端接12V直流电机给电机并联一个104陶瓷电容抑制换向火花。如果你用的是STM32IO口驱动能力相对强一些但也不建议直接用IO口驱动继电器。加一级三极管驱动成本几分钱换来的是系统的长期稳定这笔账怎么算都划算。除此之外我还在电机供电和单片机供电之间做了电源隔离。具体做法是电机用独立的12V电源继电器是5V线圈驱动它的5V电源来自单片机的稳压输出。虽然都属于同一套物理系统但电源路径尽量分开走电机启动瞬间的大电流不会直接拉到单片机供电电压这个细节在很多实验室制作的板子上都被忽略了。3. 软件逻辑与系统实现称重滤波、阈值判断、状态机与核心代码3.1 软件总体框架中断扫描加状态机主循环不要死等称重打包机的软件架构我建议用“一个主循环加一个定时器中断”的经典结构。主循环里跑状态机定时器中断里做按键扫描和显示刷新。不要在主循环里用delay去等待按键或者电机动作否则这段时间内HX711的采样数据会丢显示也会卡顿。整体状态机可以设计成这样空闲态等待启动→ 称重态实时采集重量→ 判定态是否达到目标值→ 打包态启动电机并延时→ 复位态清零回位等待下一次打包。用状态机的优势是逻辑清晰出问题时好排查。每个状态都是独立的不会出现“按键按下后卡在某个while循环里出不来”的情况。这一点在答辩的时候也是加分项老师一听你说用的是状态机架构就知道你不是随手拼的程序。3.2 HX711读取代码与数字滤波实现HX711的串行时序比较简单把PD_SCK引脚拉低然后等待DOUT变为低电平表示转换完成之后在PD_SCK上输出24个上升沿在每个上升沿读取一位数据依次读出24位就得到完整的ADC值。unsigned long HX711_Read(void) { unsigned long value 0; unsigned char i; HX711_SCK 0; while(HX711_DOUT); // 等待DOUT拉低表示数据就绪 for(i 0; i 24; i) { HX711_SCK 1; value value 1; HX711_SCK 0; if(HX711_DOUT) value; } HX711_SCK 1; delay_us(1); HX711_SCK 0; return value; }注意上面这段代码读出来的value是补码形式如果数据最高位是1表示传感器是负压状态也就是空载时传感器被拉伸的情况实际使用中一般不出现需要做符号判断把数据当作有符号数来处理。读取只是第一步真正决定重量读数稳不稳的是滤波算法。HX711的原始数据会有一定跳动这是正常的因为传感器的弹性体受力后存在微小的机械振动加上电磁环境噪声读数会有正负几个字的波动。我用的滤波算法是“去极值滑动平均”连续采集10次数据去掉最大值和最小值剩下8个取平均。这个算法实现简单效果却非常好既能滤掉偶发的脉冲干扰又不会像单纯滑动平均那样把真实变化拉得过于迟钝。unsigned long Get_Filter_Value(void) { unsigned long data_buf[10]; unsigned long sum 0; unsigned char i; unsigned long max, min; for(i 0; i 10; i) { data_buf[i] HX711_Read(); if(i 0) { max data_buf[0]; min data_buf[0]; } if(data_buf[i] max) max data_buf[i]; if(data_buf[i] min) min data_buf[i]; } for(i 0; i 10; i) { if(data_buf[i] ! max data_buf[i] ! min) sum data_buf[i]; } return sum / 8; }3.3 标定与重量换算为什么一上来直接除一个固定系数是错的HX711读出来的原始值是一个无单位的ADC数字怎么把它变成克数答案是标定。标定的原理很简单传感器在空载时读一个值零点值在放上已知重量砝码时读一个值两者之差除以砝码重量得到“每个ADC字对应的克数”也就是比例系数。之后任意时刻的实测重量就是当前读数 - 零点值× 比例系数。零点值需要在每次上电后重新读取一次因为传感器和电路的温漂会让零点缓慢移动。如果你在程序里写死了一个零点值工作久了之后读数会慢慢偏这是很多新手做出来之后“越用越不准”的根源。比例系数的求法我建议用三点取平均分别用100g、200g、500g砝码测量算出每档的比例系数然后取平均。不要图省事只用一个重量标定因为传感器的线性度并不是完美的多取几个点能有效压低非线性误差。// 假设g_weight_type是标定好的比例系数克/ADC字 float Calculate_Weight(unsigned long adc_value, unsigned long zero_value, float coef) { long delta (long)adc_value - (long)zero_value; return delta * coef; }3.4 打包流程的核心控制逻辑打包控制的核心逻辑是用户通过按键设定目标重量系统称重当实际重量达到目标值时停止加料如果是自动上料同时启动打包电机执行打包动作。手动料斗式的简易系统通常只需要实现“称重显示到达阈值触发”但为了更贴近真实场景我加了一个“自动加料模拟”功能用一个直流电机带动螺旋给料器系统启动后电机开始送料重量实时显示到达目标值后电机停止送料蜂鸣器响一声打包电机动作整个流程自动完成。void Packing_Controller(void) { unsigned long current_raw Get_Filter_Value(); float current_weight Calculate_Weight(current_raw, g_zero_value, g_coef); Display_Weight(current_weight); if(system_state STATE_WEIGHING) { Feed_Motor_On(); // 送料电机运行 if(current_weight target_weight - 5) // 加5g提前量防止惯性过冲 { Feed_Motor_Off(); system_state STATE_PACKING; Pack_Motor_On(); // 打包动作 delay_ms(3000); // 打包持续3秒 Pack_Motor_Off(); system_state STATE_FINISH; Buzzer_Twice(); // 提示完成 } } }这里有个很重要的细节停止送料不能等实际重量刚好等于目标重量才去切电机。因为机械结构有惯性电机虽然切断了但螺旋给料器里的物料还会继续落下一点这个“惯性过冲”会导致最终实际重量比目标值偏大。我的做法是提前量判断当实测重量达到“目标值 - 5g”时就提前停止送料这5g就是给机械惯性留下的余量。具体提前量是多少需要根据你的送料速度和物料特性实际测试决定我用的是5g你可以根据自己的机构调整。4. 系统调试实录与常见问题排查4.1 称重值跳动、漂移到底怎么治我调试这个系统时遇到的第一大问题是称重数值在不放任何物体的情况下持续跳变波动范围有正负3g左右。一开始我以为是传感器坏了后来查了一圈发现是三方面的原因叠加一是电源纹波太大二是我用了USB供电的下载线直接给板子供电三是HX711和单片机共用了同一个电源网络。解决方法是按顺序做了三件事第一把电源换成电池或者稳压模块供电不要用USB口直接带负载第二HX711的AVDD供电按照数据手册规范加RC滤波第三HX711数字输出线不要和继电器驱动线绑在一个线束里物理上分开。三件事做完波动降到了正负0.5g效果立竿见影。4.2 校准系数正确但显示重量偏大或偏小先查机械结构还有一种情况是校准做完放上1kg砝码显示却始终在960g左右徘徊。这时候别急着改代码问题很可能出在机械结构上。称重传感器是通过四个角的安装孔固定在底座上的托盘则通过中心的螺纹孔压在传感器弹性体上。如果托盘安装不正或者物料放上去明显偏向一侧传感器受力就不均匀了显示自然会偏。我遇到的情况是托盘底部的支撑螺丝只拧了一颗另一颗悬空整个托盘是歪的导致传感器受力不对称。重新固定并调平之后读数就准了。另外提醒一个容易忽略的点传感器的量程是指弹性体受压的额定值你如果直接把一个重的料斗直接压在传感器上还没放料就已经超载了。一定要估算好料斗本身的重量传感器实际承受的是“料斗自重物料重量”两者之和要在量程范围内。4.3 继电器一动作单片机就重启或死机这是电磁干扰导致的经典故障继电器吸合的瞬间线圈产生的反向电动势和触点产生的电火花噪声会通过电源线传导到单片机导致复位或死机。如果不是最开始的方案就加了续流二极管遇到这个问题后加装三件套基本能解决续流二极管、TVS管、供电去耦电容。具体位置是继电器线圈两端并1N4148继电器触点两端并一个压敏电阻或者RC吸收电路我用的就是一个100Ω电阻和104电容串联并在触点上单片机电源入口处加大容量电解电容470uF和104瓷片电容并联。做完这三处干扰基本消失。对了如果你的继电器是买的那种带光耦隔离的模块一定要把跳线帽设置好让输入侧和输出侧真正隔离否则光耦等于没装信号地和电源地还是通的干扰照样过来。4.4 按键不灵敏或一按跳两个数多半是没做去抖按键消抖是个老生常谈的问题但在状态机里做按键扫描时有个新手容易踩的坑按键消抖用延时去等结果把状态机整个卡住了。我的做法是在定时器中断里每10ms扫描一次按键连续扫描到同一个键值为3次以上才认为按键有效这样既不阻塞主循环又能有效滤除机械抖动。如果你用的是STM32的外部中断方式检测按键那更简单在中断回调函数里置一个标志位回到主循环后再做防抖判断尽量避免在中断服务函数里做耗时的处理。4.5 常见问题速查表现象可能原因排查顺序称重值持续跳变电源纹波大、传感器信号被干扰先换电源再查布线最后查滤波校准后读数偏差大机械结构受力不均、砝码不准先调平再检查砝码是否标准继电器动作时系统复位线圈反向电动势、电源瞬断先加续流再加去耦电容通电后HX711无输出接线错误、晶振未启动量DOUT电平查时钟波形重量显示向一个方向缓慢漂移温漂、传感器弹性体蠕变重新标定零点降低长时间满量程负载5. 从毕设到实物PCB布局、接插件选型与装配过程实录画PCB的时候有个原则模拟信号线、数字信号线、电源线要分层或分区域走。HX711和传感器属于模拟部分尽量放在板子的一侧继电器和电机属于强电干扰源放在另一侧。中间用地线或者大片的铺铜做隔离。如果板子尺寸允许把继电器模块做成独立的接口用排针引出外接模块这样即便继电器坏了更换起来也方便还不会因为继电器模块的发热影响整个系统稳定性。接插件的选择上传感器和HX711之间的连线用带屏蔽的杜邦线或者直接焊接不要用那种裸露的长排线容易收到周围电磁干扰。按键和LCD1602的排母留好这些部件经常要拆卸调试做成可插拔的后期维护省很多事。装配时有一个很容易被忽略的点传感器的安装螺丝一定要拧紧。如果螺丝没拧紧传感器底座和安装面之间存在微小间隙称重时会发生相对位移导致读数很不稳定。但也不要拧到完全卡死传感器的安装孔周围一般有沉台设计过大的扭矩会让弹性体本身产生预紧形变影响零点。我一般是先用手把螺丝拧到感觉到阻力的位置再用螺丝刀带一圈半左右的力这样既不会松动也不会过度压紧。整个系统做下来我的板子用了双面板元器件数量不多焊接难度也不大。如果时间紧用万能板飞线也能完成但接线乱的后果就是调试时查问题特别痛苦。这个项目我还是建议认认真真画一版PCB哪怕是一次性打样算下来也就几十块钱换来的是稳定的系统和愉快的调试体验这笔投入值。6. 项目扩展方向从课设到真正能用的智能称重终端这个题目其实有很多扩展空间做完了基础功能之后如果想在毕设里加分可以考虑加几个方向。第一加通信模块做成物联网称重终端。用ESP8266或者ESP32模块通过串口和单片机通信把每次的称重数据上报到云端手机端做一个简单的页面就能查看历史记录。这样一套系统就从单机版的机器变成了一个数据驱动的设备。这一块在答辩时特别能出彩因为老师一般会对“数据上云”这类应用很感兴趣。第二加EEPROM存储标定参数和批次记录。用AT24C02之类的EEPROM芯片把标定系数、目标重量、当天打包次数存下来断电不丢失。这样每次开机不需要重新标定生产数据也可以追溯更贴近真实的工厂需求。第三把显示从LCD1602换成OLED屏或者TFT彩屏做一个更友好的交互界面。可以显示实时重量曲线、目标设定值、当前批次完成数等信息密度高很多看起来也更大气。如果你用的是STM32以上扩展都可以在原有的工程上加代码实现不需要大改硬件。如果用的是51单片机受限于存储空间建议优先做EEPROM存储和串口上传OLED显示对51来说资源会紧张一些但也不是不能做。我个人做完这个项目的体会是称重打包机看起来是一个偏硬件的题目真正卡住人的地方往往不是硬件本身而是对传感器信号的理解和对抗干扰的处理能力。把这些细节想明白、做扎实你收获的不仅仅是一个能跑的毕设更是一整套处理真实工程问题的思路。这套思路比任何一块开发板和一套代码都值钱。本文还有配套的精品资源点击获取
返回列表