uStepper
uStepper.h
Go to the documentation of this file.
1 /********************************************************************************************
2 * File: uStepper.h *
3 * Version: 1.2.2 *
4 * date: April 5, 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 ********************************************************************************************/
183 #ifndef _USTEPPER_H_
184 #define _USTEPPER_H_
185 
186 #ifndef __AVR_ATmega328P__
187 #error !!This library only supports the ATmega328p MCU!!
188 #endif
189 
190 #include <inttypes.h>
191 #include <avr/io.h>
192 #include <Arduino.h>
193 #include <uStepperServo.h>
194 
196 #define FULL 1
197 
198 #define HALF 2
199 
200 #define QUARTER 4
201 
202 #define EIGHT 8
203 
204 #define SIXTEEN 16
205 
206 #define NORMAL 0
207 
208 #define PWM 1
209 
210 #define DROPIN 1
211 
212 #define PID 2
213 
215 #define STOP 1
216 
217 #define ACCEL 2
218 
219 #define CRUISE 4
220 
221 #define DECEL 8
222 
223 #define INITDECEL 16
224 
225 #define INTFREQ 28200.0f
226 
227 #define INTPERIOD 1000000.0/INTFREQ
228 
229 #define INTPIDDELAYCONSTANT 0.028199994
230 
231 #define CW 0
232 
233 #define CCW 1
234 
235 #define HARD 1
236 
237 #define SOFT 0
238 
240 #define ENCODERINTFREQ 1000.0
241 
242 #define ENCODERSPEEDCONSTANT ENCODERINTFREQ/10.0/4096.0
243 
244 #define ENCODERADDR 0x36
245 
246 #define ANGLE 0x0E
247 
248 #define STATUS 0x0B
249 
250 #define AGC 0x1A
251 
252 #define MAGNITUDE 0x1B
253 
255 #define R 4700.0
256 
258 #define I2CFREE 0
259 
261 #define READ 1
262 
264 #define WRITE 0
265 
267 #define START 0x08
268 
270 #define REPSTART 0x10
271 
273 #define TXADDRACK 0x18
274 
276 #define TXDATAACK 0x28
277 
279 #define RXADDRACK 0x40
280 
282 #define ACK 1
283 
285 #define NACK 0
286 
304 #define A 0.001295752996237
305 
306 #define B 0.000237488365866
307 
308 #define C 0.000000083423218
309 
316 extern "C" void interrupt0(void);
317 
324 extern "C" void interrupt1(void);
325 
336 extern "C" void TIMER2_COMPA_vect(void) __attribute__ ((signal,naked,used));
337 
346 extern "C" void TIMER1_COMPA_vect(void) __attribute__ ((signal,used));
347 
348 class float2
349 {
350  public:
351  float2(void);
352  float getFloatValue(void);
353  uint64_t getRawValue(void);
354  void setValue(float val);
355  float2 & operator=(const float &value);
356  bool operator==(const float2 &value);
357  bool operator!=(const float2 &value);
358  bool operator>=(const float2 &value);
359  bool operator<=(const float2 &value);
360  bool operator<=(const float &value);
361  bool operator<(const float2 &value);
362  bool operator>(const float2 &value);
363  float2 & operator*=(const float2 &value);
364  float2 & operator-=(const float2 &value);
365  float2 & operator+=(const float2 &value);
366  float2 & operator+=(const float &value);
367  float2 & operator/=(const float2 &value);
368  const float2 operator+(const float2 &value);
369  const float2 operator-(const float2 &value);
370  const float2 operator*(const float2 &value);
371  const float2 operator/(const float2 &value);
372  uint64_t value;
373 
374  private:
375  friend void TIMER2_COMPA_vect(void) __attribute__ ((signal,used));
376 
377 };
378 
389 {
390 public:
391 
404  uStepperTemp(void);
405 
418  float getTemp(void);
419 private:
420 };
421 
432 {
433 public:
436  volatile int32_t angleMoved;
437 
439  uint16_t encoderOffset;
440 
444  volatile uint16_t oldAngle;
445 
448  volatile uint16_t angle;
449 
453  volatile int16_t revolutions;
454 
457  volatile float curSpeed;
463  uStepperEncoder(void);
464 
477  float getAngle(void);
478 
489  float getSpeed(void);
490 
498  uint16_t getStrength(void);
499 
509  uint8_t getAgc(void);
510 
521  uint8_t detectMagnet(void);
522 
539  float getAngleMoved(void);
540 
549  void setup(uint8_t mode);
550 
557  void setHome(void);
558 
559 private:
560 
561  friend void TIMER1_COMPA_vect(void) __attribute__ ((signal,used));
562 };
563 
572 class uStepper
573 {
574 private:
575  //Address offset: 0
577  uint16_t cruiseDelay;
578 
579  //Address offset: 2
584 
585  //Address offset: 10
589  uint8_t state;
590 
591  //Address offset: 11
594  uint32_t accelSteps;
595 
596  //Address offset: 15
599  uint32_t decelSteps;
600 
601  //Address offset: 19
604  uint32_t initialDecelSteps;
605 
606  //Address offset: 23
609  uint32_t cruiseSteps;
610 
611  //Address offset: 27
614  uint32_t currentStep;
615 
616  //Address offset: 31
619  uint32_t totalSteps;
620 
621  //Address offset: 35
625  bool continous;
626 
627  //Address offset: 36
632  bool hold;
633 
634  //Address offset: 37
637  bool direction;
638 
639  //Address offset: 38
645  volatile int32_t stepsSinceReset;
646 
649  int32_t dummy;
650 
651  //Address offset: 46
656 
657  //Address offset: 54
665  uint16_t delay;
666 
667  //Address offset: 56
669  bool dropIn;
670 
671  //Address offset: 57
676  float velocity;
677 
678  //Address offset: 61
685  float acceleration;
686 
687  //address offset: 65
690  volatile float tolerance;
691 
692  //address offset: 69
695  volatile float hysteresis;
696 
697  //address offset: 73
700  volatile float stepConversion;
701 
702  //address offset: 77
705  volatile uint16_t counter;
706 
707  //address offset: 79
710  volatile int32_t stepCnt;
711 
712  //address offset: 83
715  volatile int32_t control;
716 
717  //address offset: 87
720  volatile uint32_t speedValue[2];
721 
722  //address offset: 95
725  float pTerm;
726 
727  //address offset: 99
729  float iTerm;
730 
731  //address offset: 103
734  float dTerm;
735 
736  //address offset: 107
739  uint8_t mode;
740 
743  float angleToStep;
744 
745  friend void TIMER2_COMPA_vect(void) __attribute__ ((signal,naked,used));
746  friend void TIMER1_COMPA_vect(void) __attribute__ ((signal,used));
747  friend void interrupt1(void);
748  friend void uStepperEncoder::setHome(void);
749 
758  void startTimer(void);
759 
760 
769  void stopTimer(void);
770 
771 
781  void enableMotor(void);
782 
783 
791  void disableMotor(void);
792 
797  void pidDropIn(void);
798 
803  void pid(void);
804 
805 public:
809  uStepperEncoder encoder;
810 
825  uStepper(float accel, float vel);
826 
827 
836  uStepper(void);
837 
838 
850  void setMaxAcceleration(float accel);
851 
852 
861  float getMaxAcceleration(void);
862 
863 
874  void setMaxVelocity(float vel);
875 
876 
886  float getMaxVelocity(void);
887 
888 
901  void runContinous(bool dir);
902 
903 
921  void moveSteps(uint32_t steps, bool dir, bool holdMode);
922 
923 
937  void hardStop(bool holdMode);
938 
939 
954  void softStop(bool holdMode);
955 
956 
990  void setup( uint8_t mode = NORMAL,
991  uint8_t microStepping = SIXTEEN,
992  float faultTolerance = 10.0,
993  float faultHysteresis = 5.0,
994  float pTerm = 1.0,
995  float iTerm = 0.02,
996  float dterm = 0.006);
997 
1008  bool getCurrentDirection(void);
1009 
1010 
1020  bool getMotorState(void);
1021 
1022 
1044  int32_t getStepsSinceReset(void);
1045 
1057  void pwmD8(double current);
1058 
1068  void setCurrent(double duty);
1069 
1078  void pwmD8(int mode);
1079 
1091  void pwmD3(double duty);
1092 
1093 
1102  void pwmD3(int mode);
1103 
1113  void updateSetPoint(float setPoint);
1114 };
1115 
1138 {
1139  private:
1141  uint8_t status;
1142 
1143 
1152  bool cmd(uint8_t cmd);
1153 
1154  public:
1155 
1165  i2cMaster(void);
1166 
1184  bool readByte(bool ack, uint8_t *data);
1185 
1207  bool read(uint8_t slaveAddr, uint8_t regAddr, uint8_t numOfBytes, uint8_t *data);
1208 
1226  bool start(uint8_t addr, bool RW);
1227 
1245  bool restart(uint8_t addr, bool RW);
1246 
1257  bool writeByte(uint8_t data);
1258 
1279  bool write(uint8_t slaveAddr, uint8_t regAddr, uint8_t numOfBytes, uint8_t *data);
1280 
1291  bool stop(void);
1292 
1301  uint8_t getStatus(void);
1302 
1310  void begin(void);
1311 };
1313 extern i2cMaster I2C;
1314 
1315 #endif
void interrupt0(void)
Used by dropin feature to take in step pulses.
Definition: uStepper.cpp:115
uint32_t currentStep
Definition: uStepper.h:614
Prototype of class for the temperature sensor.
Definition: uStepper.h:388
void TIMER1_COMPA_vect(void) __attribute__((signal
Measures angle and speed of motor.
Definition: uStepper.cpp:271
volatile uint16_t counter
Definition: uStepper.h:705
float angleToStep
Definition: uStepper.h:743
volatile int32_t stepCnt
Definition: uStepper.h:710
float2 multiplier
Definition: uStepper.h:583
float acceleration
Definition: uStepper.h:685
bool continous
Definition: uStepper.h:625
Prototype of class for accessing all features of the uStepper in a single object. ...
Definition: uStepper.h:572
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:457
bool dropIn
Definition: uStepper.h:669
float getTemp(void)
Request a reading of current temperature.
Definition: uStepper.cpp:665
uint32_t cruiseSteps
Definition: uStepper.h:609
uint32_t totalSteps
Definition: uStepper.h:619
#define C
Definition: uStepper.h:308
uint32_t accelSteps
Definition: uStepper.h:594
float iTerm
Definition: uStepper.h:729
uint8_t status
Definition: uStepper.h:1141
volatile int32_t stepsSinceReset
Definition: uStepper.h:645
uint8_t mode
Definition: uStepper.h:739
volatile int32_t angleMoved
Definition: uStepper.h:436
volatile float tolerance
Definition: uStepper.h:690
volatile uint16_t oldAngle
Definition: uStepper.h:444
float pTerm
Definition: uStepper.h:725
Prototype of class for accessing the TWI (I2C) interface of the AVR (master mode only).
Definition: uStepper.h:1137
volatile int32_t control
Definition: uStepper.h:715
Prototype of class for the AS5600 encoder.
Definition: uStepper.h:431
volatile float hysteresis
Definition: uStepper.h:695
volatile uint16_t angle
Definition: uStepper.h:448
volatile int16_t revolutions
Definition: uStepper.h:453
uint16_t cruiseDelay
Definition: uStepper.h:577
#define NORMAL
Definition: uStepper.h:206
void interrupt1(void)
Used by dropin feature to take in enable signal.
Definition: uStepper.cpp:82
uint16_t encoderOffset
Definition: uStepper.h:439
#define SIXTEEN
Definition: uStepper.h:204
float velocity
Definition: uStepper.h:676
float2 exactDelay
Definition: uStepper.h:655
float dTerm
Definition: uStepper.h:734
Function prototypes and definitions for the uStepper Servo library.
uint8_t state
Definition: uStepper.h:589
uStepperTemp(void)
Constructor.
Definition: uStepper.cpp:660
volatile float stepConversion
Definition: uStepper.h:700
uint16_t delay
Definition: uStepper.h:665
uint32_t decelSteps
Definition: uStepper.h:599
bool direction
Definition: uStepper.h:637
int32_t dummy
Definition: uStepper.h:649
bool hold
Definition: uStepper.h:632
uint32_t initialDecelSteps
Definition: uStepper.h:604