文档库 最新最全的文档下载
当前位置:文档库 › AFMOTOR_h

AFMOTOR_h

AFMOTOR_h
AFMOTOR_h

// Adafruit Motor shield library

// copyright Adafruit Industries LLC, 2009

// this code is public domain, enjoy!

/*

* Usage Notes:

* For PIC32, all features work properly with the following two exceptions:

*

* 1) Because the PIC32 only has 5 PWM outputs, and the AFMotor shield needs 6

* to completely operate (for for motor outputs and two for RC servos), the

* M1 motor output will not have PWM ability when used with a PIC32 board.

* However, there is a very simple workaround. If you need to drive a stepper

* or DC motor with PWM on motor output M1, you can use the PWM output on pin

* 9 or pin 10 (normally use for RC servo outputs on Arduino, not needed for

* RC servo outputs on PIC32) to drive the PWM input for M1 by simply putting

* a jumber from pin 9 to pin 11 or pin 10 to pin 11. Then uncomment one of the

* two #defines below to activate the PWM on either pin 9 or pin 10. You will

* then have a fully functional microstepping for 2 stepper motors, or four

* DC motor outputs with PWM.

*

* 2) There is a conflict between RC Servo outputs on pins 9 and pins 10 and

* the operation of DC motors and stepper motors as of 9/2012. This issue

* will get fixed in future MPIDE releases, but at the present time it means

* that the Motor Party example will NOT work properly. Any time you attach

* an RC servo to pins 9 or pins 10, ALL PWM outputs on the whole board will

* stop working. Thus no steppers or DC motors.

*

*/

// 09/15/2012 Modified for use with chipKIT boards

#ifndef _AFMotor_h_

#define _AFMotor_h_

#include

#if defined(__AVR__)

#include

//#define MOTORDEBUG 1

#define MICROSTEPS 16 // 8 or 16

#define MOTOR12_64KHZ _BV(CS20) // no prescale

#define MOTOR12_8KHZ _BV(CS21) // divide by 8

#define MOTOR12_2KHZ _BV(CS21) | _BV(CS20) // divide by 32

#define MOTOR12_1KHZ _BV(CS22) // divide by 64

#define MOTOR34_64KHZ _BV(CS00) // no prescale

#define MOTOR34_8KHZ _BV(CS01) // divide by 8

#define MOTOR34_1KHZ _BV(CS01) | _BV(CS00) // divide by 64

#define DC_MOTOR_PWM_RATE MOTOR34_8KHZ // PWM rate for DC motors

#define STEPPER1_PWM_RATE MOTOR12_64KHZ // PWM rate for stepper 1

#define STEPPER2_PWM_RATE MOTOR34_64KHZ // PWM rate for stepper 2

#elif defined(__PIC32MX__)

//#define MOTORDEBUG 1

// Uncomment the one of following lines if you have put a jumper from // either pin 9 to pin 11 or pin 10 to pin 11 on your Motor Shield. // Either will enable PWM for M1

//#define PIC32_USE_PIN9_FOR_M1_PWM

//#define PIC32_USE_PIN10_FOR_M1_PWM

#define MICROSTEPS 16 // 8 or 16

// For PIC32 Timers, define prescale settings by PWM frequency

#define MOTOR12_312KHZ 0 // 1:1, actual frequency 312KHz

#define MOTOR12_156KHZ 1 // 1:2, actual frequency 156KHz

#define MOTOR12_64KHZ 2 // 1:4, actual frequency 78KHz

#define MOTOR12_39KHZ 3 // 1:8, acutal frequency 39KHz

#define MOTOR12_19KHZ 4 // 1:16, actual frequency 19KHz

#define MOTOR12_8KHZ 5 // 1:32, actual frequency 9.7KHz

#define MOTOR12_4_8KHZ 6 // 1:64, actual frequency 4.8KHz

#define MOTOR12_2KHZ 7 // 1:256, actual frequency 1.2KHz #define MOTOR12_1KHZ 7 // 1:256, actual frequency 1.2KHz

#define MOTOR34_312KHZ 0 // 1:1, actual frequency 312KHz

#define MOTOR34_156KHZ 1 // 1:2, actual frequency 156KHz

#define MOTOR34_64KHZ 2 // 1:4, actual frequency 78KHz

#define MOTOR34_39KHZ 3 // 1:8, acutal frequency 39KHz

#define MOTOR34_19KHZ 4 // 1:16, actual frequency 19KHz

#define MOTOR34_8KHZ 5 // 1:32, actual frequency 9.7KHz

#define MOTOR34_4_8KHZ 6 // 1:64, actual frequency 4.8KHz

#define MOTOR34_2KHZ 7 // 1:256, actual frequency 1.2KHz #define MOTOR34_1KHZ 7 // 1:256, actual frequency 1.2KHz

// PWM rate for DC motors.

#define DC_MOTOR_PWM_RATE MOTOR34_39KHZ

// Note: for PIC32, both of these must be set to the same value // since there's only one timebase for all 4 PWM outputs

#define STEPPER1_PWM_RATE MOTOR12_39KHZ

#define STEPPER2_PWM_RATE MOTOR34_39KHZ

#endif

// Bit positions in the 74HCT595 shift register output

#define MOTOR1_A 2

#define MOTOR1_B 3

#define MOTOR2_A 1

#define MOTOR2_B 4

#define MOTOR4_A 0

#define MOTOR4_B 6

#define MOTOR3_A 5

#define MOTOR3_B 7

// Constants that the user passes in to the motor calls

#define FORWARD 1

#define BACKWARD 2

#define BRAKE 3

#define RELEASE 4

// Constants that the user passes in to the stepper calls

#define SINGLE 1

#define DOUBLE 2

#define INTERLEAVE 3

#define MICROSTEP 4

/*

#define LATCH 4

#define LATCH_DDR DDRB

#define LATCH_PORT PORTB

#define CLK_PORT PORTD

#define CLK_DDR DDRD

#define CLK 4

#define ENABLE_PORT PORTD

#define ENABLE_DDR DDRD

#define ENABLE 7

#define SER 0

#define SER_DDR DDRB

#define SER_PORT PORTB

*/

// Arduino pin names for interface to 74HCT595 latch

#define MOTORLATCH 12

#define MOTORCLK 4

#define MOTORENABLE 7

#define MOTORDATA 8

class AFMotorController

{

public:

AFMotorController(void);

void enable(void);

friend class AF_DCMotor;

void latch_tx(void);

uint8_t TimerInitalized;

};

class AF_DCMotor

{

public:

AF_DCMotor(uint8_t motornum, uint8_t freq = DC_MOTOR_PWM_RATE); void run(uint8_t);

void setSpeed(uint8_t);

private:

uint8_t motornum, pwmfreq;

};

class AF_Stepper {

public:

AF_Stepper(uint16_t, uint8_t);

void step(uint16_t steps, uint8_t dir, uint8_t style = SINGLE); void setSpeed(uint16_t);

uint8_t onestep(uint8_t dir, uint8_t style);

void release(void);

uint16_t revsteps; // # steps per revolution

uint8_t steppernum;

uint32_t usperstep, steppingcounter;

private:

uint8_t currentstep;

};

uint8_t getlatchstate(void);

#endif

相关文档