Issue With Interrupt Code in Stepper Motor Design
hello,
i working on project involving stepper motor. have written code stepper operated 4 push buttons, controlling speed, direction, , number of steps. want include interrupt when limit switch hit, motor stop , reverse direction immediately.
i able find code online assist in design. push button in main loop work fine, when limit switch pressed, not execute expected. stops current execution of stepper motor, doesn't go desired code execution, entitled pin_isr in code. i've attached code below. please let me know if see errors. way, working arduino uno combined shield motor.
i working on project involving stepper motor. have written code stepper operated 4 push buttons, controlling speed, direction, , number of steps. want include interrupt when limit switch hit, motor stop , reverse direction immediately.
i able find code online assist in design. push button in main loop work fine, when limit switch pressed, not execute expected. stops current execution of stepper motor, doesn't go desired code execution, entitled pin_isr in code. i've attached code below. please let me know if see errors. way, working arduino uno combined shield motor.
code: [select]
#include <wire.h>
#include <adafruit_motorshield.h>
#include "utility/adafruit_ms_pwmservodriver.h"
// create motor shield object default i2c address
adafruit_motorshield afms = adafruit_motorshield();
// or, create different i2c address (say stacking)
// adafruit_motorshield afms = adafruit_motorshield(0x61);
// connect stepper motor 200 steps per revolution (1.8 degree)
// motor port #2 (m3 , m4)
adafruit_steppermotor *mymotor = afms.getstepper(200, 2);
//initializing pin numbers
const int pushbutton1=13;
const int pushbutton2=10;
const int pushbutton3=9;
const int pushbutton4=3;
const int switchpin=2;
volatile int switchstate = 0; // variable reading limit switch status
//initializing variables set eqaul pin values
int val1;
int val2;
int val3;
int val4;
void setup()
{
serial.begin(9600); // set serial library @ 9600 bps
serial.println("stepper test!");
afms.begin(); // create default frequency 1.6khz
//afms.begin(1000); // or different frequency, 1khz
//activates internal pullup resistors, , sets selected pins inputs
pinmode(pushbutton1,input_pullup);
pinmode(pushbutton2,input_pullup);
pinmode(pushbutton3,input_pullup);
pinmode(pushbutton4,input_pullup);
pinmode(switchpin, input_pullup);
attachinterrupt(0, pin_isr, falling);
//initialize variables zero
val1=0;
val2=0;
val3=0;
val4=0;
}
void loop()
{//receives signals each pin, coming corresponding push button
val1=digitalread(pushbutton1);
val2=digitalread(pushbutton2);
val3=digitalread(pushbutton3);
val4=digitalread(pushbutton4);
//if pushbutton1 pressed, signal low, want cause motor
//rotate forward @ slow speed, short distance
if(val1==low)
{
mymotor->setspeed(50); // 10 rpm
mymotor->step(200, forward, double);
}
//if pushbutton2 pressed, signal low, want cause motor
//rotate forward @ faster speed, set distance
if(val2==low)
{
mymotor->setspeed(1000);
mymotor->step(2400, forward, double);
}
//if pushbutton3 pressed, signal low, want cause motor
//rotate backwards @ slow speed, set distance
if(val3==low)
{
mymotor->setspeed(50);
mymotor->step(200, backward, double);
}
//if pushbutton4 pressed, signal low, want cause motor
//rotate backwards @ faster speed, set distance
if(val4==low)
{
mymotor->setspeed(1000);
mymotor->step(2400, backward, double);
}
}
void pin_isr()
{
mymotor->setspeed(100);
mymotor->step(500, backward, double);
}
generally, interrupt routine should little possible - set flag can check in main loop. don't forget interrupts disabled there too. move motor code out.
Arduino Forum > Using Arduino > Project Guidance > Issue With Interrupt Code in Stepper Motor Design
arduino
Comments
Post a Comment