Implement kinematic software endstops
This commit is contained in:
		
							parent
							
								
									6e5f13a5c2
								
							
						
					
					
						commit
						04c0d9f3c3
					
				| @ -454,29 +454,42 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS }, | ||||
|   // Software Endstops are based on the configured limits.
 | ||||
|   bool soft_endstops_enabled = true; | ||||
| 
 | ||||
|   #if IS_KINEMATIC | ||||
|     float soft_endstop_radius, soft_endstop_radius_2; | ||||
|   #endif | ||||
| 
 | ||||
|   /**
 | ||||
|    * Constrain the given coordinates to the software endstops. | ||||
|    * | ||||
|    * NOTE: This will only apply to Z on DELTA and SCARA. XY is | ||||
|    *       constrained to a circle on these kinematic systems. | ||||
|    * For DELTA/SCARA the XY constraint is based on the smallest | ||||
|    * radius within the set software endstops. | ||||
|    */ | ||||
|   void clamp_to_software_endstops(float target[XYZ]) { | ||||
|     if (!soft_endstops_enabled) return; | ||||
|     #if ENABLED(MIN_SOFTWARE_ENDSTOP_X) | ||||
|       NOLESS(target[X_AXIS], soft_endstop_min[X_AXIS]); | ||||
|     #endif | ||||
|     #if ENABLED(MIN_SOFTWARE_ENDSTOP_Y) | ||||
|       NOLESS(target[Y_AXIS], soft_endstop_min[Y_AXIS]); | ||||
|     #if IS_KINEMATIC | ||||
|       const float dist_2 = HYPOT2(target[X_AXIS], target[Y_AXIS]); | ||||
|       if (dist_2 > soft_endstop_radius_2) { | ||||
|         const float ratio = soft_endstop_radius / SQRT(dist_2); // 200 / 300 = 0.66
 | ||||
|         target[X_AXIS] *= ratio; | ||||
|         target[Y_AXIS] *= ratio; | ||||
|       } | ||||
|     #else | ||||
|       #if ENABLED(MIN_SOFTWARE_ENDSTOP_X) | ||||
|         NOLESS(target[X_AXIS], soft_endstop_min[X_AXIS]); | ||||
|       #endif | ||||
|       #if ENABLED(MIN_SOFTWARE_ENDSTOP_Y) | ||||
|         NOLESS(target[Y_AXIS], soft_endstop_min[Y_AXIS]); | ||||
|       #endif | ||||
|       #if ENABLED(MAX_SOFTWARE_ENDSTOP_X) | ||||
|         NOMORE(target[X_AXIS], soft_endstop_max[X_AXIS]); | ||||
|       #endif | ||||
|       #if ENABLED(MAX_SOFTWARE_ENDSTOP_Y) | ||||
|         NOMORE(target[Y_AXIS], soft_endstop_max[Y_AXIS]); | ||||
|       #endif | ||||
|     #endif | ||||
|     #if ENABLED(MIN_SOFTWARE_ENDSTOP_Z) | ||||
|       NOLESS(target[Z_AXIS], soft_endstop_min[Z_AXIS]); | ||||
|     #endif | ||||
|     #if ENABLED(MAX_SOFTWARE_ENDSTOP_X) | ||||
|       NOMORE(target[X_AXIS], soft_endstop_max[X_AXIS]); | ||||
|     #endif | ||||
|     #if ENABLED(MAX_SOFTWARE_ENDSTOP_Y) | ||||
|       NOMORE(target[Y_AXIS], soft_endstop_max[Y_AXIS]); | ||||
|     #endif | ||||
|     #if ENABLED(MAX_SOFTWARE_ENDSTOP_Z) | ||||
|       NOMORE(target[Z_AXIS], soft_endstop_max[Z_AXIS]); | ||||
|     #endif | ||||
| @ -1259,8 +1272,17 @@ void homeaxis(const AxisEnum axis) { | ||||
|     #endif | ||||
| 
 | ||||
|     #if ENABLED(DELTA) | ||||
|       if (axis == Z_AXIS) | ||||
|         delta_clip_start_height = soft_endstop_max[axis] - delta_safe_distance_from_top(); | ||||
|       switch(axis) { | ||||
|         case X_AXIS: | ||||
|         case Y_AXIS: | ||||
|           // Get a minimum radius for clamping
 | ||||
|           soft_endstop_radius = MIN3(FABS(max(soft_endstop_min[X_AXIS], soft_endstop_min[Y_AXIS])), soft_endstop_max[X_AXIS], soft_endstop_max[Y_AXIS]); | ||||
|           soft_endstop_radius_2 = sq(soft_endstop_radius); | ||||
|           break; | ||||
|         case Z_AXIS: | ||||
|           delta_clip_start_height = soft_endstop_max[axis] - delta_safe_distance_from_top(); | ||||
|         default: break; | ||||
|       } | ||||
|     #endif | ||||
|   } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user