老熟妇,老熟女chese老熟女,亚洲AV中文无码字幕色三,超碰欧美

Delta3D打印機(jī)代碼解讀及調(diào)機(jī)心得(二) 

2016-02-21 09:51
Delta (rostock型)3d打印機(jī)算法解讀及調(diào)試步驟
Delta3D打印機(jī)代碼.webp

三、Marlin程序解讀
這里鴨哥不打算講marlin的整個(gè)loop()函數(shù)的流程,講講delta機(jī)型的核心部分。對(duì)于marlin來說,delta機(jī)型和非delta機(jī)型在對(duì)于溫控、看門狗、電機(jī)運(yùn)動(dòng)甚至空間坐標(biāo)等方面都是一樣的。區(qū)別在哪里呢?區(qū)別就在與delta多了一個(gè)笛卡爾坐標(biāo)轉(zhuǎn)換的函數(shù)
Marlin的loop()主體流程
Void loop ()
{
Get_command() ;  //從sd卡或者串口獲取gcode
Process_command(); //解析gcode并且執(zhí)行代碼
Manage_heater();//控制機(jī)器的噴頭和熱床的溫度
Manage_inactivity();//
checkHitEndstops();//檢查endstop的狀態(tài)
Lcd_update(); //更新lcd 上面的信息
}

在這個(gè)過程中 process_command()是控制的核心,各位仔細(xì)研讀一下process_command()的代碼就發(fā)現(xiàn)arduino的厲害了。簡單說一下process_command()的流程,說白了,process_command()就是一個(gè)巨大的case 結(jié)構(gòu),這里講講G1命令的大致邏輯(G1命令不知道的自己搜索去):
Process_command()
{
Case 0: //g0->g1
Case 1 :
      {
     if(Stopped == false) {
        get_coordinates(); // 獲取當(dāng)前的坐標(biāo),這里是指打印件的世界坐標(biāo)哦,不是delta的xyz電機(jī)的坐標(biāo)哦!普通結(jié)構(gòu)的打印機(jī)則是一樣的。
          #ifdef FWRETRACT
            if(autoretract_enabled)
            if( !(code_seen('X') || code_seen('Y') || code_seen('Z')) && code_seen('E')) { //獲取 命令中 xyze軸的參數(shù)
            Float echange=destination[E_AXIS]-current_position[E_AXIS]; //這里是算最小回抽值的,如果移動(dòng)距離小于最小回抽值就不回抽了。這里是一個(gè)輔助功能。簡單了解可以了。
              if((echange<-MIN_RETRACT && !retracted) || (echange>MIN_RETRACT && retracted)) { //move appears to be an attempt to retract or recover
                  current_position[E_AXIS] = destination[E_AXIS]; //hide the slicer-generated retract/recover from calculations
                  plan_set_e_position(current_position[E_AXIS]); //AND from the planner
                  retract(!retracted);
                  return;
              }
            }
          #endif //FWRETRACT
        prepare_move(); //執(zhí)行移動(dòng)命令

        return;
       }
}
從上面的代碼來看呢,對(duì)于運(yùn)動(dòng)類的Gcode,marlin會(huì)在process_command()函數(shù)中獲取xyze各軸的參數(shù)后算出目標(biāo)坐標(biāo)(destination[_AXIS]),也會(huì)使用get_coordinates()來獲取當(dāng)前坐標(biāo)(current_position[E_AXIS])(再次強(qiáng)調(diào),這個(gè)坐標(biāo)是打印件的世界坐標(biāo)),當(dāng)我們知道了目標(biāo)坐標(biāo)和當(dāng)前坐標(biāo)以后,空間中移動(dòng)的距離就可以算出來了(不會(huì)算的,請(qǐng)自覺請(qǐng)高中數(shù)學(xué)老師吃飯去),接下來marlin就使用perpare_move()來控制電機(jī)啦。
接下來呢很自然就要講講prepare_move()這個(gè)函數(shù)啦。先上代碼先,代碼鴨哥做了精簡,只看關(guān)鍵的部分就是delta和普通結(jié)構(gòu)的代碼,先說一下plan_buffer_line()這個(gè)函數(shù)的作用的把坐標(biāo)數(shù)組current_position 、 destination 放到一個(gè)內(nèi)存的一個(gè)緩存區(qū)里面,然后控制電機(jī)轉(zhuǎn)多少圈這樣一個(gè)作用的,具體代碼可以自己去看,在一旦進(jìn)入這個(gè)函數(shù)以后,delta和普通機(jī)型的代碼都是一樣的,也就是說delta和普通結(jié)構(gòu)的電機(jī)控制其實(shí)是一樣的。
Difference數(shù)組 :用來儲(chǔ)存目標(biāo)坐標(biāo)和當(dāng)前坐標(biāo)之間的距離的,(這里是包含了xyze軸的數(shù)組)
Destination數(shù)組:目標(biāo)坐標(biāo)的數(shù)值,是從process_command()函數(shù)中G1讀取XYZE參數(shù)獲取的。
Current_position數(shù)組:當(dāng)前坐標(biāo)的數(shù)值,是從G1 命令中g(shù)et_coordinates()傳遞過來的。如果是3個(gè)軸都?xì)w零的情況下,current_position就是儲(chǔ)存三個(gè)坐標(biāo)原點(diǎn),如果開始運(yùn)動(dòng)了,這里的值就是上一個(gè)prepare_move()循環(huán)執(zhí)行后上一次的destination的值。(這個(gè)下面會(huì)有看到賦值語句)
Delta數(shù)組:delta打印機(jī)的xyz三個(gè)電機(jī)要移動(dòng)的距離
void prepare_move()
{

#ifdef DELTA // 設(shè)置機(jī)子是delta機(jī)型(rostock)
  float difference[NUM_AXIS]; //定義目標(biāo)距離,用于轉(zhuǎn)換坐標(biāo)用的過渡變量
  for (int8_t i=0; i < NUM_AXIS; i++) {
    difference = destination - current_position;
  } //計(jì)算世界坐標(biāo)的距離值
//***開始計(jì)算笛卡爾距離 并且暴力直線插值來減少運(yùn)算量***//
  float cartesian_mm = sqrt(sq(difference[X_AXIS]) +
                            sq(difference[Y_AXIS]) +
                            sq(difference[Z_AXIS]));
  if (cartesian_mm < 0.000001) { cartesian_mm = abs(difference[E_AXIS]); }
  if (cartesian_mm < 0.000001) { return; }
  float seconds = 6000 * cartesian_mm / feedrate / feedmultiply;
  int steps = max(1, int(delta_segments_per_second * seconds));
  for (int s = 1; s <= steps; s++) {
    float fraction = float(s) / float(steps);//直線插值
    for(int8_t i=0; i < NUM_AXIS; i++) {
      destination = current_position + difference * fraction;
    }
//***結(jié)束計(jì)算笛卡爾距離 并且暴力直線插值來減少運(yùn)算量***//
    calculate_delta(destination);//將打印件的世界坐標(biāo)轉(zhuǎn)換為xyz電機(jī)軸的運(yùn)動(dòng)量
    plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS],
                     destination[E_AXIS], feedrate*feedmultiply/60/100.0,
                     active_extruder);
  }
#endif // DELTA
。。。。。。。。。。。。
#if ! (defined DELTA || defined SCARA)
  // Do not use feedmultiply for E or Z only moves
  if( (current_position[X_AXIS] == destination [X_AXIS]) && (current_position[Y_AXIS] == destination [Y_AXIS])) {
      plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); //直接將destination的值發(fā)送去運(yùn)動(dòng)緩存里面
  }
  else {
    plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate*feedmultiply/60/100.0, active_extruder);
  }
#endif // !(DELTA || SCARA)
  for(int8_t i=0; i < NUM_AXIS; i++) {
    current_position = destination; //更新當(dāng)前坐標(biāo)的值為剛執(zhí)行的目標(biāo)坐標(biāo)值
  }
}

Delta3D打印機(jī)代碼解讀及調(diào)機(jī)心得(一)

Delta3D打印機(jī)代碼解讀及調(diào)機(jī)心得(三)

Delta3D打印機(jī)代碼解讀及調(diào)機(jī)心得(四)
聲明:3D打印資源庫(3dzyk)內(nèi)網(wǎng)友所發(fā)表的所有內(nèi)容及言論僅代表其本人,并不代表3D打印資源庫(3dzyk)觀點(diǎn)和立場;如對(duì)文章有異議或投訴,請(qǐng)联系kefu@3dzyk.cn。
一只,懶貓...

作者其他文章

Delta3D打印機(jī)代碼解讀及調(diào)機(jī)心得(二) 
快速回復(fù) 返回頂部 返回列表
蜜桃久久| 成人免费视频在线观看无码| 亚洲性一区二区三区四区| 亚洲啊v| 久久偷拍免费2017| 少妇性xxxxxxxxx色武功| 国产成人高清性爱片播放| 中文熟妇人妻又伦精品视频| 国产乱子伦无套一区二区三区| 成人网午夜成人品网| 国产精品1800| 国产六月婷婷爱在线观看| 国产精品大屁股av在线播放| 91HD.com| 午夜福利100| 亚洲综合久久婷婷五月| 久久这里精品| 综合开心网色播| 久草影院| 中文字幕人妻无码系列第三区| 3区日韩| 九九综合在线| 无码在线不卡| 亚洲a∨无码无在线观看| 久久黑| 官场人妻精品12部| 久久道| 手机在线视频你懂的| 日韩色一区| 激情亚洲色图| 阿克苏市| 白嫩少妇bbwbbw撒尿| 午夜人妻在线| 欧美中文日韩中文| 3p 亚洲一区肛交| 久久夜色精品国产亚洲av| 欧美少妇xxx| 国产精品传媒无码大片在线播放| 蜜桃久久网站| xxx18| 啪啪中文字幕|