国产猛男猛女超爽免费视频,国产精品一区二区不卡小说,免费调教小骚货视频,欧美日韩亚洲免费一区

Delta3D打印機代碼解讀及調機心得(二) 

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

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

在這個過程中 process_command()是控制的核心,各位仔細研讀一下process_command()的代碼就發(fā)現(xiàn)arduino的厲害了。簡單說一下process_command()的流程,說白了,process_command()就是一個巨大的case 結構,這里講講G1命令的大致邏輯(G1命令不知道的自己搜索去):
Process_command()
{
Case 0: //g0->g1
Case 1 :
      {
     if(Stopped == false) {
        get_coordinates(); // 獲取當前的坐標,這里是指打印件的世界坐標哦,不是delta的xyz電機的坐標哦!普通結構的打印機則是一樣的。
          #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]; //這里是算最小回抽值的,如果移動距離小于最小回抽值就不回抽了。這里是一個輔助功能。簡單了解可以了。
              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í)行移動命令

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

#ifdef DELTA // 設置機子是delta機型(rostock)
  float difference[NUM_AXIS]; //定義目標距離,用于轉換坐標用的過渡變量
  for (int8_t i=0; i < NUM_AXIS; i++) {
    difference = destination - current_position;
  } //計算世界坐標的距離值
//***開始計算笛卡爾距離 并且暴力直線插值來減少運算量***//
  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;
    }
//***結束計算笛卡爾距離 并且暴力直線插值來減少運算量***//
    calculate_delta(destination);//將打印件的世界坐標轉換為xyz電機軸的運動量
    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ā)送去運動緩存里面
  }
  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; //更新當前坐標的值為剛執(zhí)行的目標坐標值
  }
}

Delta3D打印機代碼解讀及調機心得(一)

Delta3D打印機代碼解讀及調機心得(三)

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

作者其他文章

Delta3D打印機代碼解讀及調機心得(二) 
快速回復 返回頂部 返回列表
可以免费看污污视频的网站-日韩欧美不卡视频在线观看| 免费午夜福利视频在线观看-亚洲成人日韩欧美伊人一区| 日本韩国亚洲欧美三级-日本东京不卡网一区二区三区| 日本韩国亚洲欧美三级-日本东京不卡网一区二区三区| 国产精品熟女视频一区二区-国产日韩精品欧美一区喷水| 色婷婷六月婷婷一区二区-91草草国产欧美在线观看| 亚洲一区二区三在线观看-国产精品亚洲а∨天堂123| 久久网站中文字幕精品-三级精品久久中文字幕| 日韩精品亚洲不卡一区二区-成人网在线视频精品一区二区三区| 中文字幕人妻少妇第一页-隔壁的女孩在线看中文字幕| 在线成色中文综合网站-国产二区精品视频在线观看| 青青草原免费国产在线视频-精品人妻乱码一区二区三区四区| 亚洲一区二区免费av-中文字幕人妻久久久一区二区三区| 在线免费观看黄片喷水-国产精品白丝网站在线观看| 日本中文字幕永久在线人妻蜜臀-欧美一区二区的网站在线观看| 国产精品熟女视频一区二区-国产日韩精品欧美一区喷水| 夜夜久久国产精品亚州av-欧美大屁股一区二区三区| 日韩精品一区二区三区粉嫩av-欧美亚洲国产中文字幕| 欧美日韩精品人妻在线-在线播放中文字幕一区| 一区二区三区日本韩国欧美-日本1区2区3区4区在线观看| 白嫩美女娇喘呻吟高潮-久久一区二区三区日产精品| 成人av一区二区蜜桃-亚洲色图激情人妻欧美| 亚洲欧美一区二区中文-台湾中文综合网妹子网| av中文字幕男人天堂-懂色av一区二区三区在线观看| 色综合色综合久久综合频道-埃及艳后黄版在线观看| 国产午夜精品理论片A级漫画-久久精品国产99亚洲精品| 精品老熟妇一区二区三区-日韩丰满一区二区三区| 麻豆久久国产精品亚洲-日本理论中文字幕在线视频| 国产精品久久久精品一区-99久久免费精品国产男女性高好| 亚洲国产日韩精品四区-dy888午夜福利精品国产97| 91精品国产无线乱码在线-999精品视频免费看| 欧美日韩成人在线观看-久久五月婷婷免费视频| 性都花花世界亚洲综合-日韩av一区二区三区| 日韩欧美国产综合久久-国产精品一起草在线观看| 夜夜久久国产精品亚州av-欧美大屁股一区二区三区| 日韩二级视频在线观看-美女扒开奶罩露出奶子的视频网站| 午夜福利院免费在线观看-久久精品日产第一区二区三区画质| 国产人妻人伦精品日本-国产98超碰人人做人人爱| 蜜臀一区二区三区精品在线-99久久久精品免费看国产| 人妻丝袜中文字幕在线视频-亚洲成av人片一区二区三区| 黄色美女网站大全中文字幕-欧美韩国日本一区二区|