固件教程

Delta3D打印机代码解读及调机心得(三)

字号+ 作者:王 来源:未知 2016-04-07 19:57 我要评论( )

导读:好,看了一大段代码后小结一下。对于普通结构来说,G1 每次将新读取gcode代码参数传递给prepare_move()函数中destination数组以后,prepare_move()就会将其传递到pla

导读:好,看了一大段代码后小结一下。对于普通结构来说,G1 每次将新读取gcode代码参数传递给prepare_move()函数中destination数组以后,prepare_move()就会将其传递到plan_buffer_line()进行电机的运动。而delta结构呢,就相对复杂一点,G1命令读取了gcode代码参数后也是传递到prepare_move()函数中destination,然后marlin要计算目标坐标与当前坐标的笛卡尔距离,然后通过固定时间间隔的方式来将笛卡尔距离分成若干个小直线,通过这样的方式来就减少cpu的浮点预算量,然后再通过calculate_delta函数来将简化后的destination换算成三个电机的运动坐标,并传递到delta中,接下来就是plan_buffer_line()了。
最后!到了最后了!来看看calculate_delta()函数,这个函数的主要用途是将打印件的世界坐标转换为三个垂直的电机轴的运动坐标哦。注意:新的marlin支持SCARA结构的delta,那里也有个calculate_delta()的函数,不过那个跟rostock有点差异。所以我们还是看rostock的吧。
void calculate_delta(float cartesian[3])
{
  delta[X_AXIS] = sqrt(delta_diagonal_rod_2
                       - sq(delta_tower1_x-cartesian[X_AXIS])
                       - sq(delta_tower1_y-cartesian[Y_AXIS])
                       ) + cartesian[Z_AXIS];
  delta[Y_AXIS] = sqrt(delta_diagonal_rod_2
                       - sq(delta_tower2_x-cartesian[X_AXIS])
                       - sq(delta_tower2_y-cartesian[Y_AXIS])
                       ) + cartesian[Z_AXIS];
  delta[Z_AXIS] = sqrt(delta_diagonal_rod_2
                       - sq(delta_tower3_x-cartesian[X_AXIS])
                       - sq(delta_tower3_y-cartesian[Y_AXIS])
                       ) + cartesian[Z_AXIS];
  /*
  SERIAL_ECHOPGM("cartesian x="); SERIAL_ECHO(cartesian[X_AXIS]);
  SERIAL_ECHOPGM(" y="); SERIAL_ECHO(cartesian[Y_AXIS]);
  SERIAL_ECHOPGM(" z="); SERIAL_ECHOLN(cartesian[Z_AXIS]);
 
  SERIAL_ECHOPGM("delta x="); SERIAL_ECHO(delta[X_AXIS]);
  SERIAL_ECHOPGM(" y="); SERIAL_ECHO(delta[Y_AXIS]);
  SERIAL_ECHOPGM(" z="); SERIAL_ECHOLN(delta[Z_AXIS]);
  */
}
 
代码很简单delta是指电机轴的运动坐标,cartesian是指打印件的世界坐标,从上面的程序来看就是从prepare_move()中经过插值简化的destination。大伙随便看一个轴的换算
  delta[X_AXIS] = sqrt(delta_diagonal_rod_2
                       - sq(delta_tower1_x-cartesian[X_AXIS])
                       - sq(delta_tower1_y-cartesian[Y_AXIS])
                       ) + cartesian[Z_AXIS];
delta_diagonal_rod_2 是推杆长的平方
delta_tower1_x 是左前柱的x坐标值,是由radius这个参数算出来的
delta_tower1_y 是左前柱的y坐标值,是由radius这个参数算出来的
具体怎么算就看下面这个函数
void recalc_delta_settings(float radius, float diagonal_rod)
{
delta_tower1_x= -SIN_60*radius; // front left tower
delta_tower1_y= -COS_60*radius;           
delta_tower2_x=  SIN_60*radius; // front right tower
delta_tower2_y= -COS_60*radius;           
delta_tower3_x= 0.0;                  // back middle tower
delta_tower3_y= radius;
delta_diagonal_rod_2= sq(diagonal_rod);
}
 
好了回顾一下marlin的delta机型参数是需要什么?
推杆的长度、电机轴上滑块的宽度、喷头支架的宽度,还有三个电机的圆半径。对不对?忘了?!不要紧,给你看看代码
//=================================================================
//========================Delta Settings =============================
//=================================================================
// Enable DELTA kinematics and most of the default configuration for Deltas
#define DELTA
 
// Make delta curves from many straight lines (linear interpolation).
// This is a trade-off between visible corners (not enough segments)
// and processor overload (too many expensive sqrt calls).
#define DELTA_SEGMENTS_PER_SECOND 200
 
// NOTE NB all values for DELTA_* values MUST be floating point, so always have a decimal point in them
 
// Center-to-center distance of the holes in the diagonal push rods.
#define DELTA_DIAGONAL_ROD 250.0 // mm  //杆长
 
// Horizontal offset from middle of printer to smooth rod center.
#define DELTA_SMOOTH_ROD_OFFSET 175.0 // mm  //电机轴的圆半径
 
// Horizontal offset of the universal joints on the end effector.
#define DELTA_EFFECTOR_OFFSET 33.0 // mm  // 装喷嘴的平台的中心到杆连接处的距离
 
// Horizontal offset of the universal joints on the carriages.
#define DELTA_CARRIAGE_OFFSET 18.0 // mm  //电机轴滑块的距离
 
// Effective horizontal distance bridged by diagonal push rods.
#define DELTA_RADIUS (DELTA_SMOOTH_ROD_OFFSET-DELTA_EFFECTOR_OFFSET-DELTA_CARRIAGE_OFFSET)
通过上述的参数可以算出一个DELTA_RADIUS ,这个delta_radius就是上面“delta_tower1_x 是左前柱的x坐标值,是由radius这个参数算出来的 ”里面的radius了。
至此所有有关与delta的运动的代码已经通读了一遍。下面就开始分析分析代码和运动的关系了。
 

转载请注明出处。

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 3D打印Gcode代码详解

    3D打印Gcode代码详解

    2016-05-05 22:22

  • XYZ型打印机自动调平功能全解析——硬件准备及配置

    XYZ型打印机自动调平功能全解析——硬件准备及配置

    2016-05-04 21:11

  • Delta型打印机自动调平功能全解析

    Delta型打印机自动调平功能全解析

    2016-05-04 21:19

  • 主流的3D打印机固件介绍

    主流的3D打印机固件介绍

    2016-05-04 17:56

网友点评