从开环到闭环:我的3D打印机挤出机电机升级记(基于Arduino+TB6600驱动器)
去年冬天的一个深夜,我的3D打印机正在赶制一批圣诞装饰件。当打印到第15个小时时,突然听到挤出机发出刺耳的"咔咔"声——又是该死的挤出不均匀问题。这已经是本月第三次因为挤出问题导致打印失败,看着卷曲变形的PLA材料和浪费的十几个小时,我下定决心要彻底解决这个顽疾。
1. 为什么需要闭环控制?
大多数桌面级3D打印机都采用开环控制的步进电机驱动挤出机。这种设计简单可靠,在低速打印时表现尚可。但当遇到以下场景时,问题就会暴露无遗:
- 高速打印:当打印速度超过80mm/s时,电机扭矩下降导致失步
- 柔性材料:TPU等软性耗材需要更精确的挤出压力控制
- 快速回抽:频繁的换丝操作容易造成位置累积误差
我在Creality Ender-3上做的实测数据显示:
| 打印速度(mm/s) | 开环挤出误差率 | 闭环挤出误差率 |
|---|---|---|
| 50 | 2.1% | 0.3% |
| 80 | 8.7% | 1.2% |
| 120 | 23.5% | 2.8% |
提示:误差率通过称量实际挤出耗材重量与理论值对比得出
2. 硬件改造方案
2.1 核心组件选型
经过对比测试,最终确定的硬件配置如下:
// Arduino引脚定义 #define ENCODER_A 2 // 中断引脚 #define ENCODER_B 3 #define STEP_PIN 4 #define DIR_PIN 5 #define ENA_PIN 6关键部件清单:
- 主控:Arduino Nano(ATmega328P)
- 驱动器:TB6600(最大4A电流)
- 编码器:600PPR增量式旋转编码器
- 电机:42步进电机(1.8°/步)
2.2 机械安装技巧
在BMG挤出机上安装编码器时,我总结出几个要点:
- 使用柔性联轴器隔离电机振动
- 编码器轴与电机轴必须严格同轴
- 保持0.1-0.2mm的轴向间隙
- 用屏蔽线连接编码器信号
3. 软件实现细节
3.1 PID控制算法
采用位置式PID算法,核心代码如下:
void Stepper_Speed_Ctrl() { static long lastCount = 0; long currentCount = encoder.getCount(); float actualSpeed = (currentCount - lastCount) / (ENCODER_PPR * SAMPLING_TIME); pid.Setpoint = targetSpeed; pid.Input = actualSpeed; pid.Compute(); adjustPulseWidth(pid.Output); // 动态调整PWM占空比 lastCount = currentCount; }PID参数整定经验:
- 先设I=D=0,增大P直到出现等幅振荡
- 取振荡周期T,按Z-N法设置:
- P = 0.6*Kp
- I = 0.5*T
- D = 0.125*T
3.2 抗干扰处理
遇到的两个典型问题及解决方案:
信号抖动:
- 在编码器输入引脚加10nF电容
- 使用施密特触发器整形信号
电机干扰:
- 驱动器电源独立供电
- 信号线使用双绞线
- 加装磁环
4. 实际效果对比
改造前后的打印质量差异非常明显:
PLA材质测试:
- 层间结合力提升27%
- 表面粗糙度降低42%
- 尺寸精度误差<0.05mm
柔性材料测试:
- TPU打印成功率从65%提升至98%
- 回抽残留减少83%
最让我惊喜的是高速打印的改善。现在可以稳定以120mm/s的速度打印PLA,而以前超过80mm/s就会出现挤出不足。这个项目总共花费不到200元,但带来的提升远超预期。