uStepper
uStepper.h
Go to the documentation of this file.
1 /********************************************************************************************
2 * File: uStepper.h *
3 * Version: 1.2.1 *
4 * date: April 2, 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 ********************************************************************************************/
179 #ifndef _USTEPPER_H_
180 #define _USTEPPER_H_
181 
182 #ifndef __AVR_ATmega328P__
183 #error !!This library only supports the ATmega328p MCU!!
184 #endif
185 
186 #include <inttypes.h>
187 #include <avr/io.h>
188 #include <Arduino.h>
189 #include <uStepperServo.h>
190 
192 #define FULL 1
193 
194 #define HALF 2
195 
196 #define QUARTER 4
197 
198 #define EIGHT 8
199 
200 #define SIXTEEN 16
201 
202 #define NORMAL 0
203 
204 #define PWM 1
205 
206 #define DROPIN 1
207 
208 #define PID 2
209 
211 #define STOP 1
212 
213 #define ACCEL 2
214 
215 #define CRUISE 4
216 
217 #define DECEL 8
218 
219 #define INITDECEL 16
220 
221 #define INTFREQ 28200.0f
222 
223 #define INTPERIOD 1000000.0/INTFREQ
224 
225 #define INTPIDDELAYCONSTANT 0.028199994
226 
227 #define CW 0
228 
229 #define CCW 1
230 
231 #define HARD 1
232 
233 #define SOFT 0
234 
236 #define ENCODERINTFREQ 1000.0
237 
238 #define ENCODERSPEEDCONSTANT ENCODERINTFREQ/10.0/4096.0
239 
240 #define ENCODERADDR 0x36
241 
242 #define ANGLE 0x0E
243 
244 #define STATUS 0x0B
245 
246 #define AGC 0x1A
247 
248 #define MAGNITUDE 0x1B
249 
251 #define R 4700.0
252 
254 #define I2CFREE 0
255 
257 #define READ 1
258 
260 #define WRITE 0
261 
263 #define START 0x08
264 
266 #define REPSTART 0x10
267 
269 #define TXADDRACK 0x18
270 
272 #define TXDATAACK 0x28
273 
275 #define RXADDRACK 0x40
276 
278 #define ACK 1
279 
281 #define NACK 0
282 
300 #define A 0.001295752996237
301 
302 #define B 0.000237488365866
303 
304 #define C 0.000000083423218
305 
312 extern "C" void interrupt0(void);
313 
320 extern "C" void interrupt1(void);
321 
332 extern "C" void TIMER2_COMPA_vect(void) __attribute__ ((signal,naked,used));
333 
342 extern "C" void TIMER1_COMPA_vect(void) __attribute__ ((signal,used));
343 
344 class float2
345 {
346  public:
347  float2(void);
348  float getFloatValue(void);
349  uint64_t getRawValue(void);
350  void setValue(float val);
351  float2 & operator=(const float &value);
352  bool operator==(const float2 &value);
353  bool operator!=(const float2 &value);
354  bool operator>=(const float2 &value);
355  bool operator<=(const float2 &value);
356  bool operator<=(const float &value);
357  bool operator<(const float2 &value);
358  bool operator>(const float2 &value);
359  float2 & operator*=(const float2 &value);
360  float2 & operator-=(const float2 &value);
361  float2 & operator+=(const float2 &value);
362  float2 & operator+=(const float &value);
363  float2 & operator/=(const float2 &value);
364  const float2 operator+(const float2 &value);
365  const float2 operator-(const float2 &value);
366  const float2 operator*(const float2 &value);
367  const float2 operator/(const float2 &value);
368  uint64_t value;
369 
370  private:
371  friend void TIMER2_COMPA_vect(void) __attribute__ ((signal,used));
372 
373 };
374 
385 {
386 public:
387 
400  uStepperTemp(void);
401 
414  float getTemp(void);
415 private:
416 };
417 
428 {
429 public:
432  volatile int32_t angleMoved;
433 
435  uint16_t encoderOffset;
436 
440  volatile uint16_t oldAngle;
441 
444  volatile uint16_t angle;
445 
449  volatile int16_t revolutions;
450 
453  volatile float curSpeed;
459  uStepperEncoder(void);
460 
473  float getAngle(void);
474 
485  float getSpeed(void);
486 
494  uint16_t getStrength(void);
495 
505  uint8_t getAgc(void);
506 
517  uint8_t detectMagnet(void);
518 
535  float getAngleMoved(void);
536 
545  void setup(uint8_t mode);
546 
553  void setHome(void);
554 
555 private:
556 
557  friend void TIMER1_COMPA_vect(void) __attribute__ ((signal,used));
558 };
559 
568 class uStepper
569 {
570 private:
571  //Address offset: 0
573  uint16_t cruiseDelay;
574 
575  //Address offset: 2
580 
581  //Address offset: 10
585  uint8_t state;
586 
587  //Address offset: 11
590  uint32_t accelSteps;
591 
592  //Address offset: 15
595  uint32_t decelSteps;
596 
597  //Address offset: 19
600  uint32_t initialDecelSteps;
601 
602  //Address offset: 23
605  uint32_t cruiseSteps;
606 
607  //Address offset: 27
610  uint32_t currentStep;
611 
612  //Address offset: 31
615  uint32_t totalSteps;
616 
617  //Address offset: 35
621  bool continous;
622 
623  //Address offset: 36
628  bool hold;
629 
630  //Address offset: 37
633  bool direction;
634 
635  //Address offset: 38
641  volatile int32_t stepsSinceReset;
642 
645  int32_t dummy;
646 
647  //Address offset: 46
652 
653  //Address offset: 54
661  uint16_t delay;
662 
663  //Address offset: 56
665  bool dropIn;
666 
667  //Address offset: 57
672  float velocity;
673 
674  //Address offset: 61
681  float acceleration;
682 
683  //address offset: 65
686  volatile float tolerance;
687 
688  //address offset: 69
691  volatile float hysteresis;
692 
693  //address offset: 73
696  volatile float stepConversion;
697 
698  //address offset: 77
701  volatile uint16_t counter;
702 
703  //address offset: 79
706  volatile int32_t stepCnt;
707 
708  //address offset: 83
711  volatile int32_t control;
712 
713  //address offset: 87
716  volatile uint32_t speedValue[2];
717 
718  //address offset: 95
721  float pTerm;
722 
723  //address offset: 99
725  float iTerm;
726 
727  //address offset: 103
730  float dTerm;
731 
732  //address offset: 107
735  uint8_t mode;
736 
739  float angleToStep;
740 
741  friend void TIMER2_COMPA_vect(void) __attribute__ ((signal,naked,used));
742  friend void TIMER1_COMPA_vect(void) __attribute__ ((signal,used));
743  friend void interrupt1(void);
744  friend void uStepperEncoder::setHome(void);
745 
754  void startTimer(void);
755 
756 
765  void stopTimer(void);
766 
767 
777  void enableMotor(void);
778 
779 
787  void disableMotor(void);
788 
793  void pidDropIn(void);
794 
799  void pid(void);
800 
801 public:
805  uStepperEncoder encoder;
806 
821  uStepper(float accel, float vel);
822 
823 
832  uStepper(void);
833 
834 
846  void setMaxAcceleration(float accel);
847 
848 
857  float getMaxAcceleration(void);
858 
859 
870  void setMaxVelocity(float vel);
871 
872 
882  float getMaxVelocity(void);
883 
884 
897  void runContinous(bool dir);
898 
899 
917  void moveSteps(uint32_t steps, bool dir, bool holdMode);
918 
919 
933  void hardStop(bool holdMode);
934 
935 
950  void softStop(bool holdMode);
951 
952 
986  void setup( uint8_t mode = NORMAL,
987  uint8_t microStepping = SIXTEEN,
988  float faultTolerance = 10.0,
989  float faultHysteresis = 5.0,
990  float pTerm = 1.0,
991  float iTerm = 0.02,
992  float dterm = 0.006);
993 
1004  bool getCurrentDirection(void);
1005 
1006 
1016  bool getMotorState(void);
1017 
1018 
1040  int32_t getStepsSinceReset(void);
1041 
1053  void pwmD8(double duty);
1054 
1063  void pwmD8(int mode);
1064 
1076  void pwmD3(double duty);
1077 
1078 
1087  void pwmD3(int mode);
1088 
1098  void updateSetPoint(float setPoint);
1099 };
1100 
1123 {
1124  private:
1126  uint8_t status;
1127 
1128 
1137  bool cmd(uint8_t cmd);
1138 
1139  public:
1140 
1150  i2cMaster(void);
1151 
1169  bool readByte(bool ack, uint8_t *data);
1170 
1192  bool read(uint8_t slaveAddr, uint8_t regAddr, uint8_t numOfBytes, uint8_t *data);
1193 
1211  bool start(uint8_t addr, bool RW);
1212 
1230  bool restart(uint8_t addr, bool RW);
1231 
1242  bool writeByte(uint8_t data);
1243 
1264  bool write(uint8_t slaveAddr, uint8_t regAddr, uint8_t numOfBytes, uint8_t *data);
1265 
1276  bool stop(void);
1277 
1286  uint8_t getStatus(void);
1287 
1295  void begin(void);
1296 };
1298 extern i2cMaster I2C;
1299 
1300 #endif
void interrupt0(void)
Used by dropin feature to take in step pulses.
Definition: uStepper.cpp:115
uint32_t currentStep
Definition: uStepper.h:610
Prototype of class for the temperature sensor.
Definition: uStepper.h:384
void TIMER1_COMPA_vect(void) __attribute__((signal
Measures angle and speed of motor.
Definition: uStepper.cpp:271
volatile uint16_t counter
Definition: uStepper.h:701
float angleToStep
Definition: uStepper.h:739
volatile int32_t stepCnt
Definition: uStepper.h:706
float2 multiplier
Definition: uStepper.h:579
float acceleration
Definition: uStepper.h:681
bool continous
Definition: uStepper.h:621
Prototype of class for accessing all features of the uStepper in a single object. ...
Definition: uStepper.h:568
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:453
bool dropIn
Definition: uStepper.h:665
float getTemp(void)
Request a reading of current temperature.
Definition: uStepper.cpp:665
uint32_t cruiseSteps
Definition: uStepper.h:605
uint32_t totalSteps
Definition: uStepper.h:615
#define C
Definition: uStepper.h:304
uint32_t accelSteps
Definition: uStepper.h:590
float iTerm
Definition: uStepper.h:725
uint8_t status
Definition: uStepper.h:1126
volatile int32_t stepsSinceReset
Definition: uStepper.h:641
uint8_t mode
Definition: uStepper.h:735
volatile int32_t angleMoved
Definition: uStepper.h:432
volatile float tolerance
Definition: uStepper.h:686
volatile uint16_t oldAngle
Definition: uStepper.h:440
float pTerm
Definition: uStepper.h:721
Prototype of class for accessing the TWI (I2C) interface of the AVR (master mode only).
Definition: uStepper.h:1122
volatile int32_t control
Definition: uStepper.h:711
Prototype of class for the AS5600 encoder.
Definition: uStepper.h:427
volatile float hysteresis
Definition: uStepper.h:691
volatile uint16_t angle
Definition: uStepper.h:444
volatile int16_t revolutions
Definition: uStepper.h:449
uint16_t cruiseDelay
Definition: uStepper.h:573
#define NORMAL
Definition: uStepper.h:202
void interrupt1(void)
Used by dropin feature to take in enable signal.
Definition: uStepper.cpp:82
uint16_t encoderOffset
Definition: uStepper.h:435
#define SIXTEEN
Definition: uStepper.h:200
float velocity
Definition: uStepper.h:672
float2 exactDelay
Definition: uStepper.h:651
float dTerm
Definition: uStepper.h:730
Function prototypes and definitions for the uStepper Servo library.
uint8_t state
Definition: uStepper.h:585
uStepperTemp(void)
Constructor.
Definition: uStepper.cpp:660
volatile float stepConversion
Definition: uStepper.h:696
uint16_t delay
Definition: uStepper.h:661
uint32_t decelSteps
Definition: uStepper.h:595
bool direction
Definition: uStepper.h:633
int32_t dummy
Definition: uStepper.h:645
bool hold
Definition: uStepper.h:628
uint32_t initialDecelSteps
Definition: uStepper.h:600