GRBL学习
GRBL的介绍
Grbl是用于CNC铣削的基于并行端口的运动控制的不折不扣,高性能,低成本的替代产品。只要运行Atmega 328,它将在Arduino(Duemillanove / Uno)上运行。
该控制器采用高度优化的C语言编写,利用AVR芯片的所有巧妙功能来实现精确的定时和异步操作。它能够维持高达30kHz的稳定,无抖动的控制脉冲。
它接受符合标准的g代码,并且已通过多种CAM工具的输出进行了测试,没有任何问题。完全支持弧,圆和螺旋运动,以及所有其他主要g代码命令。不支持宏函数,变量和大多数固定循环,但是我们认为GUI可以更好地将它们转换为直接的g代码。
GRBL的GitHub仓库
从文件目录开始
在刚刚从GitHub上下载的grbl后,可以直接用vscode把整个文件夹打开,除去git的一些文件以及readme之外,其实只有3个文件夹:
- build
- doc
- grbl
事实上看上去就知道,build和doc是和源码无关的,他们只会包含一些编译后存储的文件或一些说明文档或是编译时候需要下载某些依赖的脚本。对于Arduino来说,并不是所有的源文件或者依赖文件都会在工程上出现,更多时候,是在选择某些芯片之后,通过提前写好的py脚本,自动链接下载对应的芯片依赖文件,以此来减少整个工程的容量。
进入GRBL
cpu_map
整个仓库的重点在于grbl这个文件夹。
从图中可以看出,grbl的文件夹里面,包含:
- cpu_map
- defaults
- examples
- 相关驱动文件
从cpu_map的文件夹里面可以看到,里面包含两个头文件,即:
也就是前面介绍GRBL的时候所描述的,支持328P和2560两个AVR芯片。这两个也是Arduino开发板的经典了(估计外国人都喜欢Arduino,毕竟容易用)。
想要移植当然先要知道里面有什么,打开之后里面是这样的:
一点点来分析一下:
#define GRBL_PLATFORM "Atmega328p"
这里是用来定义芯片的名字的,这个很好理解。
// Define serial port pins and interrupt vectors.
#define SERIAL_RX USART_RX_vect
#define SERIAL_UDRE USART_UDRE_vect
这个地方,是用来定义串口的引脚以及中断向量的。
// Define step pulse output pins. NOTE: All step bit pins must be on the same port.
#define STEP_DDR DDRD
#define STEP_PORT PORTD
#define X_STEP_BIT 2 // Uno Digital Pin 2
#define Y_STEP_BIT 3 // Uno Digital Pin 3
#define Z_STEP_BIT 4 // Uno Digital Pin 4
#define STEP_MASK ((1<<X_STEP_BIT)|(1<<Y_STEP_BIT)|(1<<Z_STEP_BIT)) // All step bits
// Define step direction output pins. NOTE: All direction pins must be on the same port.
#define DIRECTION_DDR DDRD
#define DIRECTION_PORT PORTD
#define X_DIRECTION_BIT 5 // Uno Digital Pin 5
#define Y_DIRECTION_BIT 6 // Uno Digital Pin 6
#define Z_DIRECTION_BIT 7 // Uno Digital Pin 7
#define DIRECTION_MASK ((1<<X_DIRECTION_BIT)|(1<<Y_DIRECTION_BIT)|(1<<Z_DIRECTION_BIT)) // All direction bits
// Define stepper driver enable/disable output pin.
#define STEPPERS_DISABLE_DDR DDRB
#define STEPPERS_DISABLE_PORT PORTB
#define STEPPERS_DISABLE_BIT 0 // Uno Digital Pin 8
#define STEPPERS_DISABLE_MASK (1<<STEPPERS_DISABLE_BIT)
// Define homing/hard limit switch input pins and limit interrupt vectors.
// NOTE: All limit bit pins must be on the same port, but not on a port with other input pins (CONTROL).
#define LIMIT_DDR DDRB
#define LIMIT_PIN PINB
#define LIMIT_PORT PORTB
#define X_LIMIT_BIT 1 // Uno Digital Pin 9
#define Y_LIMIT_BIT 2 // Uno Digital Pin 10
#ifdef VARIABLE_SPINDLE // Z Limit pin and spindle enabled swapped to access hardware PWM on Pin 11.
#define Z_LIMIT_BIT 4 // Uno Digital Pin 12
#else
#define Z_LIMIT_BIT 3 // Uno Digital Pin 11
#endif
#define LIMIT_MASK ((1<<X_LIMIT_BIT)|(1<<Y_LIMIT_BIT)|(1<<Z_LIMIT_BIT)) // All limit bits
#define LIMIT_INT PCIE0 // Pin change interrupt enable pin
#define LIMIT_INT_vect PCINT0_vect
#define LIMIT_PCMSK PCMSK0 // Pin change interrupt register
这一段是不是很长?但认真看一下,并没有什么,GRBL事实上是通过控制电机去实现打印的,类似与3D打印机的i3的结构。因此需要定义:
- X/Y/Z的方向控制引脚,也就是通过这个引脚来控制电机的运作方向。
- 步进电机使能引脚,也就是通过该引脚来控制步进电机是否可以运动。
- 限位开关检测引脚,也就是电机在运动到0点的时候,触发限位开关后,需要立马停下,否则容易撞坏机器结构。
这样分析下来,就很简单了。
// Define probe switch input pin.
#define PROBE_DDR DDRC
#define PROBE_PIN PINC
#define PROBE_PORT PORTC
#define PROBE_BIT 5 // Uno Analog Pin 5
#define PROBE_MASK (1<<PROBE_BIT)
// Start of PWM & Stepper Enabled Spindle
#ifdef VARIABLE_SPINDLE
// Advanced Configuration Below You should not need to touch these variables
#define PWM_MAX_VALUE 255.0
#define TCCRA_REGISTER TCCR2A
#define TCCRB_REGISTER TCCR2B
#define OCR_REGISTER OCR2A
#define COMB_BIT COM2A1
#define WAVE0_REGISTER WGM20
#define WAVE1_REGISTER WGM21
#define WAVE2_REGISTER WGM22
#define WAVE3_REGISTER WGM23
// NOTE: On the 328p, these must be the same as the SPINDLE_ENABLE settings.
#define SPINDLE_PWM_DDR DDRB
#define SPINDLE_PWM_PORT PORTB
#define SPINDLE_PWM_BIT 3 // Uno Digital Pin 11
对于GRBL而言,使用CNC的话,带有激光头的功能,激光头使用的是PWM的控制方式控制,当然也带有探针。
大体分析这么多,事实上可以去看看2560的头文件,你会发现基本上是一样。因此这两个头文件就直接表明了,要正常使用GRBL的话,MCU需要提供什么功能的引脚。因此我们也可以开始第一步的移植了------引脚分配。
defaults
进入后,看到好几个defaults名字开头的头文件,细心的可以通名字上发现,这应该是根据不同的机型做的适配配置。
可以随便打开一个文件来看看:
没错,文件极其简单,他就是个配置文件!用来配置CNC的相关参数,比如电机的脉冲数等等。具体的配置,后面移植的时候如果遇到,再详细说明。
examples
这个文件夹可以说一点用都没有,里面放的是Arduino的工程文件。因为GRBL是基于Arduino做的,所以编译会使用Arduino去编译。
剩下的移植的时候再一个个分析。
移植准备
对于这个GRBL的移植,本人打算将它移植到两款芯片上:
- STM32F446RC
- i.MX RT1010 EVK (竟然被我申请到了!开心!)
一个是M4的内核一个是M7的内核,由于GRBL的运动带有计算型的补差算法,选择带有浮点运算的芯片感觉就会非常良好。
…开发板设计中…ing!