uStepper
uStepper.h
Go to the documentation of this file.
1 /********************************************************************************************
2 * File: uStepper.h *
3 * Version: 1.2.0 *
4 * date: March 22, 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 ********************************************************************************************/
175 #ifndef _USTEPPER_H_
176 #define _USTEPPER_H_
177 
178 #ifndef __AVR_ATmega328P__
179 #error !!This library only supports the ATmega328p MCU!!
180 #endif
181 
182 #include <inttypes.h>
183 #include <avr/io.h>
184 #include <Arduino.h>
185 #include <uStepperServo.h>
186 
188 #define FULL 1
189 
190 #define HALF 2
191 
192 #define QUARTER 4
193 
194 #define EIGHT 8
195 
196 #define SIXTEEN 16
197 
198 #define NORMAL 0
199 
200 #define PWM 1
201 
202 #define DROPIN 1
203 
204 #define PID 2
205 
207 #define STOP 1
208 
209 #define ACCEL 2
210 
211 #define CRUISE 4
212 
213 #define DECEL 8
214 
215 #define INITDECEL 16
216 
217 #define INTFREQ 28200.0f
218 
219 #define INTPERIOD 1000000.0/INTFREQ
220 
221 #define INTPIDDELAYCONSTANT 0.028199994
222 
223 #define CW 0
224 
225 #define CCW 1
226 
227 #define HARD 1
228 
229 #define SOFT 0
230 
232 #define ENCODERINTFREQ 1000.0
233 
234 #define ENCODERSPEEDCONSTANT ENCODERINTFREQ/10.0/4096.0
235 
236 #define ENCODERADDR 0x36
237 
238 #define ANGLE 0x0E
239 
240 #define STATUS 0x0B
241 
242 #define AGC 0x1A
243 
244 #define MAGNITUDE 0x1B
245 
247 #define R 4700.0
248 
250 #define I2CFREE 0
251 
253 #define READ 1
254 
256 #define WRITE 0
257 
259 #define START 0x08
260 
262 #define REPSTART 0x10
263 
265 #define TXADDRACK 0x18
266 
268 #define TXDATAACK 0x28
269 
271 #define RXADDRACK 0x40
272 
274 #define ACK 1
275 
277 #define NACK 0
278 
296 #define A 0.001295752996237
297 
298 #define B 0.000237488365866
299 
300 #define C 0.000000083423218
301 
308 extern "C" void interrupt0(void);
309 
316 extern "C" void interrupt1(void);
317 
328 extern "C" void TIMER2_COMPA_vect(void) __attribute__ ((signal,naked,used));
329 
338 extern "C" void TIMER1_COMPA_vect(void) __attribute__ ((signal,used));
339 
340 class float2
341 {
342  public:
343  float2(void);
344  float getFloatValue(void);
345  uint64_t getRawValue(void);
346  void setValue(float val);
347  float2 & operator=(const float &value);
348  bool operator==(const float2 &value);
349  bool operator!=(const float2 &value);
350  bool operator>=(const float2 &value);
351  bool operator<=(const float2 &value);
352  bool operator<=(const float &value);
353  bool operator<(const float2 &value);
354  bool operator>(const float2 &value);
355  float2 & operator*=(const float2 &value);
356  float2 & operator-=(const float2 &value);
357  float2 & operator+=(const float2 &value);
358  float2 & operator+=(const float &value);
359  float2 & operator/=(const float2 &value);
360  const float2 operator+(const float2 &value);
361  const float2 operator-(const float2 &value);
362  const float2 operator*(const float2 &value);
363  const float2 operator/(const float2 &value);
364  uint64_t value;
365 
366  private:
367  friend void TIMER2_COMPA_vect(void) __attribute__ ((signal,used));
368 
369 };
370 
381 {
382 public:
383 
396  uStepperTemp(void);
397 
410  float getTemp(void);
411 private:
412 };
413 
424 {
425 public:
428  volatile int32_t angleMoved;
429 
431  uint16_t encoderOffset;
432 
436  volatile uint16_t oldAngle;
437 
440  volatile uint16_t angle;
441 
445  volatile int16_t revolutions;
446 
449  volatile float curSpeed;
455  uStepperEncoder(void);
456 
469  float getAngle(void);
470 
481  float getSpeed(void);
482 
490  uint16_t getStrength(void);
491 
501  uint8_t getAgc(void);
502 
513  uint8_t detectMagnet(void);
514 
531  float getAngleMoved(void);
532 
541  void setup(uint8_t mode);
542 
549  void setHome(void);
550 
551 private:
552 
553  friend void TIMER1_COMPA_vect(void) __attribute__ ((signal,used));
554 };
555 
564 class uStepper
565 {
566 private:
567  //Address offset: 0
569  uint16_t cruiseDelay;
570 
571  //Address offset: 2
576 
577  //Address offset: 10
581  uint8_t state;
582 
583  //Address offset: 11
586  uint32_t accelSteps;
587 
588  //Address offset: 15
591  uint32_t decelSteps;
592 
593  //Address offset: 19
596  uint32_t initialDecelSteps;
597 
598  //Address offset: 23
601  uint32_t cruiseSteps;
602 
603  //Address offset: 27
606  uint32_t currentStep;
607 
608  //Address offset: 31
611  uint32_t totalSteps;
612 
613  //Address offset: 35
617  bool continous;
618 
619  //Address offset: 36
624  bool hold;
625 
626  //Address offset: 37
629  bool direction;
630 
631  //Address offset: 38
637  volatile int32_t stepsSinceReset;
638 
641  int32_t dummy;
642 
643  //Address offset: 46
648 
649  //Address offset: 54
657  uint16_t delay;
658 
659  //Address offset: 56
661  bool dropIn;
662 
663  //Address offset: 57
668  float velocity;
669 
670  //Address offset: 61
677  float acceleration;
678 
679  //address offset: 65
682  volatile float tolerance;
683 
684  //address offset: 69
687  volatile float hysteresis;
688 
689  //address offset: 73
692  volatile float stepConversion;
693 
694  //address offset: 77
697  volatile uint16_t counter;
698 
699  //address offset: 79
702  volatile int32_t stepCnt;
703 
704  //address offset: 83
707  volatile int32_t control;
708 
709  //address offset: 87
712  volatile uint32_t speedValue[2];
713 
714  //address offset: 95
717  float pTerm;
718 
719  //address offset: 99
721  float iTerm;
722 
723  //address offset: 103
726  float dTerm;
727 
728  //address offset: 107
731  uint8_t mode;
732 
735  float angleToStep;
736 
737  friend void TIMER2_COMPA_vect(void) __attribute__ ((signal,naked,used));
738  friend void TIMER1_COMPA_vect(void) __attribute__ ((signal,used));
739  friend void interrupt1(void);
740 
749  void startTimer(void);
750 
751 
760  void stopTimer(void);
761 
762 
772  void enableMotor(void);
773 
774 
782  void disableMotor(void);
783 
788  void pidDropIn(void);
789 
794  void pid(void);
795 
796 public:
800  uStepperEncoder encoder;
801 
816  uStepper(float accel, float vel);
817 
818 
827  uStepper(void);
828 
829 
841  void setMaxAcceleration(float accel);
842 
843 
852  float getMaxAcceleration(void);
853 
854 
865  void setMaxVelocity(float vel);
866 
867 
877  float getMaxVelocity(void);
878 
879 
892  void runContinous(bool dir);
893 
894 
912  void moveSteps(uint32_t steps, bool dir, bool holdMode);
913 
914 
928  void hardStop(bool holdMode);
929 
930 
945  void softStop(bool holdMode);
946 
947 
981  void setup( uint8_t mode = NORMAL,
982  uint8_t microStepping = SIXTEEN,
983  float faultTolerance = 10.0,
984  float faultHysteresis = 5.0,
985  float pTerm = 1.0,
986  float iTerm = 0.02,
987  float dterm = 0.006);
988 
999  bool getCurrentDirection(void);
1000 
1001 
1011  bool getMotorState(void);
1012 
1013 
1035  int32_t getStepsSinceReset(void);
1036 
1048  void pwmD8(double duty);
1049 
1058  void pwmD8(int mode);
1059 
1071  void pwmD3(double duty);
1072 
1073 
1082  void pwmD3(int mode);
1083 
1093  void updateSetPoint(float setPoint);
1094 };
1095 
1118 {
1119  private:
1121  uint8_t status;
1122 
1123 
1132  bool cmd(uint8_t cmd);
1133 
1134  public:
1135 
1145  i2cMaster(void);
1146 
1164  bool readByte(bool ack, uint8_t *data);
1165 
1187  bool read(uint8_t slaveAddr, uint8_t regAddr, uint8_t numOfBytes, uint8_t *data);
1188 
1206  bool start(uint8_t addr, bool RW);
1207 
1225  bool restart(uint8_t addr, bool RW);
1226 
1237  bool writeByte(uint8_t data);
1238 
1259  bool write(uint8_t slaveAddr, uint8_t regAddr, uint8_t numOfBytes, uint8_t *data);
1260 
1271  bool stop(void);
1272 
1281  uint8_t getStatus(void);
1282 
1290  void begin(void);
1291 };
1293 extern i2cMaster I2C;
1294 
1295 #endif
void interrupt0(void)
Used by dropin feature to take in step pulses.
Definition: uStepper.cpp:115
uint32_t currentStep
Definition: uStepper.h:606
Prototype of class for the temperature sensor.
Definition: uStepper.h:380
void TIMER1_COMPA_vect(void) __attribute__((signal
Measures angle and speed of motor.
Definition: uStepper.cpp:271
volatile uint16_t counter
Definition: uStepper.h:697
float angleToStep
Definition: uStepper.h:735
volatile int32_t stepCnt
Definition: uStepper.h:702
float2 multiplier
Definition: uStepper.h:575
float acceleration
Definition: uStepper.h:677
bool continous
Definition: uStepper.h:617
Prototype of class for accessing all features of the uStepper in a single object. ...
Definition: uStepper.h:564
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:449
bool dropIn
Definition: uStepper.h:661
float getTemp(void)
Request a reading of current temperature.
Definition: uStepper.cpp:665
uint32_t cruiseSteps
Definition: uStepper.h:601
uint32_t totalSteps
Definition: uStepper.h:611
#define C
Definition: uStepper.h:300
uint32_t accelSteps
Definition: uStepper.h:586
float iTerm
Definition: uStepper.h:721
uint8_t status
Definition: uStepper.h:1121
volatile int32_t stepsSinceReset
Definition: uStepper.h:637
uint8_t mode
Definition: uStepper.h:731
volatile int32_t angleMoved
Definition: uStepper.h:428
volatile float tolerance
Definition: uStepper.h:682
volatile uint16_t oldAngle
Definition: uStepper.h:436
float pTerm
Definition: uStepper.h:717
Prototype of class for accessing the TWI (I2C) interface of the AVR (master mode only).
Definition: uStepper.h:1117
volatile int32_t control
Definition: uStepper.h:707
Prototype of class for the AS5600 encoder.
Definition: uStepper.h:423
volatile float hysteresis
Definition: uStepper.h:687
volatile uint16_t angle
Definition: uStepper.h:440
volatile int16_t revolutions
Definition: uStepper.h:445
uint16_t cruiseDelay
Definition: uStepper.h:569
#define NORMAL
Definition: uStepper.h:198
void interrupt1(void)
Used by dropin feature to take in enable signal.
Definition: uStepper.cpp:82
uint16_t encoderOffset
Definition: uStepper.h:431
#define SIXTEEN
Definition: uStepper.h:196
float velocity
Definition: uStepper.h:668
float2 exactDelay
Definition: uStepper.h:647
float dTerm
Definition: uStepper.h:726
Function prototypes and definitions for the uStepper Servo library.
uint8_t state
Definition: uStepper.h:581
uStepperTemp(void)
Constructor.
Definition: uStepper.cpp:660
volatile float stepConversion
Definition: uStepper.h:692
uint16_t delay
Definition: uStepper.h:657
uint32_t decelSteps
Definition: uStepper.h:591
bool direction
Definition: uStepper.h:629
int32_t dummy
Definition: uStepper.h:641
bool hold
Definition: uStepper.h:624
uint32_t initialDecelSteps
Definition: uStepper.h:596