运动控制器2:GRBL的核心结构体block_t和BRESENHAM算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运动控制器2:GRBL的核心结构体block_t和BRESENHAM算法相关的知识,希望对你有一定的参考价值。

参考技术A typedef struct

  第一部分: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,至于这一块如何移植,后文再介绍。

C++中类和结构体的区别

结构体和类的唯一区别就是: 结构体和类具有不同的默认访问控制属性

即:类中,对于未指定访问控制属性的成员,其访问控制属性为私有类型(private)

结构体中,对于未指定任何访问控制属性的成员,其访问控制属性为公有类型(public)
  
【注】C中的结构体完全不同于C++中的结构体:在C中的结构体只能自定义数据类型,结构体中不允许有函

数,而C++中的结构体可以加入成员函数、访问控制权限、继承、包含多态等面向对象特性。

解释:
C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象

的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。在C++中,不使用结构体丝毫不会影响

程序的表达能力。C++之所以要引入结构体,是为了保持和C程序的兼容性。但有时仍会在C++中使用结构

体,是因为,可以使用结构体将不同类型数据组成整体,方便于保存数据。

C++在struct之外引入了class关键字(类),但为了保持与C程序的兼容,C++保留了struct关键字,并规定结

构体默认访问控制权限为公有类型。
————————————————
版权声明:本文为CSDN博主「Faith_xzc」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44480968/article/details/104464321

以上是关于运动控制器2:GRBL的核心结构体block_t和BRESENHAM算法的主要内容,如果未能解决你的问题,请参考以下文章

为啥装备体的机械爪点连接点可以移动而点那个杆它不能移动

Go基础结构体和流程控制语句

Go基础结构体和流程控制语句

USB设备---URB请求快

GRBL_ESP32写字机

流程控制