Browse Source

Tower angles

Adding '7-point' tower angle correction calibration
LVD-AC 8 years ago
parent
commit
004928148c
2 changed files with 47 additions and 12 deletions
  1. 46
    11
      Marlin/Marlin_main.cpp
  2. 1
    1
      Marlin/configuration_store.cpp

+ 46
- 11
Marlin/Marlin_main.cpp View File

@@ -5021,7 +5021,9 @@ inline void gcode_G28() {
5021 5021
 
5022 5022
       float e_old[XYZ],
5023 5023
             dr_old = delta_radius,
5024
-            zh_old = home_offset[Z_AXIS];
5024
+            zh_old = home_offset[Z_AXIS],
5025
+            alpha_old = delta_tower_angle_trim[A_AXIS],
5026
+            beta_old = delta_tower_angle_trim[B_AXIS];
5025 5027
       COPY(e_old,endstop_adj);
5026 5028
 
5027 5029
       // print settings
@@ -5032,7 +5034,7 @@ inline void gcode_G28() {
5032 5034
       SERIAL_EOL;
5033 5035
       LCD_MESSAGEPGM("Checking... AC");
5034 5036
 
5035
-      SERIAL_PROTOCOLPAIR("Height:", DELTA_HEIGHT + home_offset[Z_AXIS]);
5037
+      SERIAL_PROTOCOLPAIR(".Height:", DELTA_HEIGHT + home_offset[Z_AXIS]);
5036 5038
       if (abs(probe_points) > 1) {
5037 5039
         SERIAL_PROTOCOLPGM("    Ex:");
5038 5040
         if (endstop_adj[A_AXIS] >= 0) SERIAL_CHAR('+');
@@ -5046,6 +5048,16 @@ inline void gcode_G28() {
5046 5048
         SERIAL_PROTOCOLPAIR("    Radius:", delta_radius);
5047 5049
       }
5048 5050
       SERIAL_EOL;
5051
+      if (probe_points > 2) {
5052
+        SERIAL_PROTOCOLPGM(".Tower angle :    Tx:");
5053
+        if (delta_tower_angle_trim[A_AXIS] >= 0) SERIAL_CHAR('+');
5054
+        SERIAL_PROTOCOL_F(delta_tower_angle_trim[A_AXIS], 2);
5055
+        SERIAL_PROTOCOLPGM("  Ty:");
5056
+        if (delta_tower_angle_trim[B_AXIS] >= 0) SERIAL_CHAR('+');
5057
+        SERIAL_PROTOCOL_F(delta_tower_angle_trim[B_AXIS], 2);
5058
+        SERIAL_PROTOCOLPGM("  Tz:+0.00");
5059
+        SERIAL_EOL;
5060
+      }
5049 5061
 
5050 5062
       #if ENABLED(Z_PROBE_SLED)
5051 5063
         DEPLOY_PROBE();
@@ -5121,11 +5133,15 @@ inline void gcode_G28() {
5121 5133
           COPY(e_old, endstop_adj);
5122 5134
           dr_old = delta_radius;
5123 5135
           zh_old = home_offset[Z_AXIS];
5136
+          alpha_old = delta_tower_angle_trim[A_AXIS];
5137
+          beta_old = delta_tower_angle_trim[B_AXIS];
5124 5138
 
5125
-          float e_delta[XYZ] = { 0.0 }, r_delta = 0.0;
5139
+          float e_delta[XYZ] = { 0.0 }, r_delta = 0.0,
5140
+                t_alpha = 0.0, t_beta = 0.0;
5126 5141
           const float r_diff = delta_radius - delta_calibration_radius,
5127 5142
                       h_factor = 1.00 + r_diff * 0.001,
5128
-                      r_factor = -(1.75 + 0.005 * r_diff + 0.001 * sq(r_diff)); //2.25 for r_diff = 20mm
5143
+                      r_factor = -(1.75 + 0.005 * r_diff + 0.001 * sq(r_diff)), //2.25 for r_diff = 20mm
5144
+                      a_factor = 100.0 / delta_calibration_radius;
5129 5145
 
5130 5146
           #define ZP(N,I) ((N) * z_at_pt[I])
5131 5147
           #define Z1000(I) ZP(1.00, I)
@@ -5136,6 +5152,8 @@ inline void gcode_G28() {
5136 5152
           #define Z2250(I) ZP(r_factor, I)
5137 5153
           #define Z0750(I) ZP(r_factor / 3.00, I)
5138 5154
           #define Z0375(I) ZP(r_factor / 6.00, I)
5155
+          #define Z0444(I) ZP(a_factor * 4.0 / 9.0, I)
5156
+          #define Z0888(I) ZP(a_factor * 8.0 / 9.0, I)
5139 5157
 
5140 5158
           switch (probe_points) {
5141 5159
             case 1:
@@ -5151,10 +5169,10 @@ inline void gcode_G28() {
5151 5169
               break;
5152 5170
 
5153 5171
             case -2:
5154
-              e_delta[X_AXIS] = Z1050(0) - Z0700(7) + Z0350(11) + Z0350(3);
5155
-              e_delta[Y_AXIS] = Z1050(0) + Z0350(7) - Z0700(11) + Z0350(3);
5156
-              e_delta[Z_AXIS] = Z1050(0) + Z0350(7) + Z0350(11) - Z0700(3);
5157
-              r_delta         = Z2250(0) - Z0750(7) - Z0750(11) - Z0750(3);
5172
+              e_delta[X_AXIS] = Z1050(0)                                  - Z0700(7) + Z0350(11) + Z0350(3);
5173
+              e_delta[Y_AXIS] = Z1050(0)                                  + Z0350(7) - Z0700(11) + Z0350(3);
5174
+              e_delta[Z_AXIS] = Z1050(0)                                  + Z0350(7) + Z0350(11) - Z0700(3);
5175
+              r_delta         = Z2250(0)                                  - Z0750(7) - Z0750(11) - Z0750(3);
5158 5176
               break;
5159 5177
 
5160 5178
             default:
@@ -5162,6 +5180,8 @@ inline void gcode_G28() {
5162 5180
               e_delta[Y_AXIS] = Z1050(0) - Z0175(1) + Z0350(5) - Z0175(9) + Z0175(7) - Z0350(11) + Z0175(3);
5163 5181
               e_delta[Z_AXIS] = Z1050(0) - Z0175(1) - Z0175(5) + Z0350(9) + Z0175(7) + Z0175(11) - Z0350(3);
5164 5182
               r_delta         = Z2250(0) - Z0375(1) - Z0375(5) - Z0375(9) - Z0375(7) - Z0375(11) - Z0375(3);
5183
+              t_alpha         =          + Z0444(1) - Z0888(5) + Z0444(9) + Z0444(7) - Z0888(11) + Z0444(3);
5184
+              t_beta          =          - Z0888(1) + Z0444(5) + Z0444(9) - Z0888(7) + Z0444(11) + Z0444(3);
5165 5185
               break;
5166 5186
           }
5167 5187
 
@@ -5173,6 +5193,9 @@ inline void gcode_G28() {
5173 5193
           home_offset[Z_AXIS] -= z_temp;
5174 5194
           LOOP_XYZ(i) endstop_adj[i] -= z_temp;
5175 5195
 
5196
+          delta_tower_angle_trim[A_AXIS] += t_alpha;
5197
+          delta_tower_angle_trim[B_AXIS] -= t_beta;
5198
+
5176 5199
           recalc_delta_settings(delta_radius, delta_diagonal_rod);
5177 5200
         }
5178 5201
         else { // !iterate
@@ -5180,6 +5203,8 @@ inline void gcode_G28() {
5180 5203
           COPY(endstop_adj, e_old);
5181 5204
           delta_radius = dr_old;
5182 5205
           home_offset[Z_AXIS] = zh_old;
5206
+          delta_tower_angle_trim[A_AXIS] = alpha_old;
5207
+          delta_tower_angle_trim[B_AXIS] = beta_old;
5183 5208
 
5184 5209
           recalc_delta_settings(delta_radius, delta_diagonal_rod);
5185 5210
         }
@@ -5219,7 +5244,7 @@ inline void gcode_G28() {
5219 5244
         if (test_precision != 0.0) {            // !forced end
5220 5245
           if (zero_std_dev >= test_precision) { // end iterations
5221 5246
             SERIAL_PROTOCOLPGM("Calibration OK");
5222
-            SERIAL_PROTOCOLLNPGM("                                   rolling back 1");
5247
+            SERIAL_PROTOCOLLNPGM("                                    rolling back.");
5223 5248
             LCD_MESSAGEPGM("Calibration OK");
5224 5249
             SERIAL_EOL;
5225 5250
           }
@@ -5228,12 +5253,12 @@ inline void gcode_G28() {
5228 5253
             if (iterations < 31)
5229 5254
               sprintf_P(mess, PSTR("Iteration : %02i"), (int)iterations);
5230 5255
             SERIAL_PROTOCOL(mess);
5231
-            SERIAL_PROTOCOLPGM("                                   std dev:");
5256
+            SERIAL_PROTOCOLPGM("                                    std dev:");
5232 5257
             SERIAL_PROTOCOL_F(zero_std_dev, 3);
5233 5258
             SERIAL_EOL;
5234 5259
             lcd_setstatus(mess);
5235 5260
           }
5236
-          SERIAL_PROTOCOLPAIR("Height:", DELTA_HEIGHT + home_offset[Z_AXIS]);
5261
+          SERIAL_PROTOCOLPAIR(".Height:", DELTA_HEIGHT + home_offset[Z_AXIS]);
5237 5262
           if (abs(probe_points) > 1) {
5238 5263
             SERIAL_PROTOCOLPGM("    Ex:");
5239 5264
             if (endstop_adj[A_AXIS] >= 0) SERIAL_CHAR('+');
@@ -5247,6 +5272,16 @@ inline void gcode_G28() {
5247 5272
             SERIAL_PROTOCOLPAIR("    Radius:", delta_radius);
5248 5273
           }
5249 5274
           SERIAL_EOL;
5275
+          if (probe_points > 2) {
5276
+            SERIAL_PROTOCOLPGM(".Tower angle :    Tx:");
5277
+            if (delta_tower_angle_trim[A_AXIS] >= 0) SERIAL_CHAR('+');
5278
+            SERIAL_PROTOCOL_F(delta_tower_angle_trim[A_AXIS], 2);
5279
+            SERIAL_PROTOCOLPGM("  Ty:");
5280
+            if (delta_tower_angle_trim[B_AXIS] >= 0) SERIAL_CHAR('+');
5281
+            SERIAL_PROTOCOL_F(delta_tower_angle_trim[B_AXIS], 2);
5282
+            SERIAL_PROTOCOLPGM("  Tz:+0.00");
5283
+            SERIAL_EOL;
5284
+          }
5250 5285
           if (zero_std_dev >= test_precision)
5251 5286
             SERIAL_PROTOCOLLNPGM("save with M500 and/or copy to configuration.h");
5252 5287
         }

+ 1
- 1
Marlin/configuration_store.cpp View File

@@ -1477,7 +1477,7 @@ void MarlinSettings::reset() {
1477 1477
       SERIAL_ECHOPAIR(" R", LINEAR_UNIT(delta_radius));
1478 1478
       SERIAL_ECHOPAIR(" H", LINEAR_UNIT(DELTA_HEIGHT + home_offset[Z_AXIS]));
1479 1479
       SERIAL_ECHOPAIR(" S", delta_segments_per_second);
1480
-      SERIAL_ECHOPAIR(" B", LINEAR_UNIT(delta_calibration_radius);
1480
+      SERIAL_ECHOPAIR(" B", LINEAR_UNIT(delta_calibration_radius));
1481 1481
       SERIAL_ECHOPAIR(" X", LINEAR_UNIT(delta_tower_angle_trim[A_AXIS]));
1482 1482
       SERIAL_ECHOPAIR(" Y", LINEAR_UNIT(delta_tower_angle_trim[B_AXIS]));
1483 1483
       SERIAL_ECHOPAIR(" Z", 0.00);

Loading…
Cancel
Save