本文为在用龙芯1c做3D打印机过程中的笔记。龙芯1c做的3d打印机简称“龙印”.
以我手上的三角洲3D打印机为例,讨论一下限位开关在marlin中的几个应用场景,
3个导轨上方和挤出机各安装了一个限位开关。
在执行G28指令让电机xyz归零时,三个导轨上的电机带动滑块向上运动,直到碰到限位块后停止;
在自动调平时,会利用挤出机上的限位开关来探测是否接触到打印平面了;
在正常打印最下面的几层时,如果调平没有做的很好的话,可能出现打印头移动过程中会触碰到打印平面。marlin对于这种情况的处理是只要碰到打印平面则立即放弃当前gcode指令,转而执行下一条gcode指令。
现在来看marlin源码,读取限位开关状态的函数是update_endstops(),其中定义了一个宏UPDATE_ENDSTOP(AXIS,MINMAX),这是函数update_endstops()的要点,其它的是各种编译宏为了兼容各种3d打印机而设置的,这里重点分析宏UPDATE_ENDSTOP(AXIS,MINMAX),源码如下
// Check endstops - Called from ISR!
inline void update_endstops() {
#if ENABLED(Z_DUAL_ENDSTOPS)
uint16_t
#else
byte
#endif
current_endstop_bits = 0;
#define _ENDSTOP_PIN(AXIS, MINMAX) AXIS ##_## MINMAX ##_PIN
#define _ENDSTOP_INVERTING(AXIS, MINMAX) AXIS ##_## MINMAX ##_ENDSTOP_INVERTING
#define _AXIS(AXIS) AXI