第一部分:bresenham算法需要的入口条件,包括运动方向,X,Y,Z各需要运动多少步,以及完成这个BLOCK需要运动多少步。
uint8_t direction_bits //
uint32_t steps_x, steps_y, steps_z//
int32_t step_event_count //
Bresenham直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点。这个算法只会用到较为快速的整数加法、减法和位元移位,常用于绘制电脑画面中的直线。是计算机图形学中最先发展出来的算法。
GRBL中,圆弧是用直线段来接近描述的,所以不需要考虑,直接的画法通过下面的判断器,X先走。
把纵轴的一个方格的一半作为基准,如果在基准点以上,则Y轴走一步,如果在下面,则X继续走一步。而step_event_count为最终走的总步数,为X+Y总步数。
第二部分:
调度器用于计算加速度的内容,也就是说,BRESENHEM用到的是梯形加速度,我们需要计算梯形的各个表征值。
float nominal_speed 庆樱雹 // 匀速誉帆运动速度
float entry_speed // 从一个BLOCK进入到这个BLOCK的速度
float max_entry_speed // 最大的进入速度
float millimeters // BLOCK运动的实际mm距离
uint8_t recalculate_flag // 重新计算梯度的FLAG
uint8_t nominal_length_flag // 是否进入了匀速的FLAG
第三部分:
实际梯形的各个参数计算
uint32_t initial_rate // 梯形运动初始值
uint32_t final_rate // 梯形运动结束
int32_t rate_delta //计算加速度
uint32_t accelerate_until // 加速度阶段运动的距离
uint32_t decelerate_after // 减速度阶段运行的距离
uint32_t nominal_rate // 匀速阶段运行的距离
} block_t
实际上,BLOCK的执行需要一定的时间,所以没有执行完成的BLOCK需要列队进行等待,所以需要用到调度器。
目前,3D打印机做开源的主要用到了Marlin固件,其实核心算法就是GRBL,加入了两轴材料挤出的步进电机轴,另外还用到了一个开源的温控PID算法,这个我们暂时用不上,不再考虑。
在找Marlin固件时发现了一个好的芯片,TC2100这颗IC卖出的价格在20元以上,而市面上用的1.5A电流的芯片大部分只卖到了4元左右,这颗IC的核心优势就是细分数,看了一下资料,也用到了他们的专利算法:一种新型的PWM算法,淘宝上卖出的模块价格在37元左右,其实还有不少的利润空间,可惜拿货估计有点麻颂锋烦,订单小了估计都不好拿货。
另外需要注意的是,初始化的参数是存放在EEPROM中的,GRBL也有一个EEPROM的函数,但是实际上我们定义了我们新的EEPROM函数,用到的是W24512,至于这一块如何移植,后文再介绍。
在系统进行初始化时,我们需要初始化GRBL的配置参数,函数的本体如下:
void settings_init() {
read_global_settings,
如果返回有错,进行处理:DEBUG输出,设置为默认初始化值,再一次DEBUG输出。
设置为默认值时,我们用到了write_global_settings,主要调用了
eeprom_put_char和memcpy_to_eeprom_with_checksum
这里EEPROM定义在EEPROMCNC.H中,此文件为GRBL定义的,我们进行移植的时候,直接从这里转移到我们实际使用的EEPROM中即可,我们的EEPROM定义在I2CEEPROM中。
在0地址写入参数为SETTINGS_VERSION
在接下来的地址中,写入的参数为settings的结构体,settings结构体为每个系统特殊的应用来决定,默认的值保存在defaults_h中,我们在第一篇解读中毁棚桐有详细介绍。
官网的配置参数介绍:
https://github.com/grbl/grbl/wiki/Configuring-Grbl-v0.8#grbls-xval-settings-and-what-they-mean
我的解读笔记: https://www.jianshu.com/p/73193ddec6e2
这个是系统和单片机中算法的桥梁,一定要注意配置好。
全局配置读取以后,如和袭果版本号是我们设置的版本,#define SETTINGS_VERSION 5
则从EEPROM中读取memcpy_from_eeprom_with_checksum结构体settings
然后纤坦开始读主轴的数据,并存放在coord_data中。
关于EEPROM的移植:
GRBL调用的函数名称为eeprom_get_char,如果用到我们定义的新文件,先把新文件的头文件包括进来#include "I2CEEPROM.h"
在eeprom_get_char的函数本体中,只用一条return TWI_ReadByte( addr)进行跳转。
而memcpy_to_eeprom_with_checksum函数则调用eeprom_get_char,所以不需要修改。
我们用的芯片是24C128,在I2CEEPROM.H中,有如此的宏定义:
#define ADDR_24CXX 0xA0
#define SCLH GPIOB->BSRR = GPIO_Pin_6
#define SCLL GPIOB->BRR = GPIO_Pin_6
#define SDAH GPIOB->BSRR = GPIO_Pin_7
#define SDAL GPIOB->BRR = GPIO_Pin_7
#define SCLread GPIOB->IDR &GPIO_Pin_6
#define SDAread GPIOB->IDR &GPIO_Pin_7
#define W_ENANLE GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)0x00)
#define W_DISANLE GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)0x01)
UG后处理出来的NC程序饥雹厅就是通过UG的后处理器产生出来的,UG的后处理器主要由三个文件组成,.pui,.def,.tcl,UG后处理程序时最直接用到的是.def和.tcl这两个文肆斗件,这些文件可以使用拷贝复制的方法烂隐获得,也可以从无到有利用UG软件自带的后处理构造器生成制作出来欢迎分享,转载请注明来源:内存溢出
评论列表(0条)