Deploying to gh-pages from @ Klipper3d/klipper@7b490f3ec1 🚀
This commit is contained in:
@@ -1484,16 +1484,16 @@
|
||||
<p>典型的印表機運動始於klipper上位機接收到"G1"命令,並在微控制器發出對應的步進脈衝結束。本節將簡述典型運動命令的程式碼流。<a href="Kinematics.html">運動學</a>文件將更為細緻的描述運動的機械原理。</p>
|
||||
<ul>
|
||||
<li>移動命令的處理始於gcode.py,該程式碼將G程式碼轉化為內部呼叫。G1命令將呼叫klippy/extras/gcode_move.py中的cmd_G1()函式。gcode_move.py中的程式碼將處理 原點變換(G92),絕對座標模式(G90)和單位變換(如F6000=100mm/s)。一個移動命令的處理路徑為:<code>_process_data() -> _process_commands() -> cmd_G1()</code>。最終將呼叫ToolHead類的方法實現移動 <code>cmd_G1() -> ToolHead.move()</code>。</li>
|
||||
<li>ToolHead類(位於toolhead.py)處理「前瞻」行為和記錄列印的時間點。移動命令的程式碼路徑為 <code>ToolHead.move() -> MoveQueue.add_move() -> MoveQueue.flush() -> Move.set_junction() -> ToolHead._process_moves()</code>。<ul>
|
||||
<li>The ToolHead class (in toolhead.py) handles "look-ahead" and tracks the timing of printing actions. The main codepath for a move is: <code>ToolHead.move() -> LookAheadQueue.add_move() -> LookAheadQueue.flush() -> Move.set_junction() -> ToolHead._process_moves()</code>.<ul>
|
||||
<li>ToolHead.move()將建立一個Move()對像實例,其中將包含移動的參數(在笛卡爾空間中,並這些參數以mm和s為單位)。</li>
|
||||
<li>kinematics類將檢查每個運動命令(<code>ToolHead.move() -> kin.check_move()</code>)。各種kinematics類存放于 klippy/kinematics/ 目錄。check_move()能在運動命令不合理時拋出錯誤。如果 check_move()成功,這意味著印表機必定能完成運動命令。</li>
|
||||
<li>MoveQueue.add_move()將一個move實例新增到「前瞻」佇列。</li>
|
||||
<li>MoveQueue.flush()將進行每次運動 起始和結束 速度。</li>
|
||||
<li>LookAheadQueue.add_move() places the move object on the "look-ahead" queue.</li>
|
||||
<li>LookAheadQueue.flush() determines the start and end velocities of each move.</li>
|
||||
<li>Move.set_junction()實現移動的「梯形加減速(trapezoid generator)」。「梯形加減速」將每次移動拆分為三部分:恒加速度加速階段、恒速度階段、恒加速度減速階段。所有移動均含有上述三個階段,但單個階段的持續時間可能為0。</li>
|
||||
<li>當ToolHead._process_moves()被呼叫時,一次移動的所有要素均已就緒——移動的起始位置、結束位置、加速度、起始/巡航/結束速度、以及起始/巡航/結束的距離。所有資訊以笛卡爾座標的形式儲存在Move()實例中,單位為mm和s。</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Klipper使用<a href="https://en.wikipedia.org/wiki/Root-finding_algorithm">迭代求解</a>的方式產生步進電機的每步的時長。爲了提高效率,步進脈衝時間是以C語言程式碼產生。一個運動先經過「梯形運動佇列化」 :<code>ToolHead._process_moves() -> trapq_append()</code> (位於 klippy/chelper/trapq.c),然後產生步進時間 <code>ToolHead._process_moves() -> ToolHead._update_move_time() -> MCU_Stepper.generate_steps() -> itersolve_generate_steps() -> itersolve_gen_steps_range()</code> (位於 klippy/chelper/itersolve.c)。迭代求解器通過一個時間-位置方程計算出步進時間。求解時通過「假定」時間點,以時間-位置方程計算出下一步的位置。如果計算結果與實際需求的下一步位置一致,假定值將用於實際運動;否則,通過計算結果對「假定時間」進行修正,並進行下一次試算。這種反饋方式會使迭代快速收斂。運動學所使用的時間-位置函式位於 klippy/chelper/ 目錄 (例如, kin_cart.c, kin_corexy.c, kin_delta.c, kin_extruder.c)。</li>
|
||||
<li>Klipper uses an <a href="https://en.wikipedia.org/wiki/Root-finding_algorithm">iterative solver</a> to generate the step times for each stepper. For efficiency reasons, the stepper pulse times are generated in C code. The moves are first placed on a "trapezoid motion queue": <code>ToolHead._process_moves() -> trapq_append()</code> (in klippy/chelper/trapq.c). The step times are then generated: <code>ToolHead._process_moves() -> ToolHead._advance_move_time() -> ToolHead._advance_flush_time() -> MCU_Stepper.generate_steps() -> itersolve_generate_steps() -> itersolve_gen_steps_range()</code> (in klippy/chelper/itersolve.c). The goal of the iterative solver is to find step times given a function that calculates a stepper position from a time. This is done by repeatedly "guessing" various times until the stepper position formula returns the desired position of the next step on the stepper. The feedback produced from each guess is used to improve future guesses so that the process rapidly converges to the desired time. The kinematic stepper position formulas are located in the klippy/chelper/ directory (eg, kin_cart.c, kin_corexy.c, kin_delta.c, kin_extruder.c).</li>
|
||||
<li>需要注意,擠出機有獨特的運動學模型,使用<code>ToolHead._process_moves() -> PrinterExtruder.move()</code>類繼續寧處理。儘管擠出機使用了獨立的Move()類,由於Move() 實例包含了實際運動的時間,並且脈衝時間的裝置是定時發送到微控制器上,因此由擠出機類產生的步進運動將與列印頭的運動同步。</li>
|
||||
<li>當迭代計算器計算出步進時長后,計算結果將被置於一個陣列中:<code>itersolve_gen_steps_range() -> stepcompress_append()</code> (位於 klippy/chelper/stepcompress.c)。陣列(結構體 stepcompress.queue)儲存每一步對應的微處理器時鐘計數器時間。上述的「微處理器計數器」的值指的是微處理器硬體上的計數器——其值基於微處理器最後一次上電而定。</li>
|
||||
<li>接下來重要的是,對步進數據進行壓縮: <code>stepcompress_flush() -> compress_bisect_add()</code> (位於 klippy/chelper/stepcompress.c)。上述程式碼將基於前述的 步進時間列表 產生和編碼一系列的微控制器"queue_step"(佇列步進)命令。這些"queue_step"命令將被佇列化,優先處理,併發送到微控制器中(上位機通過 stepcompress.c:steppersync;下位機通過serialqueue.c:serialqueue))。</li>
|
||||
|
||||
Reference in New Issue
Block a user