uStepper
uStepper.h
Go to the documentation of this file.
1 /********************************************************************************************
2 * File: uStepper.h *
3 * Version: 1.2.3 *
4 * date: July 27th, 2017 *
5 * Author: Thomas Hørring Olsen *
6 * *
7 *********************************************************************************************
8 * (C) 2016 *
9 * *
10 * ON Development IVS *
11 * www.on-development.com *
12 * administration@on-development.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 ON Development IVS nor the author, can be held responsible for any damage *
20 * caused by the use of the code contained in this file ! *
21 * *
22 ********************************************************************************************/
192 #ifndef _USTEPPER_H_
193 #define _USTEPPER_H_
194 
195 #ifndef __AVR_ATmega328P__
196 #error !!This library only supports the ATmega328p MCU!!
197 #endif
198 
199 #include <inttypes.h>
200 #include <avr/io.h>
201 #include <avr/delay.h>
202 #include <Arduino.h>
203 #include <uStepperServo.h>
204 
206 #define FULL 1
207 
208 #define HALF 2
209 
210 #define QUARTER 4
211 
212 #define EIGHT 8
213 
214 #define SIXTEEN 16
215 
216 #define NORMAL 0
217 
218 #define PWM 1
219 
220 #define DROPIN 1
221 
222 #define PID 2
223 
225 #define STOP 1
226 
227 #define ACCEL 2
228 
229 #define CRUISE 4
230 
231 #define DECEL 8
232 
233 #define INITDECEL 16
234 
235 #define INTFREQ 28200.0f
236 
237 #define INTPERIOD 1000000.0/INTFREQ
238 
239 #define INTPIDDELAYCONSTANT 0.028199994
240 
241 #define CW 0
242 
243 #define CCW 1
244 
245 #define HARD 1
246 
247 #define SOFT 0
248 
250 #define ENCODERINTFREQ 1000.0
251 
252 #define ENCODERSPEEDCONSTANT ENCODERINTFREQ/10.0/4096.0
253 
254 #define ENCODERADDR 0x36
255 
256 #define ANGLE 0x0E
257 
258 #define STATUS 0x0B
259 
260 #define AGC 0x1A
261 
262 #define MAGNITUDE 0x1B
263 
265 #define R 4700.0
266 
268 #define I2CFREE 0
269 
271 #define READ 1
272 
274 #define WRITE 0
275 
277 #define START 0x08
278 
280 #define REPSTART 0x10
281 
283 #define TXADDRACK 0x18
284 
286 #define TXDATAACK 0x28
287 
289 #define RXADDRACK 0x40
290 
292 #define ACK 1
293 
295 #define NACK 0
296 
314 #define A 0.001295752996237
315 
316 #define B 0.000237488365866
317 
318 #define C 0.000000083423218
319 
326 extern "C" void interrupt0(void);
327 
334 extern "C" void interrupt1(void);
335 
346 extern "C" void TIMER2_COMPA_vect(void) __attribute__ ((signal,naked,used));
347 
356 extern "C" void TIMER1_COMPA_vect(void) __attribute__ ((signal,used));
357 
358 class float2
359 {
360  public:
361  float2(void);
362  float getFloatValue(void);
363  uint64_t getRawValue(void);
364  void setValue(float val);
365  float2 & operator=(const float &value);
366  bool operator==(const float2 &value);
367  bool operator!=(const float2 &value);
368  bool operator>=(const float2 &value);
369  bool operator<=(const float2 &value);
370  bool operator<=(const float &value);
371  bool operator<(const float2 &value);
372  bool operator>(const float2 &value);
373  float2 & operator*=(const float2 &value);
374  float2 & operator-=(const float2 &value);
375  float2 & operator+=(const float2 &value);
376  float2 & operator+=(const float &value);
377  float2 & operator/=(const float2 &value);
378  const float2 operator+(const float2 &value);
379  const float2 operator-(const float2 &value);
380  const float2 operator*(const float2 &value);
381  const float2 operator/(const float2 &value);
382  uint64_t value;
383 
384  private:
385  friend void TIMER2_COMPA_vect(void) __attribute__ ((signal,used));
386 
387 };
388 
399 {
400 public:
401 
414  uStepperTemp(void);
415 
428  float getTemp(void);
429 private:
430 };
431 
442 {
443 public:
446  volatile int32_t angleMoved;
447 
449  uint16_t encoderOffset;
450 
454  volatile uint16_t oldAngle;
455 
458  volatile uint16_t angle;
459 
463  volatile int16_t revolutions;
464 
467  volatile float curSpeed;
473  uStepperEncoder(void);
474 
487  float getAngle(void);
488 
499  float getSpeed(void);
500 
508  uint16_t getStrength(void);
509 
519  uint8_t getAgc(void);
520 
531  uint8_t detectMagnet(void);
532 
549  float getAngleMoved(void);
550 
559  void setup(uint8_t mode);
560 
567  void setHome(void);
568 
569 private:
570 
571  friend void TIMER1_COMPA_vect(void) __attribute__ ((signal,used));
572 };
573 
582 class uStepper
583 {
584 private:
585  //Address offset: 0
587  uint16_t cruiseDelay;
588 
589  //Address offset: 2
594 
595  //Address offset: 10
599  uint8_t state;
600 
601  //Address offset: 11
604  uint32_t accelSteps;
605 
606  //Address offset: 15
609  uint32_t decelSteps;
610 
611  //Address offset: 19
614  uint32_t initialDecelSteps;
615 
616  //Address offset: 23
619  uint32_t cruiseSteps;
620 
621  //Address offset: 27
624  uint32_t currentStep;
625 
626  //Address offset: 31
629  uint32_t totalSteps;
630 
631  //Address offset: 35
635  bool continous;
636 
637  //Address offset: 36
642  bool hold;
643 
644  //Address offset: 37
647  bool direction;
648 
649  //Address offset: 38
655  volatile int32_t stepsSinceReset;
656 
659  int32_t dummy;
660 
661  //Address offset: 46
666 
667  //Address offset: 54
675  uint16_t delay;
676 
677  //Address offset: 56
679  bool dropIn;
680 
681  //Address offset: 57
686  float velocity;
687 
688  //Address offset: 61
695  float acceleration;
696 
697  //address offset: 65
700  volatile float tolerance;
701 
702  //address offset: 69
705  volatile float hysteresis;
706 
707  //address offset: 73
710  volatile float stepConversion;
711 
712  //address offset: 77
715  volatile uint16_t counter;
716 
717  //address offset: 79
720  volatile int32_t stepCnt;
721 
722  //address offset: 83
725  volatile int32_t control;
726 
727  //address offset: 87
730  volatile uint32_t speedValue[2];
731 
732  //address offset: 95
735  float pTerm;
736 
737  //address offset: 99
739  float iTerm;
740 
741  //address offset: 103
744  float dTerm;
745 
746  //address offset: 107
749  uint8_t mode;
750 
753  float angleToStep;
754 
755  friend void TIMER2_COMPA_vect(void) __attribute__ ((signal,naked,used));
756  friend void TIMER1_COMPA_vect(void) __attribute__ ((signal,used));
757  friend void interrupt1(void);
758  friend void uStepperEncoder::setHome(void);
759 
768  void startTimer(void);
769 
770 
779  void stopTimer(void);
780 
781 
791  void enableMotor(void);
792 
793 
801  void disableMotor(void);
802 
807  void pidDropIn(void);
808 
813  void pid(void);
814 
815 public:
820 
835  uStepper(float accel, float vel);
836 
837 
846  uStepper(void);
847 
848 
860  void setMaxAcceleration(float accel);
861 
862 
871  float getMaxAcceleration(void);
872 
873 
884  void setMaxVelocity(float vel);
885 
886 
896  float getMaxVelocity(void);
897 
898 
911  void runContinous(bool dir);
912 
913 
931  void moveSteps(int32_t steps, bool dir, bool holdMode);
932 
933 
947  void hardStop(bool holdMode);
948 
949 
964  void softStop(bool holdMode);
965 
966 
1003  void setup( uint8_t mode = NORMAL,
1004  uint8_t microStepping = SIXTEEN,
1005  float faultTolerance = 10.0,
1006  float faultHysteresis = 5.0,
1007  float pTerm = 1.0,
1008  float iTerm = 0.02,
1009  float dterm = 0.006,
1010  bool setHome = true);
1011 
1022  bool getCurrentDirection(void);
1023 
1024 
1034  bool getMotorState(void);
1035 
1036 
1058  int32_t getStepsSinceReset(void);
1059 
1071  void pwmD8(double duty);
1072 
1082  void setCurrent(double current);
1083 
1092  void pwmD8(int mode);
1093 
1105  void pwmD3(double duty);
1106 
1107 
1116  void pwmD3(int mode);
1117 
1127  void updateSetPoint(float setPoint);
1128 
1139  void moveToAngle(float angle, bool holdMode);
1140 
1150  void moveAngle(float angle, bool holdMode);
1151 };
1152 
1175 {
1176  private:
1178  uint8_t status;
1179 
1180 
1189  bool cmd(uint8_t cmd);
1190 
1191  public:
1192 
1202  i2cMaster(void);
1203 
1221  bool readByte(bool ack, uint8_t *data);
1222 
1244  bool read(uint8_t slaveAddr, uint8_t regAddr, uint8_t numOfBytes, uint8_t *data);
1245 
1263  bool start(uint8_t addr, bool RW);
1264 
1282  bool restart(uint8_t addr, bool RW);
1283 
1294  bool writeByte(uint8_t data);
1295 
1316  bool write(uint8_t slaveAddr, uint8_t regAddr, uint8_t numOfBytes, uint8_t *data);
1317 
1328  bool stop(void);
1329 
1338  uint8_t getStatus(void);
1339 
1347  void begin(void);
1348 };
1350 extern i2cMaster I2C;
1351 
1352 #endif
void interrupt0(void)
Used by dropin feature to take in step pulses.
Definition: uStepper.cpp:115
uint32_t currentStep
Definition: uStepper.h:624
Prototype of class for the temperature sensor.
Definition: uStepper.h:398
void TIMER1_COMPA_vect(void) __attribute__((signal
Measures angle and speed of motor.
Definition: uStepper.cpp:271
volatile uint16_t counter
Definition: uStepper.h:715
float angleToStep
Definition: uStepper.h:753
friend void TIMER2_COMPA_vect(void) __attribute__((signal
Used to apply step pulses to the motor.
Definition: uStepper.cpp:128
volatile int32_t stepCnt
Definition: uStepper.h:720
float2 multiplier
Definition: uStepper.h:593
float acceleration
Definition: uStepper.h:695
bool continous
Definition: uStepper.h:635
Prototype of class for accessing all features of the uStepper in a single object. ...
Definition: uStepper.h:582
i2cMaster I2C
Definition: uStepper.cpp:78
void TIMER2_COMPA_vect(void) __attribute__((signal
Used to apply step pulses to the motor.
Definition: uStepper.cpp:128
volatile float curSpeed
Definition: uStepper.h:467
bool dropIn
Definition: uStepper.h:679
uint32_t cruiseSteps
Definition: uStepper.h:619
uint32_t totalSteps
Definition: uStepper.h:629
uint32_t accelSteps
Definition: uStepper.h:604
float iTerm
Definition: uStepper.h:739
uStepperTemp temp
Definition: uStepper.h:817
uint8_t status
Definition: uStepper.h:1178
volatile int32_t stepsSinceReset
Definition: uStepper.h:655
uint8_t mode
Definition: uStepper.h:749
volatile int32_t angleMoved
Definition: uStepper.h:446
uStepperEncoder encoder
Definition: uStepper.h:819
volatile float tolerance
Definition: uStepper.h:700
volatile uint16_t oldAngle
Definition: uStepper.h:454
float pTerm
Definition: uStepper.h:735
Prototype of class for accessing the TWI (I2C) interface of the AVR (master mode only).
Definition: uStepper.h:1174
volatile int32_t control
Definition: uStepper.h:725
Prototype of class for the AS5600 encoder.
Definition: uStepper.h:441
volatile float hysteresis
Definition: uStepper.h:705
void setHome(void)
Define new reference(home) position.
Definition: uStepper.cpp:717
volatile uint16_t angle
Definition: uStepper.h:458
volatile int16_t revolutions
Definition: uStepper.h:463
uint16_t cruiseDelay
Definition: uStepper.h:587
#define NORMAL
Definition: uStepper.h:216
void interrupt1(void)
Used by dropin feature to take in enable signal.
Definition: uStepper.cpp:82
uint16_t encoderOffset
Definition: uStepper.h:449
#define SIXTEEN
Definition: uStepper.h:214
float velocity
Definition: uStepper.h:686
float2 exactDelay
Definition: uStepper.h:665
float dTerm
Definition: uStepper.h:744
Function prototypes and definitions for the uStepper Servo library.
uint8_t state
Definition: uStepper.h:599
volatile float stepConversion
Definition: uStepper.h:710
uint16_t delay
Definition: uStepper.h:675
uint32_t decelSteps
Definition: uStepper.h:609
bool direction
Definition: uStepper.h:647
int32_t dummy
Definition: uStepper.h:659
bool hold
Definition: uStepper.h:642
uint32_t initialDecelSteps
Definition: uStepper.h:614