GRBL 四轴运动控制系统 — 从原理到源码指南
一、关键
原生 GRBL(Arduino Uno / ATmega328P)天生只支持 3 轴(X、Y、Z)——不是软件"没写",而是芯片资源硬限制。
| 资源 | ATmega328P | 是否够 4 轴 |
|---|---|---|
| Flash | 32KB | GRBL 1.1 吃掉 ~28KB,无余量 |
| RAM | 2KB | 步进 ISR 里每个轴都要保留状态/计数器,加第4轴直接爆 |
| GPIO | 有限引脚 | STEP/DIR/LIMIT 全部挤在 PORTD,没地方插第4轴 STEP/DIR |
所以:想做真·四轴(XYZ + A旋转轴),必须换平台或换分支。
二、三种靠谱路线(按推荐度排序)
| # | 方案 | 平台 | 多轴支持 | 推荐场景 |
|---|---|---|---|---|
| 1 | GRBLHAL | STM32F103/F4 / ESP32 | 原生 6 轴 | 自制控制板、新设计 |
| 2 | grbl-Mega-5X | Arduino Mega2560 + RAMPS1.4 | 4~6 轴 | 低成本、用现成 RAMPS shield |
| 3 | 自己改 GRBL 0.9/1.1 | Mega2560 | 4 轴 | 学习原理、课程设计 |
下面分别展开。
三、路线 ① GRBLHAL on STM32 — 原生多轴
GRBLHAL 是 GRBL 的官方后继架构重构版(同一个核心维护者推动的方向),把硬件抽象层(HAL)抽离出来,支持:
- STM32F103/F4/F7、ESP32、Teensy、模拟器……
- 原生 N_AXIS 可配(最多 6 轴甚至更多)
- 性能远强于 AVR(72MHz→200MHz+,硬件定时器 PWM)
源码仓库
| 项目 | 地址 |
|---|---|
| grblHAL 核心 | github.com/grblHAL/core |
| STM32F4xx 移植 | github.com/grblHAL/STM32F4xx |
| ESP32 移植 | github.com/grblHAL/ESP32 |
四轴关键配置(grblHAL)
在 grblHAL/STM32F4xx/main.c 或你的板级配置头文件里:
// my_machine.h — 板级配置文件
#define N_AXIS 4 // ← 启用 4 轴
#define A_AXIS_PRESENT // ← 声明 A 轴存在
// 引脚映射:A 轴的 STEP / DIR / LIMIT
#define A_STEP_PORT GPIOB
#define A_STEP_PIN 0 // PB0
#define A_DIR_PORT GPIOB
#define A_DIR_PIN 1 // PB1
#define A_LIMIT_PORT GPIOA
#define A_LIMIT_PIN 15 // PA15(可选限位)
在 $ 参数设置里,A 轴会自动出现:
$100 → X steps/mm
$101 → Y steps/mm
$102 → Z steps/mm
$103 → A steps/°degree ← 新增!
$110 → X max rate
$111 → Y max rate
$112 → Z max rate
$113 → A max rate (°/min)
G-code 里直接用:
G1 X10 Y20 Z-2 A45 F500 ← A 轴旋转到 45°
G1 A90 F300 ← 纯旋转
四、路线 ② grbl-Mega-5X
如果你手上已经有 Arduino Mega2560 + RAMPS 1.4,这个是最省钱的路径。
仓库
github.com/fra589/grbl-Mega-5X
支持:X / Y / Z / A(还有 B),RAMPS 1.4 的 5 个驱动器插槽正好用完。
RAMPS 1.4 引脚对应关系
| 轴 | STEP | DIR | 驱动器位置 |
|---|---|---|---|
| X | D54 (A0) | D55 (A1) | X |
| Y | D60 (A6) | D61 (A7) | Y |
| Z | D46 | D48 | Z |
| A | D36 (AUX-2) | D34 (AUX-2) | EXT1 / 第四个驱动 |
| E(可选B) | D26 | D28 | EXT2 |
关键编译开关(cpu_map.h / config.h)
// 在 grbl-Mega-5X 里,核心就这一处
#define N_AXIS 4 // 改 3→4 (作者已经替你做好了,你只需要选配置)
// 启用 A 轴 G-code 解析
#define A_AXIS_ENABLE
刷入后,上位机(bCNC / UGS / Candle / LightBurn)发送:
$$
你会看到新增的 $133、$134 等 A 轴参数。
五、路线 ③ 手动给 GRBL 1.1 加第 4 轴
如果你是为了课程/毕设/搞懂原理,想知道 "改 N_AXIS 到底要动哪些文件",下面逐层拆开:
5.1 核心障碍在哪?
GRBL 的性能秘诀是:步进 ISR 里用端口位掩码一次性输出所有 STEP 脉冲
// stepper.c — 原始 3 轴版本(简化)
uint8_t step_port_bits = 0;
if (step_outbits.x_step) step_port_bits |= (1<<X_STEP_BIT);
if (step_outbits.y_step) step_port_bits |= (1<<Y_STEP_BIT);
if (step_outbits.z_step) step_port_bits |= (1<<Z_STEP_BIT);
STEP_PORT = step_port_bits; // ← 一条指令,3 轴同步
加第 4 轴意味着:
- 要么把 STEP 引脚分散到两个 GPIO 端口(破坏 "一条指令输出" 的假设)
- 要么换到 Mega 用 PORTA/PORTL 等更大的端口空间
- DDA 插补器的
counter[N_AXIS]、steps[N_AXIS]全部要扩维 - EEPROM 布局变了 → 首次启动必须
$RST=*或擦除
5.2 最少修改清单(概念性)
(1) nuts_bolts.h
// 原来
#define N_AXIS 3
enum { X_AXIS=0, Y_AXIS, Z_AXIS, AXIS_COUNT };
// 改为
#define N_AXIS 4
enum { X_AXIS=0, Y_AXIS, Z_AXIS, A_AXIS, AXIS_COUNT };
(2) gcode.c — 解析 A 字
// 在 gcode 字母解析表里加
case 'A': case 'a':
gc_block.values.a = parse_float();
gc_block.modal.motion.axis_flag |= (1<<A_AXIS);
break;
(3) stepper.c — DDA 扩维
// 原来是 fixed32 counter[N_AXIS]
fixed32 counter[N_AXIS]; // 现在 N_AXIS=4 → 自动扩
// STEP 输出:A 轴单独处理(因为不在同一条 PORT 上了)
if (step_outbits.a_step) SET_A_STEP_HIGH();
// …ISR 尾 …
if (step_outbits.a_step) SET_A_STEP_LOW();
(4) settings.h — EEPROM / $参数 扩维
// steps_per_mm[3] → [4]
// max_rate[3] → [4]
// acceleration[3] → [4]
// max_travel[3] → [4]
这套手动改法的坑是:几乎每个涉及轴数的循环、枚举映射、报告字符串、CRC 校验、EEPROM 偏移都要同步改。这也是为什么社区主流走向了 GRBLHAL(HAL 解耦)而不是直接
#define N_AXIS 4。
参考代码 开源的运动控制系统 www.youwenfan.com/contentcnv/103509.html
六、四轴运动控制的核心差异:直线插补 vs 旋转轴
这一点很多人忽略——
| 项目 | XYZ(直线轴) | A 轴(旋转轴) |
|---|---|---|
| 单位 | mm | 度 ° 或 mm(皮带轮周长换算) |
| 单位换算 | steps/mm | steps/° = (步距角×微步×减速比) / 360 |
| 连续旋转 | 不限行程(可选) | $134=360 或设为 0 表示无限 |
| 插补 | XY 平面圆弧 G2/G3 只走 XY | A 参与螺旋线:G2 X.. Y.. A..(需要 CAM 支持) |
A 轴 steps/° 计算公式
steps_per_degree = (200 × microstep × gear_ratio) / 360
例:1.8°步进(200步/圈)× 32微步 ÷ 360° = 17.78 steps/°
在控制台设:
$103=17.78
$113=720 (°/min)
$134=360 (最大角度限位)
七、上位机 / 发送器推荐
| 软件 | 四轴支持 | 说明 |
|---|---|---|
| UGS (Universal Gcode Sender) | 可发 A 指令 | 最稳 |
| bCNC | 有 A 轴 DRO | 支持 jog A |
| Candle 1.9+ | 界面友好 | |
| LightBurn | (激光 + 旋转滚筒) | 选 "GRBL-MEGA" 设备 |
| FluidNC | 原生多轴 | ESP32 专属,下一代 |
八、选型决策树
你现在有什么硬件?
│
├─ 只有 Arduino Uno + CNC Shield
│ └─ 原生做不了真四轴 → 要么换 Mega,要么换 STM32
│
├─ 有 Mega2560 + RAMPS
│ └─ 刷 grbl-Mega-5X → 最快出效果
│
├─ 想做自己的 PCB / 控制板
│ └─ grblHAL + STM32F103C8T6(蓝板 ¥5)→ 最专业
│
└─ 追求最简单、WiFi 也想要
└─ FluidNC (ESP32) → 网页控制,免上位机
浙公网安备 33010602011771号