feedrateOverride()
描述
覆寫並重新計算 buffer 中未執行區塊之進給速率。
語法
machine.feedrateOverride(ratio);
參數
machine
:為 Machine
物件。
ratio
:進給速率覆寫比例,該比例應大於 0。
回傳
無回傳值。
範例
machine 進行 G-code 運動時,根據 Encoder 動態調整 feedrate。
#include "Motion86.h" #include "Encoder.h" #include "SD.h" // 產生機器物件,最多可使用 machine 0~2 三台機器,每台機器三軸。 Machine machine(0); // 步進馬達 enable pin。 int EnablePin = 4; // 此 gcode 檔案存放於 SD 卡中。 char *filename = "auto.gcode"; File gfile; char buf[256]; int ptr; bool working; // 設定預設的進給速度比例。 volatile double FeedrateRatio = 1.0; bool enc_triggered = false; void encoder_callback(int flag); void setup() { while (!Serial); SD.begin(); // 在此範例中,手搖輪已經被安裝上 Enc3。 Enc3.begin(MODE_AB_PHASE); Enc3.setRange(1); // 每次都會觸發中斷 Enc3.attachInterrupt(encoder_callback); pinMode(EnablePin, OUTPUT); // 若有需要,可以反轉運動軸的運動方向。 // 在此範例中,需要反轉 x 軸和 y 軸的方向。 machine.config_ReverseDirection(AXIS_X); machine.config_ReverseDirection(AXIS_Y); // PPU (pulse per unit) 是一虛擬長度單位,依照不同需求而定。 // 此例 x 軸的單位長度設定為 80 pulses,對應到實際應用為 1 mm。 machine.config_PPU(AXIS_X, 80.0); machine.config_PPU(AXIS_Y, 80.0); machine.config_PPU(AXIS_Z, 1600.0); // 設定機器運動的軟體極限。 machine.config_PosLimit(AXIS_X, 0, 300); machine.config_PosLimit(AXIS_Y, 0, 200); machine.config_PosLimit(AXIS_Z, 0, 300); // 設定用來設定 home 點的極限開關所使用的 pin 腳。 machine.config_HomePins(2, 7, 8); // 控制之前,必須啟動機器。 machine.machineOn(); // 啟動軟體極限。 machine.enableSoftLimit(); // 設定回到 home 點的進給速率。 machine.setHomeSpeed(1000, 1000, 200); // 開啟 SD 卡中的 gcode 檔案 if (SD.exists(filename)) { gfile = SD.open(filename); working = true; } else { Serial.print("File not exists: "); Serial.println(filename); while (1); } // 啟動步進馬達。 digitalWrite(EnablePin, LOW); // 回到由極限開關所定義的 home 點。 machine.home(); } void loop() { // 讀取並解析 gcode 檔案。 if (working && !machine.isCmdBufferFull()) { ptr = 0; while (gfile.available()) { buf[ptr] = gfile.read(); if (buf[ptr] == '\n') { buf[ptr + 1] = '\0'; machine.gcode(buf); break; } else { ptr ++; } } if (!gfile.available()) { Serial.println("GCODE FINISH"); gfile.close(); working = false; } } // 當中斷處發時覆寫進給速度。 if (enc_triggered) { if (FeedrateRatio > 2.0) FeedrateRatio = 2.0; if (FeedrateRatio < 0.1) FeedrateRatio = 0.1; machine.feedrateOverride(FeedrateRatio); enc_triggered = false; Serial.print("FeedrateRatio = "); Serial.println(machine.getFeedrateOverride()); } } void encoder_callback(int flag) { // 進給速度比例應大於 0。 if (flag == INTR_OVERFLOW && FeedrateRatio < 2.0) FeedrateRatio += 0.01; else if (flag == INTR_UNDERFLOW && FeedrateRatio > 0.0) FeedrateRatio -= 0.01; enc_triggered = true; }
See also
The text of the 86Duino reference is licensed under a Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain.