GRBL学习(一)

GRBL学习

GRBL的介绍

Grbl是用于CNC铣削的基于并行端口的运动控制的不折不扣,高性能,低成本的替代产品。只要运行Atmega 328,它将在Arduino(Duemillanove / Uno)上运行。

该控制器采用高度优化的C语言编写,利用AVR芯片的所有巧妙功能来实现精确的定时和异步操作。它能够维持高达30kHz的稳定,无抖动的控制脉冲。

它接受符合标准的g代码,并且已通过多种CAM工具的输出进行了测试,没有任何问题。完全支持弧,圆和螺旋运动,以及所有其他主要g代码命令。不支持宏函数,变量和大多数固定循环,但是我们认为GUI可以更好地将它们转换为直接的g代码。

GRBL的GitHub仓库

https://github.com/grbl/grbl

从文件目录开始

在刚刚从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!

ain()主函数首先执行下面初始化函数 serial_init(); // Setup serial baud rate and interrupts settings_init(); // Load Grbl settings from EEPROM stepper_init(); // 配置步进方向和中断定时器 system_init(); // 配置引脚分配别针和pin-change中断 memset(&sys, 0, sizeof(system_t)); // Clear all system variables sys.abort = true; // Set abort to complete initialization 完成初始化设置中止 sei(); // Enable interrupts #ifdef HOMING_INIT_LOCK //宏运算(settings.flags & (1 << 4)) != 0结果flags等于执行sys.state = STATE_ALARM //系统状态赋值为报警状态 if (bit_istrue(settings.flags,BITFLAG_HOMING_ENABLE)) { sys.state = STATE_ALARM; } #endif _____________________________________________________________________________________________________________________________________ 接下来是些主要初始化循环 for(;;) { serial_reset_read_buffer(); // Clear serial read buffer gc_init(); // Set g-code parser to default state spindle_init(); //主轴 coolant_init(); //冷却液 limits_init(); //极限开关 probe_init(); //探测 plan_reset(); // Clear block buffer and planner variables 清晰块缓冲区和规划师变量 st_reset(); // Clear stepper subsystem variables. 清晰的步进系统变量。 // Sync cleared gcode and planner positions to current system position. 同步清除gcode和策划师职位当前系统位置。 plan_sync_position(); gc_sync_position(); // Reset system variables. sys.abort = false; //系统中止标志 sys_rt_exec_state = 0; //系统执行标志状态变量状态位清零。 sys_rt_exec_alarm = 0; //系统执行警报标志变量清零。 sys.suspend = false; //系统暂停标志位,取消,和安全的门。 sys.soft_limit = false; //系统限制标志状态机复位。(布尔) protocol_main_loop(); //主协议循环 } // ___________________________________________________________________________
NGINX因其高性能和模块化设计而成为API网关和反向代理服务器的理想选择,尤其适用于负载均衡。要在Windows平台上实现这配置,首先需要确保安装了最新版本的NGINX,并正确编译安装。 参考资源链接:[NGINX Plus:高性能API Gateway与开发指南](https://wenku.csdn.net/doc/6pcr8f6694?spm=1055.2569.3001.10343) 首先,下载NGINX源码,并解压到指定目录。打开命令行工具,进入解压后的目录。使用`./configure`命令进行编译设置,例如指定安装路径、配置文件路径、启用车载SSL模块以及指定PCRE和Zlib库的位置: ```bash ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-pcre=../pcre-8.44 --with-zlib=../zlib-1.2.11 ``` 编译并安装NGINX: ```bash make make install ``` 安装完成后,通过编辑`nginx.conf`配置文件来启用反向代理和负载均衡功能。你可以参考NGINX的官方文档和《NGINX Plus:高性能API Gateway与开发指南》书中的最佳实践案例来配置`http`、`server`和`upstream`块: ```nginx http { upstream backend { server backend1.example.com weight=5; server backend2.example.com; server backend3.example.com backup; } server { listen 80; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } } ``` 在这个配置中,`upstream`块定义了个名为`backend`的服务器组,包含了三个后端服务器。通过`weight`、`backup`等指令可以实现负载均衡的策略。`server`块监听80端口,并将请求反向代理到`backend`组。 完成配置后,可以通过以下命令检查配置文件的语法是否正确: ```bash nginx -t ``` 如果语法检查通过,使用以下命令启动NGINX: ```bash startnginx ``` 当需要对NGINX进行热重启,即重新加载配置文件时,可以使用: ```bash nginx -s reload ``` 通过上述步骤,你可以在Windows平台上成功配置NGINX作为API网关,并启用反向代理和负载均衡功能。为了进步深入理解和使用NGINX的各项功能,强烈建议阅读《NGINX Plus:高性能API Gateway与开发指南》,这本书将为你提供更全面的实战指导和高级配置技巧。 参考资源链接:[NGINX Plus:高性能API Gateway与开发指南](https://wenku.csdn.net/doc/6pcr8f6694?spm=1055.2569.3001.10343)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值