Control Stepper Motor using Matlab via Serial port

Dependencies:   BufferedSerial X_NUCLEO_IHM01A1 mbed

Files at this revision

API Documentation at this revision

Comitter:
Arkadi
Date:
Tue Jan 26 10:22:39 2016 +0000
Child:
1:fd0fbabd0c8f
Commit message:
Stepper Control Through Matlab application

Changed in this revision

BufferedSerial.lib Show annotated file Show diff for this revision Revisions of this file
X_NUCLEO_IHM01A1.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BufferedSerial.lib	Tue Jan 26 10:22:39 2016 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/sam_grove/code/BufferedSerial/#779304f9c5d2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/X_NUCLEO_IHM01A1.lib	Tue Jan 26 10:22:39 2016 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/ST/code/X_NUCLEO_IHM01A1/#83138e702683
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Jan 26 10:22:39 2016 +0000
@@ -0,0 +1,198 @@
+////////////////////////////////////////
+// Control Stepper motor using matlab //
+// Arkadiraf@gmail.com - 24/1/2016    //
+////////////////////////////////////////
+/*
+   Parts:
+    Nucleo STM32F401RE
+    X-Nucleo-IHM01A1 Stepper Driver shield     
+    
+*/
+
+// Libraries:
+#include "mbed.h"
+#include "BufferedSerial.h"  // solves issues of loosing data. alternative doing it yourself
+#include "l6474_class.h" // stepper library
+
+/////////////
+// Objects //
+////////////
+
+// create serial object
+//Serial pc(SERIAL_TX, SERIAL_RX);
+BufferedSerial pc(USBTX, USBRX);
+
+// Pinouts:
+DigitalOut myled(LED1);
+
+// Stepper Pins
+DigitalOut StepDir(D7);
+DigitalOut StepPWM(D9);
+
+// Define Stepper Ticker
+Ticker StepperTicker;
+
+// Define Ticker
+Ticker SensorSampleTicker;
+
+// define millis ticker
+volatile uint32_t MillisValue = 0;
+Ticker MillisTicket;
+
+///////////////
+// variables //
+///////////////
+char BufferCMD[64]={0};
+uint16_t BufferIndex=0;
+volatile bool Sensor_Sample_Flag=0;
+#define Sample_Interval 10000 // interval in us, (10ms, 100Hz)
+float CMDValue=0; // CMD at which speed to run
+char inbyte=' ';
+
+// Stepper Variables:
+#define STEPS2ROTATION 3200.0f // 200 steps rotation 16 microsteps
+/* Initialization parameters. */
+// not sure if it acctually uses it
+L6474_InitTypeDef init =
+{
+    50,                              /* Acceleration rate in step/s2. Range: (0..+inf). */
+    50,                              /* Deceleration rate in step/s2. Range: (0..+inf). */
+    3500,                             /* Maximum speed in step/s. Range: (30..10000]. */
+    30,                              /* Minimum speed in step/s. Range: [30..10000). */
+    500,                              /* Torque regulation current in mA. Range: 31.25mA to 4000mA. */
+    L6474_OCD_TH_1500mA,              /* Overcurrent threshold (OCD_TH register). */
+    L6474_CONFIG_OC_SD_ENABLE,        /* Overcurrent shutwdown (OC_SD field of CONFIG register). */
+    L6474_CONFIG_EN_TQREG_TVAL_USED,  /* Torque regulation method (EN_TQREG field of CONFIG register). */
+    L6474_STEP_SEL_1_16,              /* Step selection (STEP_SEL field of STEP_MODE register). */
+    L6474_SYNC_SEL_1_2,               /* Sync selection (SYNC_SEL field of STEP_MODE register). */
+    L6474_FAST_STEP_12us,             /* Fall time value (T_FAST field of T_FAST register). Range: 2us to 32us. */
+    L6474_TOFF_FAST_8us,              /* Maximum fast decay time (T_OFF field of T_FAST register). Range: 2us to 32us. */
+    3,                                /* Minimum ON time in us (TON_MIN register). Range: 0.5us to 64us. */
+    21,                               /* Minimum OFF time in us (TOFF_MIN register). Range: 0.5us to 64us. */
+    L6474_CONFIG_TOFF_044us,          /* Target Swicthing Period (field TOFF of CONFIG register). */
+    L6474_CONFIG_SR_320V_us,          /* Slew rate (POW_SR field of CONFIG register). */
+    L6474_CONFIG_INT_16MHZ,           /* Clock setting (OSC_CLK_SEL field of CONFIG register). */
+    L6474_ALARM_EN_OVERCURRENT |
+    L6474_ALARM_EN_THERMAL_SHUTDOWN |
+    L6474_ALARM_EN_THERMAL_WARNING |
+    L6474_ALARM_EN_UNDERVOLTAGE |
+    L6474_ALARM_EN_SW_TURN_ON |
+    L6474_ALARM_EN_WRONG_NPERF_CMD    /* Alarm (ALARM_EN register). */
+};
+
+
+/* Motor Control Component. */
+L6474 *StepperMotor;
+
+// variable to store stepper position
+volatile int32_t StepperPos=0;
+
+
+////////////////
+// Functions: //
+////////////////
+// Ticker function
+void Stepper_PWM() {
+    StepPWM=!StepPWM;
+    if (StepPWM==1){ //If change to high, step performed Update Stepper Position
+     if (StepDir==1){ 
+         StepperPos++;
+     }else{
+        StepperPos--;
+     }
+    }
+}
+
+// Ticker function
+void Sensor_Sample() {
+    Sensor_Sample_Flag=1;
+}
+
+// millis ticker // its roughly gets the job done, so hell why not... (Better solution is to use SysTick)
+void MillisCounter ()
+{
+    MillisValue++;
+}
+
+// Main Code:
+int main() {
+    // Setup:
+    pc.baud(921600); 
+    
+    //Attach ticker object:   
+    SensorSampleTicker.attach_us(&Sensor_Sample, Sample_Interval); // create 10Khz Ticker
+    
+    // Attach millis ticker:
+    MillisTicket.attach_us(&MillisCounter, 1000); // create 1Khz Ticker (1ms increment) 
+    
+    // Initialize Stepper:
+        /* Initializing SPI bus. */
+    DevSPI dev_spi(D11, D12, D13);
+
+    /* Initializing Motor Control Component. */
+    //StepperMotor = new L6474(D2, D8, D7, D9, D10, dev_spi);
+    StepperMotor = new L6474(D2, D8, D3, D4, D10, dev_spi); // initialization with different Step pin and Dir Pin, Interference with external control
+    if (StepperMotor->Init() != COMPONENT_OK)
+        exit(EXIT_FAILURE);
+    
+    /*----- Changing motor setting. -----*/
+    
+    /* Setting High Impedance State to update L6474's registers. */
+    StepperMotor->SoftHiZ();
+    // Disabling motor
+    StepperMotor->Disable();
+    /* Changing step mode. */
+    StepperMotor->SetStepMode(STEP_MODE_1_16);
+    /* Increasing the torque regulation current to 500mA. */
+    StepperMotor->SetParameter(L6474_TVAL, 500);
+    
+    // Enabling motor
+    StepperMotor->Enable();
+    
+    /* Waiting 1 second. */
+    wait_ms(1000);
+    
+    ////////////
+    // Loop : //
+    ////////////
+    while(1){ 
+    
+        // receive Motor Command
+        while (pc.readable()) {
+            inbyte=pc.getc();
+            //pc.printf("%c" ,inbyte); // debug check/
+            BufferCMD[BufferIndex]=inbyte;
+            BufferIndex++;
+            // parse incoming message format: "$<value>\r\n"    
+            if (inbyte=='$'){ // start of message
+                BufferIndex=0; // initialize to start of parser   
+            }else if(inbyte=='\r'){ // end of message
+               CMDValue=atof(BufferCMD);
+               BufferIndex=0;   
+               //pc.printf("CMD: %f \r\n" ,CMDValue); // debug check/ 
+               //pc.printf("CMD: %s \r\n" ,BufferCMD); // debug check/
+               
+               /* Update Stepper Commad */
+               if (CMDValue>0){
+                    StepDir=1;
+                }else{
+                    StepDir=0;
+                    CMDValue=-CMDValue;
+                }
+               if (CMDValue<1.0f){ // Stops
+                  StepperTicker.detach(); 
+               }else{
+                   StepperTicker.attach(&Stepper_PWM,2.0f/CMDValue); // Set Stepper Freq, 2.0f/Freq : 2 calls to ticker object performs a step
+               }
+     
+            }//end parser  
+        }//end serial
+        
+        if(Sensor_Sample_Flag){ // sample data and stream out.
+            Sensor_Sample_Flag=0;
+            /* Stream Data */
+            pc.printf("VAL:%d,%d\r\n" ,MillisValue,StepperPos); // Stream data
+        }// End sampling and stream data
+    }// end loop
+}// end main
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Tue Jan 26 10:22:39 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/6f327212ef96
\ No newline at end of file