DRV8825 steeper motor controller with serial interface for delimited matlab input input format dir,step, delay

Dependencies:   mbed

main.cpp

Committer:
kanatronics
Date:
2016-09-21
Revision:
1:19ba52379a64
Parent:
0:24171bdfc41f

File content as of revision 1:19ba52379a64:

/*Kamil Kanas QUB
NUCLEO FR401 Serial Stepper motor controller DRV8825
Matlab interface: dir,step,speed
15/9/2016
*/


#include "mbed.h"

/*--INITS-------------------------------------------------------------------------------*/
Serial pc(USBTX, USBRX);       // create PC interface
DigitalOut stepOut(PA_7);      // step output
DigitalOut dirOut(PA_6);       // direction output
DigitalOut enableOut(PA_8);    // enable output   
DigitalOut ledGreen (PA_5);    // green ready led

/*--VARIABLES---------------------------------------------------------------------------*/
char buffer[16];                //Serial buffer
uint8_t direction;              //Direction 0 - right, 1- left
uint16_t step;                  //step 0-400 full turn in half step mode 
uint16_t speed;                 //speed
char *pch;                      //auxilary pointer to buffer
char *mot_char[16];             //motor char
int mot_int[3];                 //motor int 
/*--FUNCTION DECLARATIONS---------------------------------------------------------------*/

void int_usb(void);
void stepMOtor (int,int,int);
void stepDemo (void);

/*--FUNCTION DEFINITIONS----------------------------------------------------------------*/

/*
 void int_usb (void) // initialize serial connection
*/

void int_usb(void)

 {
     pc.baud(115200);                                  /*Set baud rate*/   
 }        


/* stepMottor
   int dir 0- right, 1- left
   int steps 0-200 full step mode
   int speed
*/
   
void stepMOtor(int dir, int steps, int speedS )        

{

 if (!dir)                                                        // Checking direction flag
  {
    enableOut=0;
    dirOut=0;                                                     // drive right 
                                                              
  }
    else
      {
        enableOut=0;
        dirOut=1;                                                 // drive left  
      }

 int deg;

    for (deg=0;deg<steps;deg++)
  {
   
    stepOut=1;
    wait_us(500);
    stepOut=0;
    wait_ms(speedS);
    if (deg==steps-2)
      {
              pc.printf("ready %s\n");
              ledGreen=1;         // ready status ON
      }
  }
 }

/*
void stepDemo(void);
full motor revolution 
0.8 deg / sec
*/

void stepDemo (void)
{
    enableOut=0;
    dirOut=0;                                                            // Enables the motor direction right
       for(int x = 0; x < 199; x++) {                                    // Makes 400 steps for full revolution
         stepOut=1; 
          wait_us(1000); 
         stepOut=0;
      wait_ms(999);
      }
}

int main() {
   int_usb(); 
   enableOut=1;
  
   while(1){ 
        //pc.printf("Hello %s \n"); 
        wait(0.5);
            while(true){
            while (pc.readable()) {                    //if data in the ring buffer
                     pc.gets(buffer,16);               //read 7 characters
                     ledGreen=0;
                  //pc.printf("stringReceived %s ", buffer);
                   char * pch;
                    pch = strtok (buffer,",");
                      int i=0;
                      while (pch != NULL)
                        
                        {
                         mot_char[i++] = pch;
                         pch = strtok (NULL, ","); 
                        }
                       
                       for (i = 0; i < 3; ++i) {
                          //pc.printf("%s\n", mot_char[i]);
                         mot_int[i]=atoi(mot_char[i]);
                         pc.printf("%d\n", mot_int[i]);
                       }
                       stepMOtor(mot_int[0],mot_int[1],mot_int[2]);
                       enableOut=1;
            break; }

       }
     }
  }