My Marlin configs for Fabrikator Mini and CTC i3 Pro B
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

mesh_bed_leveling.h 1.8KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include "Marlin.h"
  2. #if defined(MESH_BED_LEVELING)
  3. #define MESH_X_DIST ((MESH_MAX_X - MESH_MIN_X)/(MESH_NUM_X_POINTS - 1))
  4. #define MESH_Y_DIST ((MESH_MAX_Y - MESH_MIN_Y)/(MESH_NUM_Y_POINTS - 1))
  5. class mesh_bed_leveling {
  6. public:
  7. uint8_t active;
  8. float z_values[MESH_NUM_Y_POINTS][MESH_NUM_X_POINTS];
  9. mesh_bed_leveling();
  10. void reset();
  11. float get_x(int i) { return MESH_MIN_X + MESH_X_DIST*i; }
  12. float get_y(int i) { return MESH_MIN_Y + MESH_Y_DIST*i; }
  13. void set_z(int ix, int iy, float z) { z_values[iy][ix] = z; }
  14. int select_x_index(float x) {
  15. int i = 1;
  16. while (x > get_x(i) && i < MESH_NUM_X_POINTS-1) {
  17. i++;
  18. }
  19. return i-1;
  20. }
  21. int select_y_index(float y) {
  22. int i = 1;
  23. while (y > get_y(i) && i < MESH_NUM_Y_POINTS-1) {
  24. i++;
  25. }
  26. return i-1;
  27. }
  28. float calc_z0(float a0, float a1, float z1, float a2, float z2) {
  29. float delta_z = (z2 - z1)/(a2 - a1);
  30. float delta_a = a0 - a1;
  31. return z1 + delta_a * delta_z;
  32. }
  33. float get_z(float x0, float y0) {
  34. int x_index = select_x_index(x0);
  35. int y_index = select_y_index(y0);
  36. float z1 = calc_z0(x0,
  37. get_x(x_index), z_values[y_index][x_index],
  38. get_x(x_index+1), z_values[y_index][x_index+1]);
  39. float z2 = calc_z0(x0,
  40. get_x(x_index), z_values[y_index+1][x_index],
  41. get_x(x_index+1), z_values[y_index+1][x_index+1]);
  42. float z0 = calc_z0(y0,
  43. get_y(y_index), z1,
  44. get_y(y_index+1), z2);
  45. return z0;
  46. }
  47. };
  48. extern mesh_bed_leveling mbl;
  49. #endif // MESH_BED_LEVELING