diff --git a/src/hal/tmc2130.h b/src/hal/tmc2130.h index 4ac65bd..71b04ae 100644 --- a/src/hal/tmc2130.h +++ b/src/hal/tmc2130.h @@ -1,18 +1,82 @@ #pragma once - -/// TMC2130 interface -/// There are multiple TMC2130 on our board, so there will be multiple instances of this class -/// @@TODO @leptun - design some lightweight TMC2130 interface +#include "../hal/gpio.h" +#include "../hal/shr16.h" namespace hal { -class TMC2130 { +/// TMC2130 interface +/// There are multiple TMC2130 on our board, so there will be multiple +/// instances of this class +/// @@TODO @leptun - design some lightweight TMC2130 interface +namespace tmc2130 { -public: - /// constructor - do some one-time init stuff here - TMC2130(uint8_t id); - /// (re)initialization of the chip - void Init(); +enum MotorMode : uint8_t { + Stealth, + Normal }; +struct MotorParams { + uint8_t idx; ///< SHR16 index + bool dirOn; ///< forward direction + gpio::GPIO_pin csPin; ///< CS pin + gpio::GPIO_pin stepPin; ///< step pin + gpio::GPIO_pin sgPin; ///< stallguard pin + uint8_t uSteps; ///< microstep resolution +}; + +struct MotorCurrents { + uint8_t iRun; ///< Running current + uint8_t iHold; ///< Holding current +}; + +class TMC2130 { + MotorMode mode; + MotorCurrents currents; + +public: + /// constructor + TMC2130(const MotorParams& params, + const MotorCurrents& currents, + MotorMode mode); + + /// (re)initialization of the chip + void Init(const MotorParams& params); + + /// Get/Change the current motor mode + MotorMode Mode() { return mode; } const + void SetMode(MotorMode mode); + + /// Get/Change the current motor currents + const MotorCurrents& Currents() { return currents; } const + void SetCurrents(const MotorCurrents& currents); + + /// Return enabled state + bool Enabled() const; + + /// Enable/Disable the motor + void SetEnabled(const MotorParams& params, bool enabled) + { + hal::shr16::shr16.SetTMCDir(params.idx, enabled); + } + + /// Set direction + void SetDir(const MotorParams& params, bool dir) + { + hal::shr16::shr16.SetTMCDir(params.idx, dir ^ params.dirOn); + } + + /// Step the motor + inline void Step(const MotorParams& params) + { + gpio::TogglePin(params.stepPin); // assumes DEDGE + } + + /// Return SG state + inline bool Stall(const MotorParams& params) + { + return gpio::ReadPin(params.sgPin) == gpio::Level::high; + } +}; + +} // namespace tmc2130 } // namespace hal