Add external closed loop controller support
This commit is contained in:
		| @@ -40,6 +40,8 @@ | ||||
| #include "sd/cardreader.h" | ||||
| #include "module/configuration_store.h" | ||||
| #include "module/printcounter.h" // PrintCounter or Stopwatch | ||||
| #include "feature/closedloop.h" | ||||
|  | ||||
| #ifdef ARDUINO | ||||
|   #include <pins_arduino.h> | ||||
| #endif | ||||
| @@ -903,6 +905,10 @@ void setup() { | ||||
|   #if ENABLED(USE_WATCHDOG) // Reinit watchdog after HAL_get_reset_source call | ||||
|     watchdog_init(); | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) | ||||
|     init_closedloop(); | ||||
|   #endif | ||||
| } | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -287,6 +287,13 @@ | ||||
|  | ||||
| //#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. | ||||
|  | ||||
| // Employ an external closed loop controller. Override pins here if needed. | ||||
| //#define EXTERNAL_CLOSED_LOOP_CONTROLLER | ||||
| #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) | ||||
|   //#define CLOSED_LOOP_ENABLE_PIN        -1 | ||||
|   //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|  * Dual Steppers / Dual Endstops | ||||
|  * | ||||
|   | ||||
							
								
								
									
										41
									
								
								Marlin/src/feature/closedloop.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								Marlin/src/feature/closedloop.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| /** | ||||
|  * Marlin 3D Printer Firmware | ||||
|  * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] | ||||
|  * | ||||
|  * Based on Sprinter and grbl. | ||||
|  * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  */ | ||||
| #include "../inc/MarlinConfig.h" | ||||
|  | ||||
| #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) | ||||
|  | ||||
| #if !PIN_EXISTS(CLOSED_LOOP_ENABLE) || !PIN_EXISTS(CLOSED_LOOP_MOVE_COMPLETE) | ||||
|   #error "CLOSED_LOOP_ENABLE_PIN and CLOSED_LOOP_MOVE_COMPLETE_PIN are required for EXTERNAL_CLOSED_LOOP_CONTROLLER." | ||||
| #endif | ||||
|  | ||||
| #include "closedloop.h" | ||||
|  | ||||
| void init_closedloop() { | ||||
|   OUT_WRITE(CLOSED_LOOP_ENABLE_PIN, LOW); | ||||
|   SET_INPUT_PULLUP(CLOSED_LOOP_MOVE_COMPLETE_PIN); | ||||
| } | ||||
|  | ||||
| void set_closedloop(const byte val) { | ||||
|   OUT_WRITE(CLOSED_LOOP_ENABLE_PIN, val); | ||||
| } | ||||
|  | ||||
| #endif // EXTERNAL_CLOSED_LOOP_CONTROLLER | ||||
							
								
								
									
										25
									
								
								Marlin/src/feature/closedloop.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								Marlin/src/feature/closedloop.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| /** | ||||
|  * Marlin 3D Printer Firmware | ||||
|  * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] | ||||
|  * | ||||
|  * Based on Sprinter and grbl. | ||||
|  * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  */ | ||||
| #pragma once | ||||
|  | ||||
| void init_closedloop(); | ||||
| void set_closedloop(const byte val); | ||||
							
								
								
									
										36
									
								
								Marlin/src/gcode/calibrate/M12.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								Marlin/src/gcode/calibrate/M12.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| /** | ||||
|  * Marlin 3D Printer Firmware | ||||
|  * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] | ||||
|  * | ||||
|  * Based on Sprinter and grbl. | ||||
|  * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  */ | ||||
| #include "../../inc/MarlinConfigPre.h" | ||||
|  | ||||
| #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) | ||||
|  | ||||
| #include "../gcode.h" | ||||
| #include "../../module/planner.h" | ||||
| #include "../../feature/closedloop.h" | ||||
|  | ||||
| void GcodeSuite::M12() { | ||||
|   planner.synchronize(); | ||||
|   if (parser.seenval('S')) | ||||
|     set_closedloop(parser.value_int()); // Force a CLC set | ||||
| } | ||||
|  | ||||
| #endif | ||||
| @@ -292,6 +292,10 @@ void GcodeSuite::process_parsed_command( | ||||
|         case 5: M5(); break;                                      // M5 - turn spindle/laser off | ||||
|       #endif | ||||
|  | ||||
|       #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) | ||||
|         case 12: M12(); break;                                    // M12: Synchronize and optionally force a CLC set | ||||
|       #endif | ||||
|  | ||||
|       case 17: M17(); break;                                      // M17: Enable all stepper motors | ||||
|  | ||||
|       #if ENABLED(SDSUPPORT) | ||||
|   | ||||
| @@ -76,6 +76,7 @@ | ||||
|  * M3   - Turn laser/spindle on, set spindle/laser speed/power, set rotation to clockwise | ||||
|  * M4   - Turn laser/spindle on, set spindle/laser speed/power, set rotation to counter-clockwise | ||||
|  * M5   - Turn laser/spindle off | ||||
|  * M12  - Set up closed loop control system. More features coming soon. (Requires EXTERNAL_CLOSED_LOOP_CONTROLLER) | ||||
|  * M17  - Enable/Power all stepper motors | ||||
|  * M18  - Disable all stepper motors; same as M84 | ||||
|  * M20  - List SD card. (Requires SDSUPPORT) | ||||
| @@ -438,6 +439,10 @@ private: | ||||
|     static void M5(); | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) | ||||
|     static void M12(); | ||||
|   #endif | ||||
|  | ||||
|   static void M17(); | ||||
|  | ||||
|   static void M18_M84(); | ||||
|   | ||||
| @@ -1539,7 +1539,14 @@ float Planner::get_axis_position_mm(const AxisEnum axis) { | ||||
| /** | ||||
|  * Block until all buffered steps are executed / cleaned | ||||
|  */ | ||||
| void Planner::synchronize() { while (has_blocks_queued() || cleaning_buffer_counter) idle(); } | ||||
| void Planner::synchronize() { | ||||
|   while ( | ||||
|     has_blocks_queued() || cleaning_buffer_counter | ||||
|     #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) | ||||
|       || !READ(CLOSED_LOOP_MOVE_COMPLETE_PIN) | ||||
|     #endif | ||||
|   ) idle(); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Planner::_buffer_steps | ||||
|   | ||||
		Reference in New Issue
	
	Block a user