3D打印机工作原理与固件基础:FDM打印流程、运动控制、温度控制、G代码解析、固件与硬件交互方式
在深入Marlin固件源码之前,必须先建立对3D打印机整体工作机理的清晰认知。FDM(熔融沉积成型)打印机本质上是一台由固件驱动的精密三轴运动平台与热管理系统。固件(Firmware)是运行在MCU(微控制器)上的底层软件,它负责解析G代码指令、协调步进电机运动、控制加热元件温度,并实时处理限位开关、温度传感器等外设信号。本章将拆解FDM打印的完整流程,剖析运动控制与温度控制的底层逻辑,并建立G代码与硬件交互的映射关系,为后续的源码分析打下坚实的工程基础。
上图展示了FDM打印从G代码输入到硬件执行的整体链路。固件处于核心位置,向下驱动电机、加热器和IO设备,向上接收G代码指令并反馈状态。理解这条链路是阅读Marlin源码的前提。
2.1 FDM打印流程与固件角色
核心原理:FDM打印的本质是“分层制造”。切片软件将三维模型沿Z轴切成若干薄层,每层由轮廓和填充路径组成,并生成对应的G代码指令序列。固件的任务是将这些指令逐条解释为具体的物理动作:移动喷头到指定坐标、按设定速度挤出熔融塑料、控制热床温度防止翘边等。整个流程可划分为五个阶段:模型切片、预热准备、逐层打印、冷却定型、结束取件。
固件在流程中的职责:
- 指令解析:将G代码字符串(如
G1 X10 Y20 E5 F1800)拆解为运动命令、参数和速度值。 - 运动规划:将目标坐标与当前坐标比较,计算各轴步进脉冲数,并规划加减速曲线。
- 温度管理:读取热敏电阻ADC值,换算为实际温度,通过PID算法控制加热棒通断。
- IO调度:控制风扇转速、探针升降、LED灯等辅助设备。
- 状态反馈:通过LCD、串口或上位机软件报告当前温度、坐标、打印进度。
2.2 运动控制:步进电机与加减速算法
核心原理:3D打印机的运动系统通常由四路步进电机驱动:X轴(左右)、Y轴(前后)、Z轴(上下)和E轴(挤出机)。步进电机每接收一个脉冲信号,就旋转一个固定角度(如1.8°),通过同步带或丝杠转化为线性位移。固件需要精确计算每个轴所需的脉冲数,并按正确的时序发送脉冲。
关键参数与计算:
| 参数 | 含义 | 典型值 | 计算公式 |
|---|---|---|---|
| 步距角 | 电机每脉冲旋转角度 | 1.8° | 360° / 步数 |
| 微步细分 | 驱动器将一步细分为多步 | 16细分 | — |
| 皮带齿距 | 同步带齿间距 | 2mm (GT2) | — |
| 皮带轮齿数 | 驱动轮齿数 | 20齿 | — |
| 丝杠导程 | 丝杠旋转一圈的位移 | 8mm (T8) | — |
例如,X轴采用GT2皮带(齿距2mm)、20齿皮带轮、16细分驱动,则每毫米脉冲数为:200步 × 16细分 / (2mm × 20齿) = 80 pulses/mm。Marlin中的DEFAULT_AXIS_STEPS_PER_UNIT参数即存储此值。
加减速算法:直接以恒定速度发送脉冲会导致电机丢步或机械振动。Marlin采用梯形加减速曲线:启动时逐步加速至目标速度,接近终点时逐步减速。固件内部维护一个速度规划队列,提前计算未来N步的脉冲间隔时间,通过定时器中断精确输出。
// Marlin中梯形加减速的核心参数
#define ACCELERATION 3000 // 最大加速度 (mm/s²)
#define MAX_COREXY_FEEDRATE 200 // 最大速度 (mm/s)
#define MIN_PLANNER_SPEED 5.0 // 最小规划速度 (mm/s)
ACCELERATION是否过大。对于普通Prusa i3结构,建议加速度不超过1500 mm/s²;CoreXY结构可适当提高至2500 mm/s²。同时,确保皮带张紧度适中,过松会导致回差,过紧会增加电机负载。
2.3 温度控制:PID调节与热敏电阻
核心原理:FDM打印对温度精度要求较高:PLA热端需190-220°C,ABS需230-250°C;热床温度则根据材料不同在50-110°C之间。温度控制回路包含三个要素:NTC热敏电阻(传感器)、加热棒(执行器)、PID算法(控制器)。
NTC热敏电阻特性:NTC阻值随温度升高而降低,典型型号为100K NTC(25°C时阻值100KΩ)。固件通过分压电路读取ADC值,再根据Steinhart-Hart方程计算温度:
// 简化版Steinhart-Hart方程
float Temperature::analog2temp(int raw) {
float resistance = 100000.0 * (1023.0 / raw - 1.0); // 假设10K上拉电阻
float temp = 1.0 / (1.0/298.15 + log(resistance/100000.0) / 3950.0);
return temp - 273.15; // 转换为摄氏度
}
PID控制逻辑:Marlin使用位置式PID算法,输出量为加热棒的PWM占空比(0-255)。三个参数分别作用于误差的比例、积分和微分项。当温度接近目标时,比例项减小,积分项消除稳态误差,微分项抑制超调。
| 参数 | 作用 | 调大影响 | 调小影响 |
|---|---|---|---|
| Kp (比例) | 响应速度 | 升温快,易超调 | 升温慢,温度波动大 |
| Ki (积分) | 消除稳态误差 | 消除静差,可能振荡 | 存在恒定温度偏差 |
| Kd (微分) | 抑制超调 | 稳定性好,抗噪差 | 超调明显 |
HEATER_0_MAXTEMP 275°C)会触发热失控保护,强制关闭加热。这是Marlin最重要的安全机制之一,源码中通过thermal_runaway_protection()函数实现。
2.4 G代码解析与固件-硬件交互
核心原理:G代码是3D打印的通用指令语言。固件需要高效解析这些文本指令,并映射到具体的硬件操作。Marlin的解析器采用状态机设计,逐字符读取,识别指令类型(G/M/T)和参数(X/Y/Z/E/F/S/P)。
典型指令解析流程:
- 接收一行字符串,如
G1 X90.5 Y10.2 E0.8 F2400。 - 提取指令类型:
G1表示线性插补运动。 - 提取参数:X=90.5, Y=10.2, E=0.8, F=2400。
- 调用
plan_buffer_line()将目标坐标和挤出量加入运动规划队列。 - 运动规划器计算各轴脉冲数,通过定时器中断输出脉冲。
固件与硬件的交互方式:
| 硬件外设 | 通信方式 | Marlin模块 | 关键函数 |
|---|---|---|---|
| 步进电机 | 脉冲/方向信号 | Stepper | stepper_pulse() |
| 热敏电阻 | ADC模拟量 | Temperature | analog2temp() |
| 加热棒 | PWM输出 | Temperature | set_heater_pwm() |
| 限位开关 | GPIO中断/轮询 | Endstops | endstop_triggered() |
| LCD屏幕 | I2C/SPI/并口 | UI | lcd_update() |
| SD卡 | SPI | CardReader | card.read() |
THERMAL_RUNAWAY_THRESHOLD,固件判定热失控,立即停止打印并显示错误。
2.5 常见误区与总结复盘
误区一:认为G代码中的F值(进给速度)就是实际打印速度。实际上,F值只是目标速度,实际速度受加速度限制。例如,G1 X100 F6000(100mm/s)在短距离内可能只达到50mm/s。
误区二:忽略固件配置中的MAX_ACCELERATION与MAX_FEEDRATE的匹配。如果加速度设置过高,电机会因扭矩不足而丢步,导致层错位。
误区三:随意更换热敏电阻型号而不更新固件中的温度表。不同NTC的B值差异会导致温度读数偏差20°C以上,可能引发打印失败或安全事故。