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) → 网页控制,免上位机

posted @ 2026-06-05 15:42  w199899899  阅读(27)  评论(0)    收藏  举报