arduino stuffs
Diffstat (limited to 'libraries/AFMotor/AFMotor.cpp')
| -rwxr-xr-x | libraries/AFMotor/AFMotor.cpp | 598 |
1 files changed, 0 insertions, 598 deletions
diff --git a/libraries/AFMotor/AFMotor.cpp b/libraries/AFMotor/AFMotor.cpp deleted file mode 100755 index d3c90c6..0000000 --- a/libraries/AFMotor/AFMotor.cpp +++ /dev/null @@ -1,598 +0,0 @@ -// Adafruit Motor shield library -// copyright Adafruit Industries LLC, 2009 -// this code is public domain, enjoy! - -// added Leonardo support - Michael Margolis, 24 July 2012 - -#include <avr/io.h> -#if ARDUINO >= 100 -#include "Arduino.h" -#else -#include "WProgram.h" -#endif - -#include "AFMotor.h" - -static uint8_t latch_state; - -#if (MICROSTEPS == 8) -uint8_t microstepcurve[] = {0, 50, 98, 142, 180, 212, 236, 250, 255}; -#elif (MICROSTEPS == 16) -uint8_t microstepcurve[] = {0, 25, 50, 74, 98, 120, 141, 162, 180, 197, 212, 225, 236, 244, 250, 253, 255}; -#endif - -AFMotorController::AFMotorController(void) { -} - -void AFMotorController::enable(void) { - // setup the latch - /* - LATCH_DDR |= _BV(LATCH); - ENABLE_DDR |= _BV(ENABLE); - CLK_DDR |= _BV(CLK); - SER_DDR |= _BV(SER); - */ - pinMode(MOTORLATCH, OUTPUT); - pinMode(MOTORENABLE, OUTPUT); - pinMode(MOTORDATA, OUTPUT); - pinMode(MOTORCLK, OUTPUT); - - latch_state = 0; - - latch_tx(); // "reset" - - //ENABLE_PORT &= ~_BV(ENABLE); // enable the chip outputs! - digitalWrite(MOTORENABLE, LOW); -} - - -void AFMotorController::latch_tx(void) { - uint8_t i; - - //LATCH_PORT &= ~_BV(LATCH); - digitalWrite(MOTORLATCH, LOW); - - //SER_PORT &= ~_BV(SER); - digitalWrite(MOTORDATA, LOW); - - for (i=0; i<8; i++) { - //CLK_PORT &= ~_BV(CLK); - digitalWrite(MOTORCLK, LOW); - - if (latch_state & _BV(7-i)) { - //SER_PORT |= _BV(SER); - digitalWrite(MOTORDATA, HIGH); - } else { - //SER_PORT &= ~_BV(SER); - digitalWrite(MOTORDATA, LOW); - } - //CLK_PORT |= _BV(CLK); - digitalWrite(MOTORCLK, HIGH); - } - //LATCH_PORT |= _BV(LATCH); - digitalWrite(MOTORLATCH, HIGH); -} - -static AFMotorController MC; - - -/****************************************** - MOTORS -******************************************/ -inline void initPWM1(uint8_t freq) { - -#if defined(__AVR_ATmega8__) || \ - defined(__AVR_ATmega48__) || \ - defined(__AVR_ATmega88__) || \ - defined(__AVR_ATmega168__) || \ - defined(__AVR_ATmega328P__) - // use PWM from timer2A on PB3 (Arduino pin #11) - TCCR2A |= _BV(COM2A1) | _BV(WGM20) | _BV(WGM21); // fast PWM, turn on oc2a - TCCR2B = freq & 0x7; - OCR2A = 0; -#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) - // on arduino mega, pin 11 is now PB5 (OC1A) - TCCR1A |= _BV(COM1A1) | _BV(WGM10); // fast PWM, turn on oc1a - TCCR1B = (freq & 0x7) | _BV(WGM12); - OCR1A = 0; -#elif defined(__AVR_ATmega32U4__) // Leonardo (mem 24 July 2012) - // use PWM on timer0A (Arduino pin #11 on leo) - TCCR0A |= _BV(COM0A1) | _BV(WGM00) | _BV(WGM01); // fast PWM, turn on OC0A - OCR0A = 0; - -#else - #error "This chip is not supported!" -#endif - pinMode(11, OUTPUT); -} - -inline void setPWM1(uint8_t s) { -#if defined(__AVR_ATmega8__) || \ - defined(__AVR_ATmega48__) || \ - defined(__AVR_ATmega88__) || \ - defined(__AVR_ATmega168__) || \ - defined(__AVR_ATmega328P__) - // use PWM from timer2A on PB3 (Arduino pin #11) - OCR2A = s; -#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) - // on arduino mega, pin 11 is now PB5 (OC1A) - OCR1A = s; -#elif defined(__AVR_ATmega32U4__) // Leonardo (mem 24 July 2012) - // use PWM on timer0A (Arduino pin #11 pn leo) - OCR0A = s; -#else - #error "This chip is not supported!" -#endif -} - -inline void initPWM2(uint8_t freq) { -#if defined(__AVR_ATmega8__) || \ - defined(__AVR_ATmega48__) || \ - defined(__AVR_ATmega88__) || \ - defined(__AVR_ATmega168__) || \ - defined(__AVR_ATmega328P__) - // use PWM from timer2B (pin 3) - TCCR2A |= _BV(COM2B1) | _BV(WGM20) | _BV(WGM21); // fast PWM, turn on oc2b - TCCR2B = freq & 0x7; - OCR2B = 0; -#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) - // on arduino mega, pin 3 is now PE5 (OC3C) - TCCR3A |= _BV(COM1C1) | _BV(WGM10); // fast PWM, turn on oc3c - TCCR3B = (freq & 0x7) | _BV(WGM12); - OCR3C = 0; -#elif defined(__AVR_ATmega32U4__) // Leonardo (mem 24 July 2012) - // use PWM from timer0B (pin 3 on leo) - TCCR0A |= _BV(COM0B1) | _BV(WGM00) | _BV(WGM01); // fast PWM, turn on OC0B - OCR0B = 0; -#else - #error "This chip is not supported!" -#endif - - pinMode(3, OUTPUT); -} - -inline void setPWM2(uint8_t s) { -#if defined(__AVR_ATmega8__) || \ - defined(__AVR_ATmega48__) || \ - defined(__AVR_ATmega88__) || \ - defined(__AVR_ATmega168__) || \ - defined(__AVR_ATmega328P__) - // use PWM from timer2B (pin 3) - OCR2B = s; -#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) - OCR3C = s; -#elif defined(__AVR_ATmega32U4__) // Leonardo (mem 24 July 2012) - // use PWM from timer0B (pin 3 pin Leo) - OCR0B = s; -#else - #error "This chip is not supported!" -#endif -} - -inline void initPWM3(uint8_t freq) { -#if defined(__AVR_ATmega8__) || \ - defined(__AVR_ATmega48__) || \ - defined(__AVR_ATmega88__) || \ - defined(__AVR_ATmega168__) || \ - defined(__AVR_ATmega328P__) - // use PWM from timer0A / PD6 (pin 6) - TCCR0A |= _BV(COM0A1) | _BV(WGM00) | _BV(WGM01); // fast PWM, turn on OC0A - //TCCR0B = freq & 0x7; - OCR0A = 0; -#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) - // on arduino mega, pin 6 is now PH3 (OC4A) - TCCR4A |= _BV(COM1A1) | _BV(WGM10); // fast PWM, turn on oc4a - TCCR4B = (freq & 0x7) | _BV(WGM12); - //TCCR4B = 1 | _BV(WGM12); - OCR4A = 0; -#elif defined(__AVR_ATmega32U4__) // Leonardo (mem 24 July 2012) - // use PWM from timer4D (leo pin 6) - TCCR4B = _BV(CS42) | _BV(CS41) ; //| _BV(CS40); - TCCR4C = _BV(PWM4D) |_BV(COM4D1); - TCCR4D = _BV(WGM40); - -#else - #error "This chip is not supported!" -#endif - pinMode(6, OUTPUT); -} - -inline void setPWM3(uint8_t s) { -#if defined(__AVR_ATmega8__) || \ - defined(__AVR_ATmega48__) || \ - defined(__AVR_ATmega88__) || \ - defined(__AVR_ATmega168__) || \ - defined(__AVR_ATmega328P__) - // use PWM from timer0A on PB3 (Arduino pin #6) - OCR0A = s; -#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) - // on arduino mega, pin 6 is now PH3 (OC4A) - OCR4A = s; -#elif defined(__AVR_ATmega32U4__) // Leonardo (mem 24 July 2012) - // use PWM from timer4D (leo pin 6) - OCR4D = s; -#else - #error "This chip is not supported!" -#endif -} - - - -inline void initPWM4(uint8_t freq) { -#if defined(__AVR_ATmega8__) || \ - defined(__AVR_ATmega48__) || \ - defined(__AVR_ATmega88__) || \ - defined(__AVR_ATmega168__) || \ - defined(__AVR_ATmega328P__) - // use PWM from timer0B / PD5 (pin 5) - TCCR0A |= _BV(COM0B1) | _BV(WGM00) | _BV(WGM01); // fast PWM, turn on oc0a - //TCCR0B = freq & 0x7; - OCR0B = 0; -#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) - // on arduino mega, pin 5 is now PE3 (OC3A) - TCCR3A = _BV(COM1A1) ; // turn on oc3a - TCCR3B = (freq & 0x7) | _BV(WGM12); - //TCCR4B = 1 | _BV(WGM12); - OCR3A = 0; -#elif defined(__AVR_ATmega32U4__) // Leonardo (mem 8 aug 2012) - // use PWM from timer3A (leo pin 5) - TCCR3B = 0; - TCCR3B |= _BV(CS31) | _BV(CS30); - TCCR3A = 0; - TCCR3A |= _BV(COM3A1) | _BV(WGM30); //turn on oc3a - OCR3A = 0; -#else - #error "This chip is not supported!" -#endif - pinMode(5, OUTPUT); -} - -inline void setPWM4(uint8_t s) { -#if defined(__AVR_ATmega8__) || \ - defined(__AVR_ATmega48__) || \ - defined(__AVR_ATmega88__) || \ - defined(__AVR_ATmega168__) || \ - defined(__AVR_ATmega328P__) - // use PWM from timer0A on PB3 (Arduino pin #6) - OCR0B = s; -#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) - // on arduino mega, pin 6 is now PH3 (OC4A) - OCR3A = s; -#elif defined(__AVR_ATmega32U4__) // Leonardo (mem 24 July 2012) - // use PWM from timer3A (leo pin 5) - OCR3A = s; -#else - #error "This chip is not supported!" -#endif -} - -AF_DCMotor::AF_DCMotor(uint8_t num, uint8_t freq) { - motornum = num; - pwmfreq = freq; - - MC.enable(); - - switch (num) { - case 1: - latch_state &= ~_BV(MOTOR1_A) & ~_BV(MOTOR1_B); // set both motor pins to 0 - MC.latch_tx(); - initPWM1(freq); - break; - case 2: - latch_state &= ~_BV(MOTOR2_A) & ~_BV(MOTOR2_B); // set both motor pins to 0 - MC.latch_tx(); - initPWM2(freq); - break; - case 3: - latch_state &= ~_BV(MOTOR3_A) & ~_BV(MOTOR3_B); // set both motor pins to 0 - MC.latch_tx(); - initPWM3(freq); - break; - case 4: - latch_state &= ~_BV(MOTOR4_A) & ~_BV(MOTOR4_B); // set both motor pins to 0 - MC.latch_tx(); - initPWM4(freq); - break; - } -} - -void AF_DCMotor::run(uint8_t cmd) { - uint8_t a, b; - switch (motornum) { - case 1: - a = MOTOR1_A; b = MOTOR1_B; break; - case 2: - a = MOTOR2_A; b = MOTOR2_B; break; - case 3: - a = MOTOR3_A; b = MOTOR3_B; break; - case 4: - a = MOTOR4_A; b = MOTOR4_B; break; - default: - return; - } - - switch (cmd) { - case FORWARD: - latch_state |= _BV(a); - latch_state &= ~_BV(b); - MC.latch_tx(); - break; - case BACKWARD: - latch_state &= ~_BV(a); - latch_state |= _BV(b); - MC.latch_tx(); - break; - case RELEASE: - latch_state &= ~_BV(a); - latch_state &= ~_BV(b); - MC.latch_tx(); - break; - } -} - -void AF_DCMotor::setSpeed(uint8_t speed) { - switch (motornum) { - case 1: - setPWM1(speed); break; - case 2: - setPWM2(speed); break; - case 3: - setPWM3(speed); break; - case 4: - setPWM4(speed); break; - } -} - -/****************************************** - STEPPERS -******************************************/ - -AF_Stepper::AF_Stepper(uint16_t steps, uint8_t num) { - MC.enable(); - - revsteps = steps; - steppernum = num; - currentstep = 0; - - if (steppernum == 1) { - latch_state &= ~_BV(MOTOR1_A) & ~_BV(MOTOR1_B) & - ~_BV(MOTOR2_A) & ~_BV(MOTOR2_B); // all motor pins to 0 - MC.latch_tx(); - - // enable both H bridges - pinMode(11, OUTPUT); - pinMode(3, OUTPUT); - digitalWrite(11, HIGH); - digitalWrite(3, HIGH); - - // use PWM for microstepping support - initPWM1(MOTOR12_64KHZ); - initPWM2(MOTOR12_64KHZ); - setPWM1(255); - setPWM2(255); - - } else if (steppernum == 2) { - latch_state &= ~_BV(MOTOR3_A) & ~_BV(MOTOR3_B) & - ~_BV(MOTOR4_A) & ~_BV(MOTOR4_B); // all motor pins to 0 - MC.latch_tx(); - - // enable both H bridges - pinMode(5, OUTPUT); - pinMode(6, OUTPUT); - digitalWrite(5, HIGH); - digitalWrite(6, HIGH); - - // use PWM for microstepping support - // use PWM for microstepping support - initPWM3(1); - initPWM4(1); - setPWM3(255); - setPWM4(255); - } -} - -void AF_Stepper::setSpeed(uint16_t rpm) { - usperstep = 60000000 / ((uint32_t)revsteps * (uint32_t)rpm); - steppingcounter = 0; -} - -void AF_Stepper::release(void) { - if (steppernum == 1) { - latch_state &= ~_BV(MOTOR1_A) & ~_BV(MOTOR1_B) & - ~_BV(MOTOR2_A) & ~_BV(MOTOR2_B); // all motor pins to 0 - MC.latch_tx(); - } else if (steppernum == 2) { - latch_state &= ~_BV(MOTOR3_A) & ~_BV(MOTOR3_B) & - ~_BV(MOTOR4_A) & ~_BV(MOTOR4_B); // all motor pins to 0 - MC.latch_tx(); - } -} - -void AF_Stepper::step(uint16_t steps, uint8_t dir, uint8_t style) { - uint32_t uspers = usperstep; - uint8_t ret = 0; - - if (style == INTERLEAVE) { - uspers /= 2; - } - else if (style == MICROSTEP) { - uspers /= MICROSTEPS; - steps *= MICROSTEPS; -#ifdef MOTORDEBUG - Serial.print("steps = "); Serial.println(steps, DEC); -#endif - } - - while (steps--) { - ret = onestep(dir, style); - delay(uspers/1000); // in ms - steppingcounter += (uspers % 1000); - if (steppingcounter >= 1000) { - delay(1); - steppingcounter -= 1000; - } - } - if (style == MICROSTEP) { - while ((ret != 0) && (ret != MICROSTEPS)) { - ret = onestep(dir, style); - delay(uspers/1000); // in ms - steppingcounter += (uspers % 1000); - if (steppingcounter >= 1000) { - delay(1); - steppingcounter -= 1000; - } - } - } -} - -uint8_t AF_Stepper::onestep(uint8_t dir, uint8_t style) { - uint8_t a, b, c, d; - uint8_t ocrb, ocra; - - ocra = ocrb = 255; - - if (steppernum == 1) { - a = _BV(MOTOR1_A); - b = _BV(MOTOR2_A); - c = _BV(MOTOR1_B); - d = _BV(MOTOR2_B); - } else if (steppernum == 2) { - a = _BV(MOTOR3_A); - b = _BV(MOTOR4_A); - c = _BV(MOTOR3_B); - d = _BV(MOTOR4_B); - } else { - return 0; - } - - // next determine what sort of stepping procedure we're up to - if (style == SINGLE) { - if ((currentstep/(MICROSTEPS/2)) % 2) { // we're at an odd step, weird - if (dir == FORWARD) { - currentstep += MICROSTEPS/2; - } - else { - currentstep -= MICROSTEPS/2; - } - } else { // go to the next even step - if (dir == FORWARD) { - currentstep += MICROSTEPS; - } - else { - currentstep -= MICROSTEPS; - } - } - } else if (style == DOUBLE) { - if (! (currentstep/(MICROSTEPS/2) % 2)) { // we're at an even step, weird - if (dir == FORWARD) { - currentstep += MICROSTEPS/2; - } else { - currentstep -= MICROSTEPS/2; - } - } else { // go to the next odd step - if (dir == FORWARD) { - currentstep += MICROSTEPS; - } else { - currentstep -= MICROSTEPS; - } - } - } else if (style == INTERLEAVE) { - if (dir == FORWARD) { - currentstep += MICROSTEPS/2; - } else { - currentstep -= MICROSTEPS/2; - } - } - - if (style == MICROSTEP) { - if (dir == FORWARD) { - currentstep++; - } else { - // BACKWARDS - currentstep--; - } - - currentstep += MICROSTEPS*4; - currentstep %= MICROSTEPS*4; - - ocra = ocrb = 0; - if ( (currentstep >= 0) && (currentstep < MICROSTEPS)) { - ocra = microstepcurve[MICROSTEPS - currentstep]; - ocrb = microstepcurve[currentstep]; - } else if ( (currentstep >= MICROSTEPS) && (currentstep < MICROSTEPS*2)) { - ocra = microstepcurve[currentstep - MICROSTEPS]; - ocrb = microstepcurve[MICROSTEPS*2 - currentstep]; - } else if ( (currentstep >= MICROSTEPS*2) && (currentstep < MICROSTEPS*3)) { - ocra = microstepcurve[MICROSTEPS*3 - currentstep]; - ocrb = microstepcurve[currentstep - MICROSTEPS*2]; - } else if ( (currentstep >= MICROSTEPS*3) && (currentstep < MICROSTEPS*4)) { - ocra = microstepcurve[currentstep - MICROSTEPS*3]; - ocrb = microstepcurve[MICROSTEPS*4 - currentstep]; - } - } - - currentstep += MICROSTEPS*4; - currentstep %= MICROSTEPS*4; - -#ifdef MOTORDEBUG - Serial.print("current step: "); Serial.println(currentstep, DEC); - Serial.print(" pwmA = "); Serial.print(ocra, DEC); - Serial.print(" pwmB = "); Serial.println(ocrb, DEC); -#endif - - if (steppernum == 1) { - setPWM1(ocra); - setPWM2(ocrb); - } else if (steppernum == 2) { - setPWM3(ocra); - setPWM4(ocrb); - } - - - // release all - latch_state &= ~a & ~b & ~c & ~d; // all motor pins to 0 - - //Serial.println(step, DEC); - if (style == MICROSTEP) { - if ((currentstep >= 0) && (currentstep < MICROSTEPS)) - latch_state |= a | b; - if ((currentstep >= MICROSTEPS) && (currentstep < MICROSTEPS*2)) - latch_state |= b | c; - if ((currentstep >= MICROSTEPS*2) && (currentstep < MICROSTEPS*3)) - latch_state |= c | d; - if ((currentstep >= MICROSTEPS*3) && (currentstep < MICROSTEPS*4)) - latch_state |= d | a; - } else { - switch (currentstep/(MICROSTEPS/2)) { - case 0: - latch_state |= a; // energize coil 1 only - break; - case 1: - latch_state |= a | b; // energize coil 1+2 - break; - case 2: - latch_state |= b; // energize coil 2 only - break; - case 3: - latch_state |= b | c; // energize coil 2+3 - break; - case 4: - latch_state |= c; // energize coil 3 only - break; - case 5: - latch_state |= c | d; // energize coil 3+4 - break; - case 6: - latch_state |= d; // energize coil 4 only - break; - case 7: - latch_state |= d | a; // energize coil 1+4 - break; - } - } - - - MC.latch_tx(); - return currentstep; -} - |