Configurable SGTHRS
parent
860b91e42b
commit
d5249f99fd
|
|
@ -180,7 +180,7 @@ static constexpr AxisConfig idler = {
|
||||||
.iHold = 23, /// 398mA
|
.iHold = 23, /// 398mA
|
||||||
.stealth = false,
|
.stealth = false,
|
||||||
.stepsPerUnit = (200 * 16 / 360.),
|
.stepsPerUnit = (200 * 16 / 360.),
|
||||||
.sg_thrs = 5,
|
.sg_thrs = 6,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Idler motion limits
|
/// Idler motion limits
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
/// @file tmc2130.cpp
|
/// @file tmc2130.cpp
|
||||||
#include "tmc2130.h"
|
#include "tmc2130.h"
|
||||||
#include "../config/config.h"
|
#include "../config/config.h"
|
||||||
|
#include "../modules/permanent_storage.h"
|
||||||
#include "../debug.h"
|
#include "../debug.h"
|
||||||
|
|
||||||
namespace hal {
|
namespace hal {
|
||||||
|
|
@ -44,8 +44,7 @@ bool TMC2130::Init(const MotorParams ¶ms, const MotorCurrents ¤ts, Mot
|
||||||
WriteRegister(params, Registers::TPOWERDOWN, 0);
|
WriteRegister(params, Registers::TPOWERDOWN, 0);
|
||||||
|
|
||||||
///Stallguard parameters
|
///Stallguard parameters
|
||||||
uint32_t tmc2130_coolConf = (((uint32_t)params.sg_thrs) << 16U);
|
SetSGTHRS(params, mps::AxisSGTHRS::get((mm::Axis)params.axis));
|
||||||
WriteRegister(params, Registers::COOLCONF, tmc2130_coolConf);
|
|
||||||
WriteRegister(params, Registers::TCOOLTHRS, config::tmc2130_coolStepThreshold);
|
WriteRegister(params, Registers::TCOOLTHRS, config::tmc2130_coolStepThreshold);
|
||||||
|
|
||||||
///Write stealth mode config and setup diag0 output
|
///Write stealth mode config and setup diag0 output
|
||||||
|
|
@ -80,6 +79,11 @@ void TMC2130::SetCurrents(const MotorParams ¶ms, const MotorCurrents ¤
|
||||||
WriteRegister(params, Registers::IHOLD_IRUN, ihold_irun);
|
WriteRegister(params, Registers::IHOLD_IRUN, ihold_irun);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TMC2130::SetSGTHRS(const MotorParams ¶ms, uint8_t sgthrs) {
|
||||||
|
uint32_t tmc2130_coolConf = (((uint32_t)sgthrs) << 16U);
|
||||||
|
WriteRegister(params, Registers::COOLCONF, tmc2130_coolConf);
|
||||||
|
}
|
||||||
|
|
||||||
void TMC2130::SetEnabled(const MotorParams ¶ms, bool enabled) {
|
void TMC2130::SetEnabled(const MotorParams ¶ms, bool enabled) {
|
||||||
hal::shr16::shr16.SetTMCEnabled(params.idx, enabled);
|
hal::shr16::shr16.SetTMCEnabled(params.idx, enabled);
|
||||||
if (this->enabled != enabled)
|
if (this->enabled != enabled)
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ struct MotorParams {
|
||||||
gpio::GPIO_pin sgPin; ///< stallguard pin
|
gpio::GPIO_pin sgPin; ///< stallguard pin
|
||||||
config::MRes mRes; ///< microstep resolution
|
config::MRes mRes; ///< microstep resolution
|
||||||
int8_t sg_thrs;
|
int8_t sg_thrs;
|
||||||
|
uint8_t axis;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct MotorCurrents {
|
struct MotorCurrents {
|
||||||
|
|
@ -91,6 +92,9 @@ public:
|
||||||
/// Set the current motor currents
|
/// Set the current motor currents
|
||||||
void SetCurrents(const MotorParams ¶ms, const MotorCurrents ¤ts);
|
void SetCurrents(const MotorParams ¶ms, const MotorCurrents ¤ts);
|
||||||
|
|
||||||
|
/// Set stallguard threshold
|
||||||
|
void SetSGTHRS(const MotorParams ¶ms, uint8_t sgthrs);
|
||||||
|
|
||||||
/// Return enabled state
|
/// Return enabled state
|
||||||
const bool Enabled() const {
|
const bool Enabled() const {
|
||||||
return enabled;
|
return enabled;
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ static AxisParams axisParams[NUM_AXIS] = {
|
||||||
// Pulley
|
// Pulley
|
||||||
{
|
{
|
||||||
.name = 'P',
|
.name = 'P',
|
||||||
.params = { .spi = hal::spi::TmcSpiBus, .idx = Pulley, .dirOn = config::pulley.dirOn, .csPin = PULLEY_CS_PIN, .stepPin = PULLEY_STEP_PIN, .sgPin = PULLEY_SG_PIN, .mRes = config::pulley.mRes, .sg_thrs = config::pulley.sg_thrs },
|
.params = { .spi = hal::spi::TmcSpiBus, .idx = Pulley, .dirOn = config::pulley.dirOn, .csPin = PULLEY_CS_PIN, .stepPin = PULLEY_STEP_PIN, .sgPin = PULLEY_SG_PIN, .mRes = config::pulley.mRes, .sg_thrs = config::pulley.sg_thrs, Axis::Pulley },
|
||||||
.currents = { .vSense = config::pulley.vSense, .iRun = config::pulley.iRun, .iHold = config::pulley.iHold },
|
.currents = { .vSense = config::pulley.vSense, .iRun = config::pulley.iRun, .iHold = config::pulley.iHold },
|
||||||
.mode = DefaultMotorMode(config::pulley),
|
.mode = DefaultMotorMode(config::pulley),
|
||||||
.jerk = unitToSteps<P_speed_t>(config::pulleyLimits.jerk),
|
.jerk = unitToSteps<P_speed_t>(config::pulleyLimits.jerk),
|
||||||
|
|
@ -51,7 +51,7 @@ static AxisParams axisParams[NUM_AXIS] = {
|
||||||
// Selector
|
// Selector
|
||||||
{
|
{
|
||||||
.name = 'S',
|
.name = 'S',
|
||||||
.params = { .spi = hal::spi::TmcSpiBus, .idx = Selector, .dirOn = config::selector.dirOn, .csPin = SELECTOR_CS_PIN, .stepPin = SELECTOR_STEP_PIN, .sgPin = SELECTOR_SG_PIN, .mRes = config::selector.mRes, .sg_thrs = config::selector.sg_thrs },
|
.params = { .spi = hal::spi::TmcSpiBus, .idx = Selector, .dirOn = config::selector.dirOn, .csPin = SELECTOR_CS_PIN, .stepPin = SELECTOR_STEP_PIN, .sgPin = SELECTOR_SG_PIN, .mRes = config::selector.mRes, .sg_thrs = config::selector.sg_thrs, Axis::Selector },
|
||||||
.currents = { .vSense = config::selector.vSense, .iRun = config::selector.iRun, .iHold = config::selector.iHold },
|
.currents = { .vSense = config::selector.vSense, .iRun = config::selector.iRun, .iHold = config::selector.iHold },
|
||||||
.mode = DefaultMotorMode(config::selector),
|
.mode = DefaultMotorMode(config::selector),
|
||||||
.jerk = unitToSteps<S_speed_t>(config::selectorLimits.jerk),
|
.jerk = unitToSteps<S_speed_t>(config::selectorLimits.jerk),
|
||||||
|
|
@ -60,7 +60,7 @@ static AxisParams axisParams[NUM_AXIS] = {
|
||||||
// Idler
|
// Idler
|
||||||
{
|
{
|
||||||
.name = 'I',
|
.name = 'I',
|
||||||
.params = { .spi = hal::spi::TmcSpiBus, .idx = Idler, .dirOn = config::idler.dirOn, .csPin = IDLER_CS_PIN, .stepPin = IDLER_STEP_PIN, .sgPin = IDLER_SG_PIN, .mRes = config::idler.mRes, .sg_thrs = config::idler.sg_thrs },
|
.params = { .spi = hal::spi::TmcSpiBus, .idx = Idler, .dirOn = config::idler.dirOn, .csPin = IDLER_CS_PIN, .stepPin = IDLER_STEP_PIN, .sgPin = IDLER_SG_PIN, .mRes = config::idler.mRes, .sg_thrs = config::idler.sg_thrs, Axis::Idler },
|
||||||
.currents = { .vSense = config::idler.vSense, .iRun = config::idler.iRun, .iHold = config::idler.iHold },
|
.currents = { .vSense = config::idler.vSense, .iRun = config::idler.iRun, .iHold = config::idler.iHold },
|
||||||
.mode = DefaultMotorMode(config::idler),
|
.mode = DefaultMotorMode(config::idler),
|
||||||
.jerk = unitToSteps<I_speed_t>(config::idlerLimits.jerk),
|
.jerk = unitToSteps<I_speed_t>(config::idlerLimits.jerk),
|
||||||
|
|
@ -336,7 +336,7 @@ public:
|
||||||
void AbortPlannedMoves(bool halt = true);
|
void AbortPlannedMoves(bool halt = true);
|
||||||
|
|
||||||
/// @returns the TMC213 driver associated with the particular axis
|
/// @returns the TMC213 driver associated with the particular axis
|
||||||
inline const hal::tmc2130::TMC2130 &DriverForAxis(Axis axis) const {
|
inline hal::tmc2130::TMC2130 &DriverForAxis(Axis axis) {
|
||||||
return axisData[axis].drv;
|
return axisData[axis].drv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ struct eeprom_t {
|
||||||
uint8_t eepromFilament[800]; ///< Top nibble status, bottom nibble last filament loaded
|
uint8_t eepromFilament[800]; ///< Top nibble status, bottom nibble last filament loaded
|
||||||
uint8_t eepromDriveErrorCountH;
|
uint8_t eepromDriveErrorCountH;
|
||||||
uint8_t eepromDriveErrorCountL[2];
|
uint8_t eepromDriveErrorCountL[2];
|
||||||
|
uint8_t sg_thrs[3];
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
static_assert(sizeof(eeprom_t) - 2 <= hal::eeprom::EEPROM::End(), "eeprom_t doesn't fit into EEPROM available.");
|
static_assert(sizeof(eeprom_t) - 2 <= hal::eeprom::EEPROM::End(), "eeprom_t doesn't fit into EEPROM available.");
|
||||||
|
|
@ -359,5 +360,16 @@ void DriveError::setH(uint8_t highByte) {
|
||||||
ee::EEPROM::UpdateByte(EEOFFSET(eepromBase->eepromDriveErrorCountH), highByte - 1);
|
ee::EEPROM::UpdateByte(EEOFFSET(eepromBase->eepromDriveErrorCountH), highByte - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t AxisSGTHRS::get(mm::Axis axis) {
|
||||||
|
uint8_t sg_thrs = ee::EEPROM::ReadByte(EEOFFSET(eepromBase->sg_thrs[axis]));
|
||||||
|
if (sg_thrs & 0x80)
|
||||||
|
sg_thrs = mm::axisParams[axis].params.sg_thrs;
|
||||||
|
return sg_thrs;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AxisSGTHRS::set(mm::Axis axis, uint8_t val) {
|
||||||
|
ee::EEPROM::UpdateByte(EEOFFSET(eepromBase->sg_thrs[axis]), val);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace permanent_storage
|
} // namespace permanent_storage
|
||||||
} // namespace modules
|
} // namespace modules
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
/// @file permanent_storage.h
|
/// @file permanent_storage.h
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "../hal/eeprom.h"
|
#include "../hal/eeprom.h"
|
||||||
|
#include "motion.h"
|
||||||
|
|
||||||
namespace modules {
|
namespace modules {
|
||||||
|
|
||||||
|
|
@ -98,6 +99,16 @@ private:
|
||||||
static void setH(uint8_t highByte);
|
static void setH(uint8_t highByte);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// @brief Read and increment drive errors
|
||||||
|
///
|
||||||
|
/// (Motor power rail voltage loss)
|
||||||
|
class AxisSGTHRS {
|
||||||
|
public:
|
||||||
|
static uint8_t get(mm::Axis axis);
|
||||||
|
static void set(mm::Axis axis, uint8_t val);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
} // namespace permanent_storage
|
} // namespace permanent_storage
|
||||||
} // namespace modules
|
} // namespace modules
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@
|
||||||
#include "modules/idler.h"
|
#include "modules/idler.h"
|
||||||
#include "modules/pulley.h"
|
#include "modules/pulley.h"
|
||||||
#include "modules/selector.h"
|
#include "modules/selector.h"
|
||||||
|
#include "modules/permanent_storage.h"
|
||||||
|
|
||||||
/** @defgroup register_table Register Table
|
/** @defgroup register_table Register Table
|
||||||
*
|
*
|
||||||
|
|
@ -145,9 +146,9 @@
|
||||||
| 0x14h 20 | uint16 | Pulley_slow_feedrate | 0000h 0 | 0014h 20 | unit mm/s | Read / Write | M707 A0x14 | M708 A0x14 Xnnnn
|
| 0x14h 20 | uint16 | Pulley_slow_feedrate | 0000h 0 | 0014h 20 | unit mm/s | Read / Write | M707 A0x14 | M708 A0x14 Xnnnn
|
||||||
| 0x15h 21 | uint16 | Selector_homing_feedrate | 0000h 0 | 001eh 30 | unit mm/s | Read (Write) | M707 A0x15 | (M708 A0x15 Xnnnn)
|
| 0x15h 21 | uint16 | Selector_homing_feedrate | 0000h 0 | 001eh 30 | unit mm/s | Read (Write) | M707 A0x15 | (M708 A0x15 Xnnnn)
|
||||||
| 0x16h 22 | uint16 | Idler_homing_feedrate | 0000h 0 | 0109h 265 | unit deg/s | Read (Write) | M707 A0x16 | (M708 A0x16 Xnnnn)
|
| 0x16h 22 | uint16 | Idler_homing_feedrate | 0000h 0 | 0109h 265 | unit deg/s | Read (Write) | M707 A0x16 | (M708 A0x16 Xnnnn)
|
||||||
| 0x17h 23 | uint16 | Pulley_sg_thrs__R | 0000h 0 | 0008h 8 | | Read (Write) | M707 A0x17 | (M708 A0x17 Xnnnn)
|
| 0x17h 23 | uint8 | Pulley_sg_thrs__R | 00h 0 | 08h 8 | | Read (Write) | M707 A0x17 | M708 A0x17 Xnn
|
||||||
| 0x18h 24 | uint16 | Selector_sg_thrs_R | 0000h 0 | 0003h 3 | | Read (Write) | M707 A0x18 | (M708 A0x18 Xnnnn)
|
| 0x18h 24 | uint8 | Selector_sg_thrs_R | 00h 0 | 03h 3 | | Read (Write) | M707 A0x18 | M708 A0x18 Xnn
|
||||||
| 0x19h 25 | uint16 | Idler_sg_thrs_R | 0000h 0 | 0005h 5 | | Read (Write) | M707 A0x19 | (M708 A0x19 Xnnnn)
|
| 0x19h 25 | uint8 | Idler_sg_thrs_R | 00h 0 | 05h 6 | | Read (Write) | M707 A0x19 | M708 A0x19 Xnn
|
||||||
| 0x1ah 26 | uint16 | Get Pulley position | 0000h 0 | ffffh 65535 | unit mm | Read only | M707 A0x1a | N/A
|
| 0x1ah 26 | uint16 | Get Pulley position | 0000h 0 | ffffh 65535 | unit mm | Read only | M707 A0x1a | N/A
|
||||||
| 0x1bh 27 | uint16 | Set/Get_Selector_slot | 0000h 0 | ffffh 65535 | unit slot [0-4/5] 5=park pos | Read / Write | M707 A0x1b | M708 A0x1b Xn
|
| 0x1bh 27 | uint16 | Set/Get_Selector_slot | 0000h 0 | ffffh 65535 | unit slot [0-4/5] 5=park pos | Read / Write | M707 A0x1b | M708 A0x1b Xn
|
||||||
| 0x1ch 28 | uint16 | Set/Get_Idler_slot | 0000h 0 | ffffh 65535 | unit slot [0-4/5] 5=disengaged | Read / Write | M707 A0x1c | M708 A0x1c Xn
|
| 0x1ch 28 | uint16 | Set/Get_Idler_slot | 0000h 0 | ffffh 65535 | unit slot [0-4/5] 5=disengaged | Read / Write | M707 A0x1c | M708 A0x1c Xn
|
||||||
|
|
@ -333,19 +334,19 @@ static const RegisterRec registers[] /*PROGMEM*/ = {
|
||||||
|
|
||||||
// 0x17 Pulley sg_thrs threshold RW
|
// 0x17 Pulley sg_thrs threshold RW
|
||||||
RegisterRec(
|
RegisterRec(
|
||||||
[]() -> uint16_t { return config::pulley.sg_thrs; },
|
[]() -> uint16_t { return mps::AxisSGTHRS::get(mm::Axis::Pulley); },
|
||||||
//@@TODO please update documentation as well
|
[](uint16_t d) { mm::motion.DriverForAxis(mm::Axis::Pulley).SetSGTHRS(mm::axisParams[mm::Axis::Pulley].params, d); mps::AxisSGTHRS::set(mm::Axis::Pulley, d); },
|
||||||
2),
|
1),
|
||||||
// 0x18 Selector sg_thrs RW
|
// 0x18 Selector sg_thrs RW
|
||||||
RegisterRec(
|
RegisterRec(
|
||||||
[]() -> uint16_t { return config::selector.sg_thrs; },
|
[]() -> uint16_t { return mps::AxisSGTHRS::get(mm::Axis::Selector); },
|
||||||
//@@TODO please update documentation as well
|
[](uint16_t d) { mm::motion.DriverForAxis(mm::Axis::Selector).SetSGTHRS(mm::axisParams[mm::Axis::Selector].params, d); mps::AxisSGTHRS::set(mm::Axis::Selector, d); },
|
||||||
2),
|
1),
|
||||||
// 0x19 Idler sg_thrs RW
|
// 0x19 Idler sg_thrs RW
|
||||||
RegisterRec(
|
RegisterRec(
|
||||||
[]() -> uint16_t { return config::idler.sg_thrs; },
|
[]() -> uint16_t { return mps::AxisSGTHRS::get(mm::Axis::Idler); },
|
||||||
//@@TODO please update documentation as well
|
[](uint16_t d) { mm::motion.DriverForAxis(mm::Axis::Idler).SetSGTHRS(mm::axisParams[mm::Axis::Idler].params, d); mps::AxisSGTHRS::set(mm::Axis::Idler, d); },
|
||||||
2),
|
1),
|
||||||
|
|
||||||
// 0x1a Get Pulley position [mm] R
|
// 0x1a Get Pulley position [mm] R
|
||||||
RegisterRec(
|
RegisterRec(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue