Grbl_ESP32 中的主轴编码与 Grbl (Arduino) 中的主轴编码有很大不同。每种主轴类型都有定义的类。这允许使用简单的方法来创建新的主轴,并为 Grbl 提供一个标准接口。主轴有很多 #define 和 $$ 设置。您使用的主轴可能只使用其中的几个。例如,如果您使用继电器来控制主轴,则 RPM 相关设置将被忽略。有关每种类型的详细信息,请参阅下文
只要在机器定义中定义了所有必需的 I/O,您就可以动态地在主轴类型之间切换。例如:您可以在机器上安装主轴和激光器,并在两者之间切换,而无需重新编译甚至重新启动。
Grbl 中的主轴一词可以表示多种含义。标准 gcode 不支持激光之类的东西,因此 Grbl_ESP32 使用M3(顺时针开启主轴)、M4(逆时针开启主轴)、M5(关闭主轴)和Snnnnn(将 rpm 设置为 nnnnn)来控制许多工具。这些可以是基于开/关继电器的主轴、PWM 速度控制主轴、RC 型无刷速度控制器、RS485 VFD、激光等。我们可以轻松添加其他东西,例如热线和其他东西。
注意:目前,当您在任何地方看到 RPM 时,它指的是 gcode Snnnnn 值。当用于激光器等时,它可能意味着不同的东西。只需将其视为您正在使用的工具的适当单位即可。
主轴在您的机器定义文件中定义。您需要定义的 I/O 引脚取决于您选择的主轴类型。主轴类型由$Spindle/Type选择,您可以使用#define SPINDLE_TYPE SpindleType::XXXXX ` 语句在机器定义文件中设置默认值。如果您未定义任何内容,它将默认为 None 主轴。以下是当前可用的类型。
#define SPINDLE_TYPE SpindleType::NONE
#define SPINDLE_TYPE SpindleType::PWM
#define SPINDLE_TYPE SpindleType::RELAY
#define SPINDLE_TYPE SpindleType::LASER
#define SPINDLE_TYPE SpindleType::DAC
#define SPINDLE_TYPE SpindleType::HUANYANG // RS485
#define SPINDLE_TYPE SpindleType::BESC
#define SPINDLE_TYPE SpindleType::_10V
#define SPINDLE_TYPE SpindleType::H2A // RS485
当 Grbl_ESP32 启动时,它会向 USB/串行端口发送一些消息。它会告诉您哪种主轴类型处于活动状态。如果您的机器定义文件中缺少任何引脚定义,它也会发送有关该内容的错误消息。
以下是每种主轴类型的详细信息。
主轴有许多设置。请参阅下文,了解每种主轴类型使用的设置。您的主轴类型未使用的设置将显示并可更改,但会被忽略。必须关闭主轴 (M5) 才能更改任何主轴设置。更改设置后,它将重新初始化您的主轴。
如果您的机器不需要主轴,例如笔式绘图仪,请选择此类型。#define SPINDLE_TYPE SpindleType::NONE它不会使用任何 I/O。如果未定义 I/O,它将默认为此类型。

许多主轴速度控制电路使用 PWM 信号来设置速度。以下是您在机器定义文件中需要的内容。
- 必需的
#define SPINDLE_TYPE SpindleType::PWM - 必填
#define SPINDLE_OUTPUT_PIN GPIO_NUM_nn,其中 nn 是引脚编号。这是连接到速度控制器上的 PWM 输入的引脚。 #define SPINDLE _ENABLE_PIN GPIO_NUM_nn如果您想要主轴使能信号,则是可选的。#define SPINDLE_DIRECTION_PIN GPIO_NUM_nn如果您需要方向信号,则可选。- $GCode/MaxS最大主轴速度。此值用于将 PWM 占空比与所需的 RPM 相匹配。如果您将其设置为 1000 并发送 S500,它会将占空比设置为 50%。如果您发送 S1500,它会将您的值更改为 1000。
- $GCode/MinS这是最低 RPM。如果您的主轴在 200 RPM 以下无法正常工作,请设置 $31=200。如果您发送低于 200 的 S 值,它会将速度设置为 200。
- $Spindle/PWM/Frequency主轴 PWM 频率。此项设置 PWM 信号的频率。
- $Spindle/PWM/Off主轴 PWM 关闭值。通常设置为 0。PWM 值以占空比的百分比设置。
- $Spindle/PWM/Min主轴 PWM 最小值通常设置为 0。
- $Spindle/PWM/Max主轴 PWM 最大值。通常设置为 100。

如果您使用继电器来打开主轴,则只需要一个开/关信号。意外的 PWM 信号可能会损坏继电器。ESP32 没有足够的电流来直接驱动继电器。您应该为此使用驱动电路。以下是您在机器定义文件中需要的设置。
- 必需的
#define SPINDLE_TYPE SpindleType::RELAY - 必填
#define SPINDLE_OUTPUT_PIN GPIO_NUM_nn,其中 nn 是引脚编号。这是连接到继电器电路的引脚。 #define SPINDLE _ENABLE_PIN GPIO_NUM_nn如果您想要一个启用信号,则是可选的。#define SPINDLE_DIRECTION_PIN GPIO_NUM_nn如果您需要方向信号,则可选。
因为它是一个开/关信号,所以大多数 $$ 主轴设置将被忽略。

激光基本上是一个带有一些额外功能的 PWM 主轴。当机器快速移动或暂停时,您希望它关闭。它还可以执行速度补偿功能。如果您正在雕刻,您希望激光在加速或减速时按比例降低功率。使用 M4 命令(通常用于逆时针旋转)来启用此功能。
- 选修的
#define SPINDLE_TYPE SpindleType::LASER - 必填项
#define LASER_OUTPUT_PIN GPIO_NUM_nn,其中 nn 是引脚编号。 #define LASER_ENABLE_PIN GPIO_NUM_nn如果您想要一个启用信号,则是可选的。- 大多数 PWM 设置也适用
- $GCode/LaserMode设置 $GCode/LaserMode=1 为激光模式
- $Laser/FullPower=nnnn。这将设置用于 PWM 的满功率数。$Laser/FullPower=100 表示您的功率范围是 0-100。

一些主轴速度控制器具有模拟输入。此模式使用 ESP32 上的 DAC(数字到模拟)输出模拟信号。您可能需要通过运算放大器运行输出,以将 ESP32 的 0-3.3V 范围放大到速度控制器所需的 0-5V 或 0-10V 范围。
- 必需的
#define SPINDLE_TYPE SpindleType::DAC - 必填
#define SPINDLE_OUTPUT_PIN GPIO_NUM_nn,其中 nn 是引脚编号。这是连接到继电器电路的引脚。 #define SPINDLE _ENABLE_PIN GPIO_NUM_nn如果您想要一个启用信号,则是可选的。#define SPINDLE_DIRECTION_PIN GPIO_NUM_nn如果您需要方向信号,则可选。- $GCode/MaxS , $GCode/MinS请参阅 PWM 模式
- $Spindle/PWM/Frequency、$Spindle/PWM/Off和$Spindle/PWM/Min、Spindle/PWM/Max不适用。
这是一个典型的运算放大器电路,可以将 3.3v 升压到更高的电压。此电路的增益为 3.2。互联网上有很多运算放大器资源,包括计算器。
注意:DAC 的分辨率只有 8 位。如果您需要更高的分辨率,可以考虑使用_10V主轴

0-10V 是一种常见的工业控制信号,通常由 VFD 和速度控制器使用。它使用 3.3V PWM 信号,因此您需要使用与上述电路类似的电路来提高电压。为了实现完全控制,VFD 通常需要 0-10V 信号以及单独的正向和反向信号。此类型支持这一点。
- 必需的
#define SPINDLE_TYPE SpindleType::_10V - 必填
#define SPINDLE_OUTPUT_PIN GPIO_NUM_nn,其中 nn 是引脚编号。这是连接到速度控制器上的 PWM 输入的引脚。 #define SPINDLE _ENABLE_PIN GPIO_NUM_nn如果您想要主轴使能信号,则是可选的。#define SPINDLE_FORWARD_PIN GPIO_NUM_nn如果您想要前向信号,则可选。#define SPINDLE_REVERSE_PIN GPIO_NUM_nn如果您需要反向方向信号,则可选。

此主轴模式使用 RS485 串行连接与华阳 VFD(一种非常流行的中国 VFD)通信。它可以控制主轴的速度和转动方向。ESP32 可以创建信号,但不能创建 RS485 所需的差分电压。需要使用 3.3V TTL 到 RS485。MAX485CSA 非常适合此用途。类型 **HUANYANG ** 是其原始协议,HY2是华阳的最新协议。
- 必需的
#define SPINDLE_TYPE SpindleType::HUANYANG - 必需,
#define HUANYANG_TXD_PIN GPIO_NUM_nn这是传输数据引脚。 - 可选
#define SPINDLE_RXD_PIN GPIO_NUM_nn这是接收数据引脚。 - 可选
#define HUANYANG_RTS_PIN GPIO_NUM_nn此引脚控制数据是否正在发送或接收。
您还需要确保 VFD 设置正确。按如下方式设置寄存器。
PD004 400 Base frequency as rated on my spindle (default was 50)
PD005 400 Maximum frequency Hz (Typical for spindles)
PD011 120 Min Speed (Recommend Aircooled=120 Water=100)
PD014 10 Acceleration time (Test to optimize)
PD015 10 Deceleration time (Test to optimize)
PD023 1 Reverse run enabled
PD141 220 Spindle max rated voltage
PD142 3.7 Max current Amps (0.8kw=3.7 1.5kw=7.0, 2.2kw=??)
PD143 2 Poles most are 2 (I think this is only used for RPM calc from Hz)
PD144 3000 Max rated motor revolution at 50 Hz => 24000@400Hz = 3000@50HZ
PD001 2 RS485 Control of run commands
PD002 2 RS485 Control of operating frequency
PD163 1 RS485 Address: 1 (Typical. OK to change...see below)
PD164 1 RS485 Baud rate: 9600 (Typical. OK to change...see below)
PD165 3 RS485 Mode: RTU, 8N1
这是 RC 型无刷直流速度控制器。它使用特殊的 PWM 信号来控制电机的速度。电机非常强劲,而且成本低廉。但实际速度可能不太准确。
机器定义示例
#define SPINDLE_TYPE SpindleType::BESC
#define SPINDLE_OUTPUT_PIN GPIO_NUM_26

