Deploying to gh-pages from @ Klipper3d/klipper@434770eaf9 🚀

This commit is contained in:
KevinOConnor
2024-05-06 00:04:31 +00:00
parent 1abfa00e23
commit 43cff61d2d
58 changed files with 567 additions and 482 deletions

View File

@@ -1499,15 +1499,16 @@ z_hop_speed: 5
<h2 id="bl-touch_4">BL-Touch 输出模式<a class="headerlink" href="#bl-touch_4" title="Permanent link">&para;</a></h2>
<ul>
<li>
<p>BL-Touch V3.0支持设置 5V 或 OPEN-DRAIN 输出模式BL-TOUCH V3.1也支持,但它也可以在其内部 EEPROM 中存储这个设置。如果你的控制主板需要 5V 模式的固定 5V 高逻辑电平,你可以把打印机配置文件[bltouch]部分的 'set_output_mode' 参数设置为 "5V"。<strong><em> 只在你的控制主板的输入线路可以容忍5V时使用 5V 模式。这就是为什么这些 BL-Touch 版本的默认配置是OPEN-DRAIN模式。你有可能损坏你的控制主板上的MCU </em></strong></p>
<p>BL-Touch V3.0支持设置 5V 或 OPEN-DRAIN 输出模式BL-TOUCH V3.1也支持,但它也可以在其内部 EEPROM 中存储这个设置。如果你的控制主板需要 5V 模式的固定 5V 高逻辑电平,你可以把打印机配置文件[bltouch]部分的 'set_output_mode' 参数设置为 "5V"。</p>
<p><strong><em> 只在你的控制主板的输入线路可以容忍5V时使用 5V 模式。这就是为什么这些 BL-Touch 版本的默认配置是OPEN-DRAIN模式。你有可能损坏你的控制主板上的MCU </em></strong></p>
<p>因此。如果一个控制主板需要 5V 模式,并且它的输入信号线是 5V 的,并且如果</p>
</li>
</ul>
<ul>
<li>你有一个 BL-TOUCH Smart V3.0,你需要使用 'set_output_mode:5V' 参数,以确保每次启动时的应用这一设置,因为探针不能记住所需的设置。</li>
<li>如果你有一个 BL-Touch Smart V3.1,你可以选择使用 'set_output_mode:5V " 或者通过手动使用 "BLTOUCH_STORE MODE=5V "命令,而不是使用参数 "set_output_mode: "来存储模式。</li>
<li>如果你有一些其他的探针。有些探针在电路板上有一个需要切除的线路或者需要设置的一个跳线,以便(永久)设置输出模式。在这种情况下,完全省略 "set_output_mode "参数。
如果你有一个 V3.1,不要自动或重复存储输出模式,以避免磨损探针的 EEPROM。BLTouch 的 EEPROM可用于约100.000次更新。每天存储100次在磨损之前加起来大约可以运行3年。因此在 V3.1 中存储输出模式被供应商设计成一个复杂的操作(出厂默认值是一个 safe OPEN DRAIN 模式),不适合由任何切片软件、宏或其他东西重复发出,最好仅在首次将探针添加到到打印机电子设备时使用。</li>
</ul>
</li>
</ul>

View File

@@ -1746,13 +1746,13 @@ fade_target: 0
</ul>
<h3 id="_9">配置零点参考位置<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h3>
<p>许多探头容易出现“漂移”由于热或干扰而引起的探头不准确。这使得计算探测器的z偏移量具有挑战性特别是在不同床温的情况下。因此一些打印机使用端止器来定位Z轴并使用探头来校准网格。在这种配置中可以对网格进行偏移从而使(XY)<code>参考位置‘应用零点调整。‘参考位置’应该是床上进行[Z_ENDSTOP_CALIBRATE](./Manual_Level#calibrating-a-z-endstop)试纸测试的位置。Bed_Mesh模块提供了</code>ZERO_REFERENCE_Position`选项来指定该坐标:</p>
<div class="highlight"><pre><span></span><code>[床_网格]。
速度:120
水平移动z5。
网格最小值356。
Mesh_max240,198
Zero_Reference_Position125,110
探测计数53
<div class="highlight"><pre><span></span><code>[bed_mesh]
speed: 120
horizontal_move_z: 5
mesh_min: 35, 6
mesh_max: 240, 198
zero_reference_position: 125, 110
probe_count: 5, 3
</code></pre></div>
<ul>
@@ -1760,14 +1760,14 @@ Zero_Reference_Position125,110。
</ul>
<h4 id="relative_reference_index">不推荐使用的Relative_Reference_Index<a class="headerlink" href="#relative_reference_index" title="Permanent link">&para;</a></h4>
<p>使用<code>Relative_Reference_index</code>选项的现有配置必须更新为使用<code>ZERO_REFERENCE_Position</code>。对<a href="#output">BED_MESH_OUTPUT PGP=1</a>GCODE命令的响应将包括与索引相关的(XY)坐标;该位置可用<code>ZERO_REFERENCE_POSITION</code>的值。输出将如下所示:</p>
<div class="highlight"><pre><span></span><code>//Bed_Mesh:生成点。
//索引|调整工具|探测。
//0|(1.01.0)|(24.06.0)
//1|(36.71.0)|(59.76.0)
//2|(72.31.0)|(95.36.0)
//3|(108.01.0)|(131.06.0)
..。(其他生成点)。
//BED_MESHRelative_Reference_Index 24(131.5,108.0)
<div class="highlight"><pre><span></span><code>// bed_mesh: generated points
// Index | Tool Adjusted | Probe
// 0 | (1.0, 1.0) | (24.0, 6.0)
// 1 | (36.7, 1.0) | (59.7, 6.0)
// 2 | (72.3, 1.0) | (95.3, 6.0)
// 3 | (108.0, 1.0) | (131.0, 6.0)
... (additional generated points)
// bed_mesh: relative_reference_index 24 is (131.5, 108.0)
</code></pre></div>
<p><em>注意:上述输出在初始化时也会打印在<code>klippy.log</code>中。</em></p>
@@ -1812,7 +1812,10 @@ adaptive_margin: 5
</code></pre></div>
<ul>
<li><code>adaptive_margin</code> <em>Default Value: 0</em> Margin (in mm) to add around the area of the bed used by the defined objects. The diagram below shows the adapted bed mesh area with an <code>adaptive_margin</code> of 5mm. The adapted mesh area (area in green) is computed as the used bed area (area in blue) plus the defined margin.<img alt="adaptive_bedmesh_margin" src="img/adaptive_bed_mesh_margin.svg" /></li>
<li>
<p><code>adaptive_margin</code> <em>Default Value: 0</em> Margin (in mm) to add around the area of the bed used by the defined objects. The diagram below shows the adapted bed mesh area with an <code>adaptive_margin</code> of 5mm. The adapted mesh area (area in green) is computed as the used bed area (area in blue) plus the defined margin.</p>
<p><img alt="adaptive_bedmesh_margin" src="img/adaptive_bed_mesh_margin.svg" /></p>
</li>
</ul>
<p>By nature, adaptive bed meshes use the objects defined by the Gcode file being printed. Therefore, it is expected that each Gcode file will generate a mesh that probes a different area of the print bed. Therefore, adapted bed meshes should not be re-used. The expectation is that a new mesh will be generated for each print if adaptive meshing is used.</p>
<p>It is also important to consider that adaptive bed meshing is best used on machines that can normally probe the entire bed and achieve a maximum variance less than or equal to 1 layer height. Machines with mechanical issues that a full bed mesh normally compensates for may have undesirable results when attempting print moves <strong>outside</strong> of the probed area. If a full bed mesh has a variance greater than 1 layer height, caution must be taken when using adaptive bed meshes and attempting print moves outside of the meshed area.</p>

View File

@@ -1439,10 +1439,10 @@
<h2 id="_2">主机硬件<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h2>
<p>为了使用CAN总线必须有一个主机适配器。建议使用“USB转CAN适配器”。不同的制造商提供了许多不同的USB转CAN适配器。在选择其中一个时我们建议验证是否可以在其上更新固件。(不幸的是我们发现一些USB适配器运行有缺陷的固件并被锁定因此请在购买之前进行验证。)。寻找可以直接运行Klipper的适配器(在其“USB to CAN桥模式”下)或运行<a href="https://github.com/candle-usb/candleLight_fw">Candlellight firmware</a>.</p>
<p>还需要将主机操作系统配置为使用适配器。通常可以通过创建一个名为 <code>/etc/network/interfaces.d/can0</code> 的新文件来实现,该文件包含以下内容:</p>
<div class="highlight"><pre><span></span><code>允许-热插拔can0
IFace can0可以静态。
比特率1000000
Up ifconfig$iFace txqueelen 128
<div class="highlight"><pre><span></span><code>allow-hotplug can0
iface can0 can static
bitrate 1000000
up ifconfig $IFACE txqueuelen 128
</code></pre></div>
<h2 id="_3">终端电阻<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h2>
@@ -1467,28 +1467,29 @@ canbus_uuid: 11aa22bb33cc
</code></pre></div>
<h2 id="usbcan">USB转CAN总线桥接模式<a class="headerlink" href="#usbcan" title="Permanent link">&para;</a></h2>
<p>有些微控制器支持在Klipper的“make menuconfig”模式下选择“USBCAN Bus Bridge”模式。该模式可使微控制器既可用作“USB转CAN总线适配器”,又可用作Klipper节点。</p>
<p>有些微控制器支持在Klipper的“make menuconfig”选择“USB to CAN bus bridge” 模式。该模式可使微控制器既可用作“USB转CAN总线适配器”并且同时作为Klipper节点。</p>
<p>当Klipper使用此模式时微控制器在Linux下显示为“USB CAN Bus Adapter”。“Klipper网桥MCU”本身看起来就像在此CAN总线上一样-它可以通过<code>canbus_query.py</code>识别并且必须像其他CAN Bus Klipper节点一样进行配置。</p>
<p>使用该模式时的一些重要注意事项:</p>
<ul>
<li>有必要在Linux中配置<code>can0</code> 或类似接口以便与总线通信。然而Klipper 会忽略 Linux的CAN总线速度和 CAN 总线bit-timing选项。目前CAN总线的频率需要在 "make menuconfig "中指定。Linux中指定的总线速度会被忽略。</li>
<li>每当桥接MCU重置时Linux都会关闭相应的<code>can0</code>接口。为了确保Firmware_Restart和Restart命令的正确处理建议使用<code>/etc/network/interfaces.d/can0</code>文件中的<code>Allow-hotplug</code>。例如:</li>
</ul>
<div class="highlight"><pre><span></span><code>允许-热插拔can0
IFace can0可以静态。
比特率1000000
Up ifconfig$iFace txqueelen 128
<div class="highlight"><pre><span></span><code>allow-hotplug can0
iface can0 can static
bitrate 1000000
up ifconfig $IFACE txqueuelen 128
</code></pre></div>
<ul>
<li>“桥接MCU”实际上并不在CAN总线上。可能位于CAN总线上的其他适配器不会看到进出桥接器MCU的消息。</li>
<li>
<p>“桥式MCU”实际上并不在CAN总线上。可能位于CAN总线上的其他适配器不会看到进出桥接器MCU的消息</p>
<ul>
<li>“桥式MCU”本身和CAN总线上的所有设备的可用带宽都受到CAN总线频率的有效限制。因此在使用“USB转CAN总线桥模式”时建议使用1000000的CAN总线频率。即使在CAN总线频率为1000000的情况下如果XY步进器和加速度计都通过单个“USB to CAN Bus”接口进行通信也可能没有足够的带宽来运行 <code>SHAPER_CALIBRATE</code> 测试。</li>
<li>USB转CAN桥板不会显示为USB串口设备也不会在运行<code>ls/dev/Serial/by-id</code>时出现也不能在Klipper的printer.cfg文件中使用<code>Serial</code>参数进行配置。桥接板显示为“USB CAN适配器”并在printer.cfg中配置为<a href="#configuring-klipper">CAN节点</a></li>
</ul>
<p>“桥式MCU”本身和CAN总线上的所有设备的可用带宽都受到CAN总线频率的有效限制。因此在使用“USB转CAN总线桥模式”时建议使用1000000的CAN总线频率</p>
<p>即使在CAN总线频率为1000000的情况下如果XY步进器和加速度计都通过单个“USB to CAN Bus”接口进行通信也可能没有足够的带宽来运行 <code>SHAPER_CALIBRATE</code> 测试。</p>
</li>
</ul>
<ul>
<li>USB转CAN桥板不会显示为USB串口设备也不会在运行<code>ls/dev/Serial/by-id</code>时出现也不能在Klipper的printer.cfg文件中使用<code>Serial</code>参数进行配置。桥接板显示为“USB CAN适配器”并在printer.cfg中配置为<a href="#configuring-klipper">CAN节点</a></li>
</ul>
<h2 id="_4">故障排除提示<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h2>
<p>参见<a href="CanBus_Troublrouoting.md">CAN Bus故障排除</a>文档。</p>

View File

@@ -1447,7 +1447,8 @@
<p>审核员通常会检查这些:</p>
<ol>
<li>
<p>提交是否没有缺陷,是否准备好广泛部署?提交者应在提交之前测试其更改。审核员会查找提交中的错误,但通常不会测试提交的实际内容。接受的提交通常会在被接受后的几周内部署到数千台打印机。因此,提交的质量极为重要。</p>
<p>提交是否没有缺陷,是否准备好广泛部署?</p>
<p>提交者应在提交之前测试其更改。审核员会查找提交中的错误,但通常不会测试提交的实际内容。接受的提交通常会在被接受后的几周内部署到数千台打印机。因此,提交的质量极为重要。</p>
<p><a href="https://github.com/Klipper3d/klipper">Klipper3d/klipper</a> GitHub仓库不接受实验性代码。提交者应该在他们自己的仓库中进行实验、调试和测试。<a href="Contact.html">Klipper Discourse</a>论坛可以帮助你找到其他有兴趣的开发者和可以提供真实世界反馈的用户,或者让更多人了解你的工作。</p>
<p>提交必须通过所有<a href="Debugging.html">回归测试用例</a></p>
<p>在修复代码中的缺陷时,提交者应该对该缺陷的根本原因有一个大致的了解,并且修复应该针对该根本原因。</p>
@@ -1456,7 +1457,8 @@
<p>对文件的更新不应该声明它们是一项正在进行的工作。</p>
</li>
<li>
<p>提交的文件是否为执行真实世界任务的用户提供了 "高影响力"的改进?评审员需要确定,至少在他们自己的脑海中,大致的"目标受众""受众的规模",受众将获得的"利益",“如何衡量利益",以及”这些测试的结果“。在大多数情况下,这对提交者和评审者来说都是显而易见的,而且在评审过程不需要明确的说明。</p>
<p>提交的文件是否为执行真实世界任务的用户提供了 "高影响力"的改进?</p>
<p>评审员需要确定,至少在他们自己的脑海中,大致的"目标受众""受众的规模",受众将获得的"利益",“如何衡量利益",以及”这些测试的结果“。在大多数情况下,这对提交者和评审者来说都是显而易见的,而且在评审过程不需要明确的说明。</p>
<p>提交到Klipper主分支的代码应该有足够的目标受众。作为一般的经验法则提交的内容应该针对至少100个用户的用户群体。</p>
<p>如果审稿人询问有关提交可以带来的“好处”的细节,请不要将其视为批评。能够理解更改带来的实际好处是审查的一个自然部分。</p>
<p>在讨论利益时最好是讨论“事实和衡量标准”。一般而言审查者不是在寻找“某人可能会发现选项X有用”形式的答复也不是在寻找形式为“此提交增加了固件X实现的功能”的答复。相反通常更可取的是讨论如何测量质量改进的细节以及这些测量的结果是什么--例如“在Acme X1000打印机上的测试显示如图片所示的改善的角落……”或者例如“在Foom X900打印机上打印现实世界中的对象X的时间从4小时缩短到3.5小时”。可以理解这种类型的测试可能会花费大量的时间和精力。Klipper的一些最重要的功能在合并到主分支之前花了几个月的讨论、返工、测试和文档。</p>
@@ -1466,17 +1468,18 @@
<p>新模块、新选项和新参数不应提供与现有模块类似的功能——如果差异是任意的,那么最好利用现有系统或重构现有代码。</p>
</li>
<li>
<p>提交的版权是否清晰、无偿、兼容?新的 C 文件和 Python 文件应该有一个明确的版权声明。请看现有文件以了解推荐格式。不推荐在对现有文件进行小的修改时对该文件进行版权声明。</p>
<p>提交的版权是否清晰、无偿、兼容?</p>
<p>新的 C 文件和 Python 文件应该有一个明确的版权声明。请看现有文件以了解推荐格式。不推荐在对现有文件进行小的修改时对该文件进行版权声明。</p>
<p>从第三方来源获取的代码必须与 Klipper 的许可证GNU GPLv3兼容。大型的第三方代码添加应被添加到<code>lib/</code>目录中(并遵循<a href="https://github.com/Klipper3d/klipper/blob/master/lib/README">../lib/README</a>中描述的格式)。</p>
<p>提交者必须提供一个<a href="#format-of-commit-messages">Signed-off-by 行</a>,使用他们的真实全名。它表明提交者同意<a href="developer-certificate-of-origin">开发者源头证书</a></p>
</li>
<li>
<p>提交的文件是否遵循 Klipper 文件中规定的准则?特别是,代码应遵循 <Code_Overview.md> 中的准则,配置文件应遵循 <Example_Configs.md> 中的准则。</p>
<p>提交的文件是否遵循 Klipper 文件中规定的准则?</p>
<p>特别是,代码应遵循 <Code_Overview.md> 中的准则,配置文件应遵循 <Example_Configs.md> 中的准则。</p>
</li>
<li>
<p>Klipper 文档是否已更新以反映新的更改?至少,参考文件必须随着代码的相应变化而更新:</p>
</li>
</ol>
<p>Klipper 文档是否已更新以反映新的更改?</p>
<p>至少,参考文件必须随着代码的相应变化而更新:</p>
<ul>
<li>所有命令和命令参数必须在 <G-Code.md> 中被描述。</li>
<li>所有面向用户的模块及其配置参数必须在<Config_Reference.md>中记录。</li>
@@ -1484,10 +1487,13 @@
<li>所有新的 "webhooks "及其参数必须在<API_Server.md>中描述。</li>
<li>任何对命令或配置文件设置导致无法向后兼容的改变,都必须在<Config_Changes.md>中进行说明。</li>
</ul>
</li>
</ol>
<p>新的文件应该被添加到<Overview.md>中,并被添加到网站索引<a href="https://github.com/Klipper3d/klipper/blob/master/docs/_klipper3d/mkdocs.yml">docs/_klipper3d/mkdocs.yml</a></p>
<ol>
<li>
<p>提交的内容是否完整,每次提交只涉及一个主题,并且是独立的?提交信息应遵循<a href="#format-of-commit-messages">首选格式</a></p>
<p>提交的内容是否完整,每次提交只涉及一个主题,并且是独立的?</p>
<p>提交信息应遵循<a href="#format-of-commit-messages">首选格式</a></p>
<p>提交的内容不能有合并冲突。对 Klipper 主分支的新添加总是通过 "rebase "或 "squash and rebase "完成。一般来说提交者没有必要在每次更新Klipper主库的时候重新合并他们的提交。然而如果有合并冲突建议提交者使用<code>git rebase</code>来解决冲突。</p>
<p>每一次提交都应该解决一个高层的变化。大的改动应该被分解成多个独立的提交。每个提交都应该 "自成一体",这样才能让<code>git bisect</code><code>git revert</code>等工具可靠地工作。</p>
<p>空格的修改不应该与功能修改混在一起。一般来说,无意义的空格修改是不被接受的,除非是来自被修改代码的既定 "所有者"。</p>

View File

@@ -1484,21 +1484,23 @@
<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() -&gt; _process_commands() -&gt; cmd_G1()</code>。最终将调用ToolHead类的方法实现移动 <code>cmd_G1() -&gt; ToolHead.move()</code></li>
<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() -&gt; LookAheadQueue.add_move() -&gt; LookAheadQueue.flush() -&gt; Move.set_junction() -&gt; ToolHead._process_moves()</code>.<ul>
<li>
<p>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() -&gt; LookAheadQueue.add_move() -&gt; LookAheadQueue.flush() -&gt; Move.set_junction() -&gt; ToolHead._process_moves()</code>.</p>
<ul>
<li>ToolHead.move()将创建一个Move()对象实例其中将包含移动的参数在笛卡尔空间中并这些参数以mm和s为单位</li>
<li>kinematics类将检查每个运动命令<code>ToolHead.move() -&gt; kin.check_move()</code>。各种kinematics类存放于 klippy/kinematics/ 目录。check_move()能在运动命令不合理时抛出错误。如果 check_move()成功,这意味着打印机必定能完成运动命令。</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 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() -&gt; trapq_append()</code> (in klippy/chelper/trapq.c). The step times are then generated: <code>ToolHead._process_moves() -&gt; ToolHead._advance_move_time() -&gt; ToolHead._advance_flush_time() -&gt; MCU_Stepper.generate_steps() -&gt; itersolve_generate_steps() -&gt; 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() -&gt; PrinterExtruder.move()</code>类继续宁处理。尽管挤出机使用了独立的Move()类由于Move() 实例包含了实际运动的时间,并且脉冲时间的设备是定时发送到微控制器上,因此由挤出机类产生的步进运动将与打印头的运动同步。</li>
<li>当迭代计算器计算出步进时长后,计算结果将被置于一个数组中:<code>itersolve_gen_steps_range() -&gt; stepcompress_append()</code> (位于 klippy/chelper/stepcompress.c)。数组(结构体 stepcompress.queue)存储每一步对应的微处理器时钟计数器时间。上述的“微处理器计数器”的值指的是微处理器硬件上的计数器——其值基于微处理器最后一次上电而定。</li>
<li>接下来重要的是,对步进数据进行压缩: <code>stepcompress_flush() -&gt; compress_bisect_add()</code> (位于 klippy/chelper/stepcompress.c)。上述代码将基于前述的 步进时间列表 生成和编码一系列的微控制器"queue_step"(队列步进)命令。这些"queue_step"命令将被队列化,优先处理,并发送到微控制器中(上位机通过 stepcompress.c:steppersync下位机通过serialqueue.c:serialqueue))。</li>
<li>在微控制器queue_step命令将经由 src/command.c 处理。改代码将对命令进行解释,并调用 <code>command_queue_step()</code>。command_queue_step()位于src/stepper.c将每个queue_step命令的参数附加到对应的步进队列中。正常运行下一“步”将在其执行前100ms被解释并加入队列。最后通过 <code>stepper_event()</code>结束步进事件的生成。该代码会基于queue_step命令的参数生成步进脉冲并安排下一次步进脉冲生成的时间。硬件定时器发出中断在设定的事件调用相应的stepper_event。queue_step命令的参数包含“间隔”、“计数”、“增量”。总体而言stepper_event()将执行下列内容,“记录时间”: <code>do_step(); next_wake_time = last_wake_time + interval; interval += add;</code></li>
</ul>
</li>
</ul>
<p>上面的运动过程看似十分复杂。然而真正需要注意的只有ToolHead打印头 和 kinematic (运动学)类,上述两个类的代码确定了运动执行和定时。剩下的代码仅用于处理通讯和管道的问题。</p>
<h2 id="_6">添加上位机模块<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h2>
<p>Klippy上位机的主程序能对模块进行热加载。如果设置文件中出现了类似"[my_module]" 的字段名,程序会自动尝试加载 klippy/extras/my_module.py 文件内的模块。Klipper推荐使用上述方式扩展Klipper功能。</p>

View File

@@ -1621,16 +1621,17 @@
<li>如果你已经将<code>[input_shaper]</code>分段添加到print.cfg中执行<code>SET_INPUT_SHAPER SHAPER_FREQ_X=0 SHAPER_FREQ_Y=0</code>命令。如果你得到"未知命令"错误,此时你可以安全地忽略它,继续进行测量。</li>
<li>Execute the command: <code>TUNING_TOWER COMMAND=SET_VELOCITY_LIMIT PARAMETER=ACCEL START=1500 STEP_DELTA=500 STEP_HEIGHT=5</code> Basically, we try to make ringing more pronounced by setting different large values for acceleration. This command will increase the acceleration every 5 mm starting from 1500 mm/sec^2: 1500 mm/sec^2, 2000 mm/sec^2, 2500 mm/sec^2 and so forth up until 7000 mm/sec^2 at the last band.</li>
<li>打印用建议的参数切片的测试模型。</li>
<li>如果振纹清晰可见,并且发现加速度对你的打印机来说太高了(如打印机抖动太厉害或开始丢步),你可以提前停止打印。</li>
<li>
<p>如果振纹清晰可见,并且发现加速度对你的打印机来说太高了(如打印机抖动太厉害或开始丢步),你可以提前停止打印。</p>
<ol>
<li>使用模型后侧的XY标志作为校准的参考。X标志所在一侧的测量结果用于X轴的<em>配置</em>而Y标志所在一侧则作为Y轴的配置。以X轴为例测量X标志所在一侧的数个振纹周期的长度<em>D</em>单位mm首先确定凹槽的位置为了测量准确可以忽略最靠近凹槽的数个纹路用记号笔标记起始和结束的数个振纹然后用尺子或卡尺进行测量|<img alt="标记振纹Mark ringing" src="img/ringing-mark.jpg" />|<img alt="Measure ringing" src="img/ringing-measure.jpg" />|</li>
<li>数一数测量的距离<em>D</em>中有多少个振荡<em>D</em>。如果你不确定如何计算振荡,请参考上图,其中显示<em>N</em>=6次振荡。</li>
<p>使用模型后侧的XY标志作为校准的参考。X标志所在一侧的测量结果用于X轴的<em>配置</em>而Y标志所在一侧则作为Y轴的配置。以X轴为例测量X标志所在一侧的数个振纹周期的长度<em>D</em>单位mm首先确定凹槽的位置为了测量准确可以忽略最靠近凹槽的数个纹路用记号笔标记起始和结束的数个振纹然后用尺子或卡尺进行测量</p>
<p>|<img alt="标记振纹Mark ringing" src="img/ringing-mark.jpg" />|<img alt="Measure ringing" src="img/ringing-measure.jpg" />|</p>
</li>
<li>
<p>数一数测量的距离<em>D</em>中有多少个振荡<em>D</em>。如果你不确定如何计算振荡,请参考上图,其中显示<em>N</em>=6次振荡。</p>
</li>
<li>通过 <em>V</em> &middot; <em>N</em> / <em>D</em> (Hz) 计算振铃的频率,其中<em>V</em> 是外壁的加速度mm/秒。在上述例子中我们标记了6个振纹同时测试件是以100 mm/秒的速度进行印制因此振动频率为100 * 6 / 12.14 ≈ 49.4 Hz。</li>
<li>Do (8) - (10) for Y mark as well.</li>
</ol>
</li>
</ol>
<p>请注意,测试打印件上的振纹应遵循弧形凹槽的模式,如上图所示。如果不是这样,那么这个缺陷就不是真正的振纹,而是有不同的原因--要么是机械问题,要么是挤出机问题。在启用和调整输入整形器之前,应该先解决这个问题。</p>
<p>如果打印机存在多个共振频率,那么测量的结果将变得不可靠,表现为振纹之间的距离不恒定。我们可以通过 <a href="#unreliable-measurements-of-ringing-frequencies">修正不可靠的共振频率测量Unreliable measurements of ringing frequencies</a>章节的步骤进行修正,以发挥输入整形的效用。</p>
<p>振铃频率会基于工件在床上的位置和打印的Z高度而变化这种情况在<em>三角洲打印机上</em>特为显著我们可以通过检查工件的不同位置和高度上的振纹是否出现显著变化而确定。如果出现上述状况可以通过计算不同位置的振铃频率并基于x轴和y轴计算平均值。</p>

View File

@@ -2012,7 +2012,10 @@
<h2 id="exclude_object">exclude_object<a class="headerlink" href="#exclude_object" title="Permanent link">&para;</a></h2>
<p>以下信息可在<a href="Exclude_Object.html">exclude_object</a>对象中找到:</p>
<ul>
<li><code>objects</code><code>EXCLUDE_OBJECT_DEFINE</code> 命令提供的已知对象数组。这与 <code>EXCLUDE_OBJECT VERBOSE=1</code> 命令提供的信息相同。 <code>center</code><code>polygon</code> 字段只有在原始 <code>EXCLUDE_OBJECT_DEFINE</code> 中提供时才会出现这里有一个JSON样本</li>
<li>
<p><code>objects</code><code>EXCLUDE_OBJECT_DEFINE</code> 命令提供的已知对象数组。这与 <code>EXCLUDE_OBJECT VERBOSE=1</code> 命令提供的信息相同。 <code>center</code><code>polygon</code> 字段只有在原始 <code>EXCLUDE_OBJECT_DEFINE</code> 中提供时才会出现</p>
<p>这里有一个JSON样本</p>
</li>
</ul>
<div class="highlight"><pre><span></span><code>[
{

File diff suppressed because one or more lines are too long

View File

@@ -2,267 +2,267 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
<url>
<loc>None</loc>
<lastmod>2024-05-05</lastmod>
<lastmod>2024-05-06</lastmod>
<changefreq>daily</changefreq>
</url>
</urlset>

Binary file not shown.