uStepper S
uStepperS.h
Go to the documentation of this file.
1 /********************************************************************************************
2 * File: uStepperS.h *
3 * Version: 2.1.0 *
4 * Date: July 11th, 2020 *
5 * Author: Thomas Hørring Olsen *
6 * *
7 *********************************************************************************************
8 * (C) 2020 *
9 * *
10 * uStepper ApS *
11 * www.ustepper.com *
12 * administration@ustepper.com *
13 * *
14 * The code contained in this file is released under the following open source license: *
15 * *
16 * Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International *
17 * *
18 * The code in this file is provided without warranty of any kind - use at own risk! *
19 * neither uStepper ApS nor the author, can be held responsible for any damage *
20 * caused by the use of the code contained in this file ! *
21 * *
22 ********************************************************************************************/
137 #ifndef _USTEPPER_S_H_
138 #define _USTEPPER_S_H_
139 
140 #ifndef ARDUINO_AVR_USTEPPER_S
141  #error !!This library only supports the uStepper S board!!
142 #endif
143 
144 #ifndef __AVR_ATmega328PB__
145  #error !!This library only supports the ATmega328PB MCU!!
146 #endif
147 
148 #include <avr/io.h>
149 #include <avr/interrupt.h>
150 #include <Arduino.h>
151 #include <EEPROM.h>
152 #include <inttypes.h>
153 #include <uStepperServo.h>
154 
155 #define FREEWHEELBRAKE 0
156 #define COOLBRAKE 1
157 #define HARDBRAKE 2
159 #define CW 1
160 #define CCW 0
162 #define POSITION_REACHED 0x20
163 #define VELOCITY_REACHED 0x10
164 #define STANDSTILL 0x08
165 #define STALLGUARD2 0x04
171 typedef union
172 {
173  float f;
174  uint8_t bytes[4];
175 }floatBytes_t;
176 
185 typedef struct
186 {
190  uint8_t invert;
191  uint8_t holdCurrent;
192  uint8_t runCurrent;
193  uint8_t checksum;
195 
201 typedef struct
202 {
203  float posError = 0.0;
204  float posEst = 0.0;
205  float velIntegrator = 0.0;
206  float velEst = 0.0;
207 }posFilter_t;
208 
209 
210 class uStepperS;
211 #include <uStepperEncoder.h>
212 #include <uStepperDriver.h>
213 
214 #define HARD 0
215 #define SOFT 1
217 #define DRV_ENN PD4
218 #define SD_MODE PD5
219 #define SPI_MODE PD6
221 #define CS_DRIVER PE2
222 #define CS_ENCODER PD7
224 #define MOSI1 PE3
225 #define MOSI_ENC PC2
226 #define MISO1 PC0
227 #define SCK1 PC1
230 #define NORMAL 0
231 #define DROPIN 1
232 #define CLOSEDLOOP 2
233 #define PID CLOSEDLOOP
235 #define CLOCKFREQ 16000000.0
241 #define ENCODERINTFREQ 1000
242 #define ENCODERINTPERIOD 1.0/ENCODERINTFREQ
243 #define PULSEFILTERKP 120.0
244 #define PULSEFILTERKI 1900.0*ENCODERINTPERIOD
251 extern "C" void TIMER1_COMPA_vect(void) __attribute__ ((signal,used));
252 
259 void interrupt0(void);
260 
267 void interrupt1(void);
268 
269 
278 {
279 
280 friend class uStepperDriver;
281 friend class uStepperEncoder;
282 friend void interrupt0(void);
283 friend void TIMER1_COMPA_vect(void) __attribute__ ((signal,used));
284 public:
285 
288 
291 
295  uStepperS();
296 
300  uStepperS(float acceleration, float velocity);
301 
305  void init( void );
306 
342  void setup( uint8_t mode = NORMAL,
343  uint16_t stepsPerRevolution = 200,
344  float pTerm = 10.0,
345  float iTerm = 0.0,
346  float dTerm = 0.0,
347  uint16_t dropinStepSize = 16,
348  bool setHome = true,
349  uint8_t invert = 0,
350  uint8_t runCurrent = 50,
351  uint8_t holdCurrent = 30);
352 
361  void setRPM( float rpm );
362 
371  void setMaxAcceleration ( float acceleration );
372 
381  void setMaxDeceleration ( float deceleration );
382 
391  void setMaxVelocity ( float velocity );
392 
400  void setCurrent( double current );
401 
409  void setHoldCurrent( double current );
410 
425  void moveSteps( int32_t steps );
426 
442  void moveAngle( float angle );
443 
459  void moveToAngle( float angle );
460 
469  void runContinous( bool dir );
470 
476  float angleMoved( void );
477 
493  bool getMotorState(uint8_t statusType = POSITION_REACHED);
494 
505  void stop( bool mode = HARD );
506 
516  void enableStallguard( int8_t threshold = 4, bool stopOnStall = false, float rpm = 10.0);
517 
521  void disableStallguard( void );
522 
526  void clearStall( void );
527 
534  bool isStalled(void);
535 
536 
549  bool isStalled( int8_t threshold );
550 
563  void setBrakeMode( uint8_t mode, float brakeCurrent = 25.0 );
564 
569  void enablePid(void);
570 
575  void disablePid(void);
576 
581  void enableClosedLoop(void);
582 
587  void disableClosedLoop(void);
588 
593  void setControlThreshold(float threshold);
594 
610  float moveToEnd(bool dir, float rpm = 40.0, int8_t threshold = 4);
611 
616  float getPidError(void);
617 
624  void setProportional(float P);
625 
632  void setIntegral(float I);
633 
640  void setDifferential(float D);
641 
648  void invertDropinDir(bool invert);
649 
665  void dropinCli();
666 
673  void parseCommand(String *cmd);
674 
691  void dropinPrintHelp();
692 
700  void checkOrientation(float distance = 10);
701 
702 private:
703 
708  float maxVelocity;
709 
718  float angleToStep;
719 
720  uint16_t microSteps;
721  uint16_t fullSteps;
722  uint16_t dropinStepSize;
723 
724  int32_t stepCnt;
725 
728 
730 
734  volatile uint8_t mode;
735  float pTerm;
737  float iTerm;
738 
739  float dTerm;
740  bool brake;
741  volatile bool pidDisabled;
743  volatile float controlThreshold = 10;
746  volatile bool stall;
747  // SPI functions
748 
749  volatile int32_t pidPositionStepsIssued = 0;
750  volatile float currentPidError;
751 
753  int8_t stallThreshold = 4;
754 
756  bool stallStop = false;
757 
759  bool stallEnabled = false;
760 
762  volatile bool shaftDir = 0;
763 
764  uint8_t SPI( uint8_t data );
765 
766  void setSPIMode( uint8_t mode );
767 
768  void chipSelect( uint8_t pin , bool state );
769 
770  void filterSpeedPos(posFilter_t *filter, int32_t steps);
771 
772  float pid(float error);
773 
775  bool loadDropinSettings(void);
776  void saveDropinSettings(void);
778 };
779 
780 
781 
782 #endif
uStepperS::externalStepInputFilter
volatile posFilter_t externalStepInputFilter
Definition: uStepperS.h:729
uStepperS
Prototype of class for accessing all features of the uStepper S in a single object.
Definition: uStepperS.h:277
uStepperS::dropinStepSize
uint16_t dropinStepSize
Definition: uStepperS.h:722
uStepperDriver
Prototype of class for the TMC5130 Driver.
Definition: uStepperDriver.h:150
dropinCliSettings_t::P
floatBytes_t P
Definition: uStepperS.h:187
uStepperS::stall
volatile bool stall
Definition: uStepperS.h:746
uStepperS::moveSteps
void moveSteps(int32_t steps)
Make the motor perform a predefined number of steps.
Definition: uStepperS.cpp:256
uStepperS::getMotorState
bool getMotorState(uint8_t statusType=POSITION_REACHED)
Get the current motor driver state.
Definition: uStepperS.cpp:83
uStepperEncoder::angle
volatile uint16_t angle
Definition: uStepperEncoder.h:208
uStepperS::stallEnabled
bool stallEnabled
Definition: uStepperS.h:759
uStepperS::setBrakeMode
void setBrakeMode(uint8_t mode, float brakeCurrent=25.0)
Definition: uStepperS.cpp:348
uStepperS::TIMER1_COMPA_vect
friend void TIMER1_COMPA_vect(void) __attribute__((signal
Interrupt routine for critical tasks.
Definition: uStepperS.cpp:579
uStepperS::chipSelect
void chipSelect(uint8_t pin, bool state)
uStepperS::enableStallguard
void enableStallguard(int8_t threshold=4, bool stopOnStall=false, float rpm=10.0)
Enable TMC5130 StallGuard.
Definition: uStepperS.cpp:306
uStepperS::dTerm
float dTerm
Definition: uStepperS.h:739
uStepperS::rpmToVelocity
float rpmToVelocity
Definition: uStepperS.h:717
dropinCliSettings_t
Struct to store dropin settings.
Definition: uStepperS.h:185
uStepperS::setSPIMode
void setSPIMode(uint8_t mode)
Definition: uStepperS.cpp:386
uStepperS::disableStallguard
void disableStallguard(void)
Disables the builtin stallguard offered from TMC5130, and reenables StealthChop.
Definition: uStepperS.cpp:317
dropinCliSettings_t::D
floatBytes_t D
Definition: uStepperS.h:189
uStepperS::runContinous
void runContinous(bool dir)
Make the motor rotate continuously.
Definition: uStepperS.cpp:473
floatBytes_t
Union to easily split a float into its binary representation.
Definition: uStepperS.h:171
uStepperS::disablePid
void disablePid(void)
This method disables the PID until calling enablePid.
Definition: uStepperS.cpp:633
uStepperS::fullSteps
uint16_t fullSteps
Definition: uStepperS.h:721
uStepperS::pTerm
float pTerm
Definition: uStepperS.h:735
uStepperS::maxAcceleration
float maxAcceleration
Definition: uStepperS.h:714
uStepperS::brake
bool brake
Definition: uStepperS.h:740
uStepperS::isStalled
bool isStalled(void)
This method returns a bool variable indicating wether the motor is stalled or not....
Definition: uStepperS.cpp:329
uStepperS::stepsPerSecondToRPM
float stepsPerSecondToRPM
Definition: uStepperS.h:726
uStepperS::dropinCli
void dropinCli()
This method is used to tune Drop-in parameters. After tuning uStepper S, the parameters are saved in ...
Definition: uStepperS.cpp:1177
uStepperDriver.h
Function prototypes and definitions for the TMC5130 motor driver.
uStepperS::stepCnt
int32_t stepCnt
Definition: uStepperS.h:724
uStepperS::controlThreshold
volatile float controlThreshold
Definition: uStepperS.h:743
uStepperS::stop
void stop(bool mode=HARD)
Stop the motor.
Definition: uStepperS.cpp:491
uStepperS::encoder
uStepperEncoder encoder
Definition: uStepperS.h:290
interrupt1
void interrupt1(void)
Used by dropin feature to take in enable signal.
Definition: uStepperS.cpp:532
uStepperS::filterSpeedPos
void filterSpeedPos(posFilter_t *filter, int32_t steps)
Definition: uStepperS.cpp:508
uStepperS::getPidError
float getPidError(void)
This method returns the current PID error.
Definition: uStepperS.cpp:681
dropinCliSettings_t::checksum
uint8_t checksum
Definition: uStepperS.h:193
NORMAL
#define NORMAL
Definition: uStepperS.h:230
uStepperS::setRPM
void setRPM(float rpm)
Set the velocity in rpm.
Definition: uStepperS.cpp:369
interrupt0
void interrupt0(void)
Used by dropin feature to take in step pulses.
Definition: uStepperS.cpp:544
uStepperS::disableClosedLoop
void disableClosedLoop(void)
This method disables the closed loop mode until calling enableClosedLoop.
Definition: uStepperS.cpp:645
uStepperS::microSteps
uint16_t microSteps
Definition: uStepperS.h:720
uStepperS::iTerm
float iTerm
Definition: uStepperS.h:737
uStepperS::pidDisabled
volatile bool pidDisabled
Definition: uStepperS.h:741
uStepperS::parseCommand
void parseCommand(String *cmd)
This method is used for the dropinCli to take in user commands.
Definition: uStepperS.cpp:772
floatBytes_t::f
float f
Definition: uStepperS.h:173
uStepperS::moveToEnd
float moveToEnd(bool dir, float rpm=40.0, int8_t threshold=4)
Moves the motor to its physical limit, without limit switch.
Definition: uStepperS.cpp:650
uStepperS::setIntegral
void setIntegral(float I)
This method is used to change the PID integral parameter I.
Definition: uStepperS.cpp:757
uStepperS::RPMToStepsPerSecond
float RPMToStepsPerSecond
Definition: uStepperS.h:727
uStepperS::clearStall
void clearStall(void)
Clear the stallguard, reenabling the motor to return to its previous operation.
Definition: uStepperS.cpp:324
dropinCliSettings_t::invert
uint8_t invert
Definition: uStepperS.h:190
uStepperServo.h
Function prototypes and definitions for the uStepper Servo library.
uStepperS::init
void init(void)
Internal function to prepare the uStepperS in the constructor.
Definition: uStepperS.cpp:58
uStepperS::loadDropinSettings
bool loadDropinSettings(void)
Definition: uStepperS.cpp:1222
uStepperS::setDifferential
void setDifferential(float D)
This method is used to change the PID differential parameter D.
Definition: uStepperS.cpp:762
dropinCliSettings_t::I
floatBytes_t I
Definition: uStepperS.h:188
uStepperS::setMaxVelocity
void setMaxVelocity(float velocity)
Set the maximum velocity of the stepper motor.
Definition: uStepperS.cpp:412
uStepperS::dropinSettingsCalcChecksum
uint8_t dropinSettingsCalcChecksum(dropinCliSettings_t *settings)
Definition: uStepperS.cpp:1250
uStepperS::enableClosedLoop
void enableClosedLoop(void)
This method reenables the closed loop mode after being disabled.
Definition: uStepperS.cpp:640
uStepperS::setup
void setup(uint8_t mode=NORMAL, uint16_t stepsPerRevolution=200, float pTerm=10.0, float iTerm=0.0, float dTerm=0.0, uint16_t dropinStepSize=16, bool setHome=true, uint8_t invert=0, uint8_t runCurrent=50, uint8_t holdCurrent=30)
Initializes the different parts of the uStepper S object.
Definition: uStepperS.cpp:159
uStepperS::interrupt0
friend void interrupt0(void)
Used by dropin feature to take in step pulses.
Definition: uStepperS.cpp:544
dropinCliSettings_t::holdCurrent
uint8_t holdCurrent
Definition: uStepperS.h:191
uStepperS::pid
float pid(float error)
Definition: uStepperS.cpp:686
uStepperS::mode
volatile uint8_t mode
Definition: uStepperS.h:734
uStepperS::angleToStep
float angleToStep
Definition: uStepperS.h:718
uStepperS::stallStop
bool stallStop
Definition: uStepperS.h:756
uStepperS::maxVelocity
float maxVelocity
Definition: uStepperS.h:708
dropinCliSettings_t::runCurrent
uint8_t runCurrent
Definition: uStepperS.h:192
uStepperEncoder
Prototype of class for the AEAT8800-Q24 encoder.
Definition: uStepperEncoder.h:50
uStepperS::saveDropinSettings
void saveDropinSettings(void)
Definition: uStepperS.cpp:1243
uStepperS::setMaxAcceleration
void setMaxAcceleration(float acceleration)
Set the maximum acceleration of the stepper motor.
Definition: uStepperS.cpp:423
uStepperS::angleMoved
float angleMoved(void)
Get the angle moved from reference position in degrees.
Definition: uStepperS.cpp:486
uStepperS::driver
uStepperDriver driver
Definition: uStepperS.h:287
uStepperS::invertDropinDir
void invertDropinDir(bool invert)
This method is used to invert the drop-in direction pin interpretation.
Definition: uStepperS.cpp:767
uStepperS::stallThreshold
int8_t stallThreshold
Definition: uStepperS.h:753
uStepperS::shaftDir
volatile bool shaftDir
Definition: uStepperS.h:762
uStepperEncoder.h
Function prototypes and definitions for the AEAT8800-Q24 Encoder.
uStepperS::currentPidSpeed
float currentPidSpeed
Definition: uStepperS.h:731
uStepperS::moveAngle
void moveAngle(float angle)
Makes the motor rotate a specific angle relative to the current position.
Definition: uStepperS.cpp:271
uStepperEncoder::setHome
void setHome(float initialAngle=0)
Define new reference(home) position.
Definition: uStepperEncoder.cpp:81
uStepperS::dropinSettings
dropinCliSettings_t dropinSettings
Definition: uStepperS.h:774
uStepperS::SPI
uint8_t SPI(uint8_t data)
Definition: uStepperS.cpp:401
posFilter_t
Struct for encoder velocity estimator.
Definition: uStepperS.h:201
uStepperS::checkOrientation
void checkOrientation(float distance=10)
This method is used to check the orientation of the motor connector.
Definition: uStepperS.cpp:93
uStepperS::pidPositionStepsIssued
volatile int32_t pidPositionStepsIssued
Definition: uStepperS.h:749
uStepperS::setHoldCurrent
void setHoldCurrent(double current)
Set motor hold current.
Definition: uStepperS.cpp:459
uStepperS::uStepperS
uStepperS()
Constructor of uStepper class.
Definition: uStepperS.cpp:35
uStepperS::moveToAngle
void moveToAngle(float angle)
Makes the motor rotate to a specific absolute angle.
Definition: uStepperS.cpp:288
uStepperS::dropinPrintHelp
void dropinPrintHelp()
This method is used to print the dropinCli menu explainer:
Definition: uStepperS.cpp:1203
uStepperS::setControlThreshold
void setControlThreshold(float threshold)
This method sets the control threshold for the closed loop position control in microsteps - i....
Definition: uStepperS.cpp:622
uStepperS::currentPidError
volatile float currentPidError
Definition: uStepperS.h:750
POSITION_REACHED
#define POSITION_REACHED
Definition: uStepperS.h:162
uStepperS::used
friend void used
Definition: uStepperS.h:283
uStepperS::maxDeceleration
float maxDeceleration
Definition: uStepperS.h:715
uStepperS::setProportional
void setProportional(float P)
This method is used to change the PID proportional parameter P.
Definition: uStepperS.cpp:752
uStepperS::enablePid
void enablePid(void)
This method reenables the PID after being disabled.
Definition: uStepperS.cpp:626
uStepperS::invertPidDropinDirection
bool invertPidDropinDirection
Definition: uStepperS.h:716
HARD
#define HARD
Definition: uStepperS.h:214
uStepperS::setMaxDeceleration
void setMaxDeceleration(float deceleration)
Set the maximum deceleration of the stepper motor.
Definition: uStepperS.cpp:435
uStepperS::setCurrent
void setCurrent(double current)
Set motor output current.
Definition: uStepperS.cpp:446