这篇文章我们移植grbl的参数设置与EEPROM,实现$开头的命令的交互。 grbl的参数设置是再settings.c和eeprom.c中实现的,settings.c收集并处理相应的参数,然后通过调用eeprom.c实现参数的持久化。atmega328p有1KB的EEPROM,但stc8h8k64u的EEPROM是通过内部的flash模拟的,因此体现在代码
首先对接收的字符串进行预处理,把小写字母转成大写字母,去掉空白与注释,方便后续处理,如果超过了一行G代码上限就报错,这部分很简单,直接从grbl源码搬运过来就行。 uint8_t c;// 用于接收队列数据uint8_t char_counter=0;// 用于记录字符个数uint8_t line_flags=0;// 初始化行标志位uint8_t char_counter=...
前面我们分享了Grbl的真正入口和Grbl为什么没有使用Arduino框架,接着我们看下Grbl在没有使用Arduino框架的情况下是如何自成一体设计自己的整体架构的。 GRBL的核心是带有梯形加减速过程的直线插补算法的实现。通过调用链分析,得到Grbl的架构和模块调用关系如下: grbl架构图 串口通信: serial.c:低阶串口通信并为异步控制...
实现代码如下: Grbl串口环形队列实现 在主循环中读取接收环形队列数据和发送数据到发送环形队列: grbl环形队列使用 具体使用流程如下: 串口接收数据完成,写入到接收环形队列serial_rx_buffer 在主循环中从serial_rx_buffer中读取数据解析之后做下一步处理 发送执行结果到发送环形队列serial_tx_buffer 从serial_tx_buffer...
grbl库导入智能推荐zuul源码解析 zuul——springcloud的网关。如果看过我之前的博客,可以知道feign的坑是比较多的,但是网关这块做的是比较好的,不管是性能还是灵活性。 一、网关的作用: ①路由 ②利用filter可以实现限流(也可以使用ratelimit),鉴权,验签,黑白名单,对请求...LinkedHashMap源码解析 LinkedHashMap...
上篇文章介绍了Grbl移植所使用的软硬件环境的搭建,接下来我们开始编写第一个程序。 打开keil c51,菜单project-》new project 在device 选项卡中选择STC MCU database,在列表中选择stc8h8k64u 在target选项卡中设置晶振频率为24Mhz,内存模型选择large以方便使用xdata ...
Grbl提供了动态配置从而不需要重新编译代码而是通过修改参数适用更多的机器。这些参数是存放再Arduino的EEPROM中的,实现代码是在settings.c、eeprom.c和defaults.h中。eeprom.c为直接操作EEPROM提供按字节写入的低级接口并提供了校验和;settings.c实现了语义化操作EEPROM的高级接口;defaults.h提供了EEPROM的默认值,也可用于...
$S // 使Grbl进入休眠状态 $I // 打印或设置构建信息 $R // 恢复Grbl默认设置 $N // 打印或设置启动脚本 这部分代码不算复杂,不过多解释。 除了解析系统命令system.c还实现了一些控制功能,比如:安全门,重置,暂停,恢复等功能,它是通过引脚中断来实现的,这块比较独立,我们下一篇单独分享引脚映射与中断处理。
主循环这块算是Grbl中最复杂的内容了,里面掺杂了很多模块调用,我们抽丝剥茧,顺着脉络一点点进行。先主要分析main.c和protocol.c 首先在主入口中我们了解过,Arduino中把main拆分成了setup和loop,setup一般用于只需要运行一次的配置功能,loop用于需要反复执行的功能。Grbl的main函数也做了类似的事情。
上篇文章我们分析了Grbl通过定时器1和定时器0中断实现可变频率的PWM输出来控制步进电机的运转。我们趁热打铁顺便分析通过定时器2中断输出PWM来控制主轴的转速。 跟主轴相关的概念有:开启关闭主轴,主轴转速,主轴转动方向。 涉及到的接口有: #define SPINDLE_ENABLE_DDR DDRB// 定义主轴使能地址#define SPINDLE_ENABLE_...