Generic Step Motor WebInterface - control a step motor using a Pololu A4983 driver from a webinterface (EXPERIMENTAL PROTOTYPE - just to be used as a proof-of-concept for a IoT talk, will not be updating this code so often)

Dependencies:   EthernetNetIf RPCInterface mbed HTTPServer

A4983StepMotorDriver/A4983.c

Committer:
botdream
Date:
2012-04-16
Revision:
0:8b3857d4ce02

File content as of revision 0:8b3857d4ce02:

//---------------------------------------------------------------------------------------------
#include "mbed.h"
#include "A4983.h"
//---------------------------------------------------------------------------------------------
// Pins configuration
//---------------------------------------------------------------------------------------------
//LEDs port definition on mbed
DigitalOut myled1(LED1);
DigitalOut myled2(LED2);
DigitalOut myled3(LED3);
DigitalOut myled4(LED4);

//ports connected to pololu driver board = straightforward connection of one side of mbed
DigitalOut Dir(p23); //direction of movement
DigitalOut Step(p24); //make one step at rising edge
DigitalOut nSleep(p25); // be HIGH to make it work
DigitalOut nReset(p26); // be HIGH to make it work
DigitalOut MS3(p19); //microstep mode selectors
DigitalOut MS2(p18);
DigitalOut MS1(p17);
DigitalOut nEnable(p27);// be LOW to make it work

#define HIGH 1
#define LOW 0
#define ON 1
#define OFF 0
#define Clockwise LOW
#define CounterClockwise HIGH

//which mode of driver to be used. This is now 1/16 stepping.
#define Factor  16
//---------------------------------------------------------------------------------------------
// USB serial port setup - debug messages
//---------------------------------------------------------------------------------------------
Serial pc(USBTX, USBRX); // tx, rx  
//---------------------------------------------------------------------------------------------  

//---------------------------------------------------------------------------------------------  
// constructor
//---------------------------------------------------------------------------------------------
A4983::A4983()
{
  //set communication speed
  pc.baud(115200);
  //test to see if comm is working
  printf("\r\nInitialize MBED Serial Port!\r\n");
  
  myled1 = 0;
  myled2 = 0;
  myled3 = 0;
  myled4 = 0;

  //-------------------------------------------------------------------------------------------
  // adjust microstepping mode
  adjust_microstepping_mode(16);

  // initialisation of power stage
  Dir = CounterClockwise;
  Step = LOW;
  nSleep = HIGH;
  nEnable = HIGH;
  nReset = LOW;
  myled1 = 1;
  myled2 = 0;
  myled3 = 0;
  myled4 = 0;

  wait(0.5);

  nReset = HIGH;
  myled1 = 0;
  myled2 = 1;
  myled3 = 0;
  myled4 = 0;

  wait(0.5);

  nEnable = LOW;
  myled1 = 1;
  myled2 = 1;
  myled3 = 0;
  myled4 = 0;

  wait(0.5);

  Step = HIGH;
  myled1 = 0;
  myled2 = 0;
  myled3 = 1;
  myled4 = 0;

  wait(0.5);

  Step = LOW;
  myled1 = 1;
  myled2 = 0;
  myled3 = 1;
  myled4 = 0;

  wait(0.5);
  //-------------------------------------------------------------------------------------------
 
  f_motor_enable = 0;    // flag to Enable/Disable Step Motor, 0 => Disable, 1 => Enable
  f_motor_direction = 0; // flag for the Step Motor direction, 0 => Normal, 1 => Inverted
  k_delay = 0.001;       // delay constant in seconds (Step Motor Speed)
}
//---------------------------------------------------------------------------------------------
void A4983::adjust_microstepping_mode(uint8_t factor)
{
  if(factor==1)
  {
    MS1 = LOW;
    MS2 = LOW;
    MS3 = LOW;  // 1/1
  }
  else if(factor==2)
  {
    MS1 = HIGH;
    MS2 = LOW;
    MS3 = LOW;  // 1/2
  }    
  else if(factor==4)
  {
    MS1 = LOW;
    MS2 = HIGH;
    MS3 = LOW;  // 1/4
  }
  else if(factor==8)
  { 
    MS1 = HIGH;
    MS2 = HIGH;
    MS3 = LOW;  // 1/8
  }
  else if(factor==16)
  {
    MS1 = HIGH;
    MS2 = HIGH;
    MS3 = HIGH; // 1/16
  }
}
//---------------------------------------------------------------------------------------------
// Step function
//---------------------------------------------------------------------------------------------
void A4983::singlestep()
{
  if(Dir != f_motor_direction)
    Dir = f_motor_direction;
       
  Step = HIGH;
  wait(k_delay/2);

  Step = LOW;
  wait(k_delay/2);
}
//---------------------------------------------------------------------------------------------
// Release Motor Command
//---------------------------------------------------------------------------------------------
void A4983::sleep(bool value)
{
  if(value == true)
  {
    //nEnable = LOW;
    nSleep = LOW;
  }
  else
  {
    //nEnable = HIGH;
    nSleep = HIGH; 
  }
}
//---------------------------------------------------------------------------------------------
// check if f_motor_enable is true and call singlestep() - loop mode
//---------------------------------------------------------------------------------------------
void A4983::looprun()
{
  if(f_motor_enable == 1)  
  {    
    singlestep();
  }  
}
//---------------------------------------------------------------------------------------------
// enable loop mode
//---------------------------------------------------------------------------------------------
void A4983::loopstart()
{
  f_motor_enable = 1;
}
//---------------------------------------------------------------------------------------------
// disable loop mode
//---------------------------------------------------------------------------------------------
void A4983::loopstop()
{
  f_motor_enable = 0;
}
//---------------------------------------------------------------------------------------------