Edit digipot currents via LCD, save to EEPROM

This commit is contained in:
dot-bob 2017-06-02 23:38:07 -06:00 committed by Scott Lahteine
parent 3c7bfe798d
commit b3c36c98fd
6 changed files with 164 additions and 51 deletions

View file

@ -36,13 +36,13 @@
* *
*/ */
#define EEPROM_VERSION "V38" #define EEPROM_VERSION "V39"
// Change EEPROM version if these are changed: // Change EEPROM version if these are changed:
#define EEPROM_OFFSET 100 #define EEPROM_OFFSET 100
/** /**
* V38 EEPROM Layout: * V39 EEPROM Layout:
* *
* 100 Version (char x4) * 100 Version (char x4)
* 104 EEPROM CRC16 (uint16_t) * 104 EEPROM CRC16 (uint16_t)
@ -140,24 +140,29 @@
* 534 M200 T D filament_size (float x5) (T0..3) * 534 M200 T D filament_size (float x5) (T0..3)
* *
* HAVE_TMC2130: 20 bytes * HAVE_TMC2130: 20 bytes
* 554 M906 X stepperX current (uint16_t) * 554 M906 X Stepper X current (uint16_t)
* 556 M906 Y stepperY current (uint16_t) * 556 M906 Y Stepper Y current (uint16_t)
* 558 M906 Z stepperZ current (uint16_t) * 558 M906 Z Stepper Z current (uint16_t)
* 560 M906 X2 stepperX2 current (uint16_t) * 560 M906 X2 Stepper X2 current (uint16_t)
* 562 M906 Y2 stepperY2 current (uint16_t) * 562 M906 Y2 Stepper Y2 current (uint16_t)
* 564 M906 Z2 stepperZ2 current (uint16_t) * 564 M906 Z2 Stepper Z2 current (uint16_t)
* 566 M906 E0 stepperE0 current (uint16_t) * 566 M906 E0 Stepper E0 current (uint16_t)
* 568 M906 E1 stepperE1 current (uint16_t) * 568 M906 E1 Stepper E1 current (uint16_t)
* 570 M906 E2 stepperE2 current (uint16_t) * 570 M906 E2 Stepper E2 current (uint16_t)
* 572 M906 E3 stepperE3 current (uint16_t) * 572 M906 E3 Stepper E3 current (uint16_t)
* 576 M906 E4 stepperE4 current (uint16_t) * 576 M906 E4 Stepper E4 current (uint16_t)
* *
* LIN_ADVANCE: 8 bytes * LIN_ADVANCE: 8 bytes
* 580 M900 K extruder_advance_k (float) * 580 M900 K extruder_advance_k (float)
* 584 M900 WHD advance_ed_ratio (float) * 584 M900 WHD advance_ed_ratio (float)
* *
* 588 Minimum end-point * HAS_MOTOR_CURRENT_PWM:
* 1909 (588 + 36 + 9 + 288 + 988) Maximum end-point * 588 M907 X Stepper XY current (uint32_t)
* 592 M907 Z Stepper Z current (uint32_t)
* 596 M907 E Stepper E current (uint32_t)
*
* 600 Minimum end-point
* 1921 (600 + 36 + 9 + 288 + 988) Maximum end-point
* *
* ======================================================================== * ========================================================================
* meshes_begin (between max and min end-point, directly above) * meshes_begin (between max and min end-point, directly above)
@ -177,6 +182,7 @@ MarlinSettings settings;
#include "planner.h" #include "planner.h"
#include "temperature.h" #include "temperature.h"
#include "ultralcd.h" #include "ultralcd.h"
#include "stepper.h"
#if ENABLED(INCH_MODE_SUPPORT) || (ENABLED(ULTIPANEL) && ENABLED(TEMPERATURE_UNITS_SUPPORT)) #if ENABLED(INCH_MODE_SUPPORT) || (ENABLED(ULTIPANEL) && ENABLED(TEMPERATURE_UNITS_SUPPORT))
#include "gcode.h" #include "gcode.h"
@ -238,6 +244,10 @@ void MarlinSettings::postprocess() {
refresh_bed_level(); refresh_bed_level();
//set_bed_leveling_enabled(leveling_is_on); //set_bed_leveling_enabled(leveling_is_on);
#endif #endif
#if HAS_MOTOR_CURRENT_PWM
stepper.refresh_motor_power();
#endif
} }
#if ENABLED(EEPROM_SETTINGS) #if ENABLED(EEPROM_SETTINGS)
@ -626,6 +636,13 @@ void MarlinSettings::postprocess() {
EEPROM_WRITE(dummy); EEPROM_WRITE(dummy);
#endif #endif
#if HAS_MOTOR_CURRENT_PWM
for (uint8_t q = 3; q--;) EEPROM_WRITE(stepper.motor_current_setting[q]);
#else
const uint32_t dummyui32 = 0;
for (uint8_t q = 3; q--;) EEPROM_WRITE(dummyui32);
#endif
if (!eeprom_error) { if (!eeprom_error) {
const int eeprom_size = eeprom_index; const int eeprom_size = eeprom_index;
@ -979,6 +996,13 @@ void MarlinSettings::postprocess() {
EEPROM_READ(dummy); EEPROM_READ(dummy);
#endif #endif
#if HAS_MOTOR_CURRENT_PWM
for (uint8_t q = 3; q--;) EEPROM_READ(stepper.motor_current_setting[q]);
#else
uint32_t dummyui32;
for (uint8_t q = 3; q--;) EEPROM_READ(dummyui32);
#endif
if (working_crc == stored_crc) { if (working_crc == stored_crc) {
postprocess(); postprocess();
SERIAL_ECHO_START(); SERIAL_ECHO_START();
@ -1309,6 +1333,12 @@ void MarlinSettings::reset() {
planner.advance_ed_ratio = LIN_ADVANCE_E_D_RATIO; planner.advance_ed_ratio = LIN_ADVANCE_E_D_RATIO;
#endif #endif
#if HAS_MOTOR_CURRENT_PWM
uint32_t tmp_motor_current_setting[3] = PWM_MOTOR_CURRENT;
for (uint8_t q = 3; q--;)
stepper.digipot_current(q, (stepper.motor_current_setting[q] = tmp_motor_current_setting[q]));
#endif
#if ENABLED(AUTO_BED_LEVELING_UBL) #if ENABLED(AUTO_BED_LEVELING_UBL)
ubl.reset(); ubl.reset();
#endif #endif
@ -1788,6 +1818,18 @@ void MarlinSettings::reset() {
SERIAL_ECHOPAIR(" M900 K", planner.extruder_advance_k); SERIAL_ECHOPAIR(" M900 K", planner.extruder_advance_k);
SERIAL_ECHOLNPAIR(" R", planner.advance_ed_ratio); SERIAL_ECHOLNPAIR(" R", planner.advance_ed_ratio);
#endif #endif
#if HAS_MOTOR_CURRENT_PWM
CONFIG_ECHO_START;
if (!forReplay) {
SERIAL_ECHOLNPGM("Stepper motor currents:");
CONFIG_ECHO_START;
}
SERIAL_ECHOPAIR(" M907 X", stepper.motor_current_setting[0]);
SERIAL_ECHOPAIR(" Z", stepper.motor_current_setting[1]);
SERIAL_ECHOPAIR(" E", stepper.motor_current_setting[2]);
SERIAL_EOL();
#endif
} }
#endif // !DISABLE_M503 #endif // !DISABLE_M503

View file

@ -85,7 +85,9 @@
#define MOTOR_CURRENT_PWM_Z_PIN 45 #define MOTOR_CURRENT_PWM_Z_PIN 45
#define MOTOR_CURRENT_PWM_E_PIN 44 #define MOTOR_CURRENT_PWM_E_PIN 44
// Motor current PWM conversion, PWM value = MotorCurrentSetting * 255 / range // Motor current PWM conversion, PWM value = MotorCurrentSetting * 255 / range
#define MOTOR_CURRENT_PWM_RANGE 2000 #ifndef MOTOR_CURRENT_PWM_RANGE
#define MOTOR_CURRENT_PWM_RANGE 2000
#endif
#define DEFAULT_PWM_MOTOR_CURRENT {1300, 1300, 1250} #define DEFAULT_PWM_MOTOR_CURRENT {1300, 1300, 1250}
// //

View file

@ -74,7 +74,9 @@
#define MOTOR_CURRENT_PWM_Z_PIN 45 #define MOTOR_CURRENT_PWM_Z_PIN 45
#define MOTOR_CURRENT_PWM_E_PIN 46 #define MOTOR_CURRENT_PWM_E_PIN 46
// Motor current PWM conversion, PWM value = MotorCurrentSetting * 255 / range // Motor current PWM conversion, PWM value = MotorCurrentSetting * 255 / range
#define MOTOR_CURRENT_PWM_RANGE 2000 #ifndef MOTOR_CURRENT_PWM_RANGE
#define MOTOR_CURRENT_PWM_RANGE 2000
#endif
#define DEFAULT_PWM_MOTOR_CURRENT {1300, 1300, 1250} #define DEFAULT_PWM_MOTOR_CURRENT {1300, 1300, 1250}
// //

View file

@ -72,6 +72,10 @@ block_t* Stepper::current_block = NULL; // A pointer to the block currently bei
bool Stepper::performing_homing = false; bool Stepper::performing_homing = false;
#endif #endif
#if HAS_MOTOR_CURRENT_PWM
uint32_t Stepper::motor_current_setting[3] = PWM_MOTOR_CURRENT;
#endif
// private: // private:
uint8_t Stepper::last_direction_bits = 0; // The next stepping-bits to be output uint8_t Stepper::last_direction_bits = 0; // The next stepping-bits to be output
@ -1457,35 +1461,30 @@ void Stepper::report_positions() {
#endif // HAS_DIGIPOTSS #endif // HAS_DIGIPOTSS
#if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM #if HAS_MOTOR_CURRENT_PWM
void Stepper::digipot_init() { void Stepper::refresh_motor_power() {
#if HAS_DIGIPOTSS for (uint8_t i = 0; i < COUNT(motor_current_setting); ++i) {
static const uint8_t digipot_motor_current[] = DIGIPOT_MOTOR_CURRENT; switch (i) {
SPI.begin(); #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY)
SET_OUTPUT(DIGIPOTSS_PIN); case 0:
for (uint8_t i = 0; i < COUNT(digipot_motor_current); i++) { #endif
//digitalPotWrite(digipot_ch[i], digipot_motor_current[i]); #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
digipot_current(i, digipot_motor_current[i]); case 1:
#endif
#if PIN_EXISTS(MOTOR_CURRENT_PWM_E)
case 2:
#endif
digipot_current(i, motor_current_setting[i]);
default: break;
} }
#elif HAS_MOTOR_CURRENT_PWM }
#if PIN_EXISTS(MOTOR_CURRENT_PWM_XY)
SET_OUTPUT(MOTOR_CURRENT_PWM_XY_PIN);
digipot_current(0, motor_current_setting[0]);
#endif
#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
SET_OUTPUT(MOTOR_CURRENT_PWM_Z_PIN);
digipot_current(1, motor_current_setting[1]);
#endif
#if PIN_EXISTS(MOTOR_CURRENT_PWM_E)
SET_OUTPUT(MOTOR_CURRENT_PWM_E_PIN);
digipot_current(2, motor_current_setting[2]);
#endif
//Set timer5 to 31khz so the PWM of the motor power is as constant as possible. (removes a buzzing noise)
TCCR5B = (TCCR5B & ~(_BV(CS50) | _BV(CS51) | _BV(CS52))) | _BV(CS50);
#endif
} }
#endif // HAS_MOTOR_CURRENT_PWM
#if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM
void Stepper::digipot_current(const uint8_t driver, const int current) { void Stepper::digipot_current(const uint8_t driver, const int current) {
#if HAS_DIGIPOTSS #if HAS_DIGIPOTSS
@ -1494,6 +1493,10 @@ void Stepper::report_positions() {
digitalPotWrite(digipot_ch[driver], current); digitalPotWrite(digipot_ch[driver], current);
#elif HAS_MOTOR_CURRENT_PWM #elif HAS_MOTOR_CURRENT_PWM
if (WITHIN(driver, 0, 2))
motor_current_setting[driver] = current; // update motor_current_setting
#define _WRITE_CURRENT_PWM(P) analogWrite(MOTOR_CURRENT_PWM_## P ##_PIN, 255L * current / (MOTOR_CURRENT_PWM_RANGE)) #define _WRITE_CURRENT_PWM(P) analogWrite(MOTOR_CURRENT_PWM_## P ##_PIN, 255L * current / (MOTOR_CURRENT_PWM_RANGE))
switch (driver) { switch (driver) {
#if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY)
@ -1509,6 +1512,40 @@ void Stepper::report_positions() {
#endif #endif
} }
void Stepper::digipot_init() {
#if HAS_DIGIPOTSS
static const uint8_t digipot_motor_current[] = DIGIPOT_MOTOR_CURRENT;
SPI.begin();
SET_OUTPUT(DIGIPOTSS_PIN);
for (uint8_t i = 0; i < COUNT(digipot_motor_current); i++) {
//digitalPotWrite(digipot_ch[i], digipot_motor_current[i]);
digipot_current(i, digipot_motor_current[i]);
}
#elif HAS_MOTOR_CURRENT_PWM
#if PIN_EXISTS(MOTOR_CURRENT_PWM_XY)
SET_OUTPUT(MOTOR_CURRENT_PWM_XY_PIN);
#endif
#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
SET_OUTPUT(MOTOR_CURRENT_PWM_Z_PIN);
#endif
#if PIN_EXISTS(MOTOR_CURRENT_PWM_E)
SET_OUTPUT(MOTOR_CURRENT_PWM_E_PIN);
#endif
refresh_motor_power();
// Set Timer5 to 31khz so the PWM of the motor power is as constant as possible. (removes a buzzing noise)
SET_CS5(PRESCALER_1);
#endif
}
#endif #endif
#if HAS_MICROSTEPS #if HAS_MICROSTEPS

View file

@ -91,6 +91,13 @@ class Stepper {
static bool performing_homing; static bool performing_homing;
#endif #endif
#if HAS_MOTOR_CURRENT_PWM
#ifndef PWM_MOTOR_CURRENT
#define PWM_MOTOR_CURRENT DEFAULT_PWM_MOTOR_CURRENT
#endif
static uint32_t motor_current_setting[3];
#endif
private: private:
static uint8_t last_direction_bits; // The next stepping-bits to be output static uint8_t last_direction_bits; // The next stepping-bits to be output
@ -132,13 +139,6 @@ class Stepper {
static volatile long endstops_trigsteps[XYZ]; static volatile long endstops_trigsteps[XYZ];
static volatile long endstops_stepsTotal, endstops_stepsDone; static volatile long endstops_stepsTotal, endstops_stepsDone;
#if HAS_MOTOR_CURRENT_PWM
#ifndef PWM_MOTOR_CURRENT
#define PWM_MOTOR_CURRENT DEFAULT_PWM_MOTOR_CURRENT
#endif
static constexpr int motor_current_setting[3] = PWM_MOTOR_CURRENT;
#endif
// //
// Positions of stepper motors, in step units // Positions of stepper motors, in step units
// //
@ -279,6 +279,10 @@ class Stepper {
return endstops_trigsteps[axis] * planner.steps_to_mm[axis]; return endstops_trigsteps[axis] * planner.steps_to_mm[axis];
} }
#if HAS_MOTOR_CURRENT_PWM
static void refresh_motor_power();
#endif
private: private:
static FORCE_INLINE unsigned short calc_timer(unsigned short step_rate) { static FORCE_INLINE unsigned short calc_timer(unsigned short step_rate) {
@ -380,7 +384,9 @@ class Stepper {
// SERIAL_ECHOLN(current_block->final_advance/256.0); // SERIAL_ECHOLN(current_block->final_advance/256.0);
} }
static void digipot_init(); #if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM
static void digipot_init();
#endif
#if HAS_MICROSTEPS #if HAS_MICROSTEPS
static void microstep_init(); static void microstep_init();

View file

@ -1249,6 +1249,7 @@ void kill_screen(const char* lcd_msg) {
* *
*/ */
#if ENABLED(DAC_STEPPER_CURRENT) #if ENABLED(DAC_STEPPER_CURRENT)
void dac_driver_getValues() { LOOP_XYZE(i) driverPercent[i] = dac_current_get_percent((AxisEnum)i); } void dac_driver_getValues() { LOOP_XYZE(i) driverPercent[i] = dac_current_get_percent((AxisEnum)i); }
void dac_driver_commit() { dac_current_set_percents(driverPercent); } void dac_driver_commit() { dac_current_set_percents(driverPercent); }
@ -1266,7 +1267,27 @@ void kill_screen(const char* lcd_msg) {
MENU_ITEM(function, MSG_DAC_EEPROM_WRITE, dac_driver_eeprom_write); MENU_ITEM(function, MSG_DAC_EEPROM_WRITE, dac_driver_eeprom_write);
END_MENU(); END_MENU();
} }
#endif
#endif // DAC_STEPPER_CURRENT
#if HAS_MOTOR_CURRENT_PWM
void lcd_pwm_menu() {
START_MENU();
MENU_BACK(MSG_CONTROL);
#if PIN_EXISTS(MOTOR_CURRENT_PWM_XY)
MENU_ITEM_EDIT_CALLBACK(long5, MSG_X MSG_Y, &stepper.motor_current_setting[0], 100, 2000, Stepper::refresh_motor_power);
#endif
#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
MENU_ITEM_EDIT_CALLBACK(long5, MSG_Z, &stepper.motor_current_setting[1], 100, 2000, Stepper::refresh_motor_power);
#endif
#if PIN_EXISTS(MOTOR_CURRENT_PWM_E)
MENU_ITEM_EDIT_CALLBACK(long5, MSG_E, &stepper.motor_current_setting[2], 100, 2000, Stepper::refresh_motor_power);
#endif
END_MENU();
}
#endif // HAS_MOTOR_CURRENT_PWM
constexpr int16_t heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP); constexpr int16_t heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP);
@ -2894,6 +2915,9 @@ void kill_screen(const char* lcd_msg) {
#if ENABLED(DAC_STEPPER_CURRENT) #if ENABLED(DAC_STEPPER_CURRENT)
MENU_ITEM(submenu, MSG_DRIVE_STRENGTH, lcd_dac_menu); MENU_ITEM(submenu, MSG_DRIVE_STRENGTH, lcd_dac_menu);
#endif #endif
#if HAS_MOTOR_CURRENT_PWM
MENU_ITEM(submenu, MSG_DRIVE_STRENGTH, lcd_pwm_menu);
#endif
#if ENABLED(BLTOUCH) #if ENABLED(BLTOUCH)
MENU_ITEM(submenu, MSG_BLTOUCH, bltouch_menu); MENU_ITEM(submenu, MSG_BLTOUCH, bltouch_menu);