Bipolar Full H Bridge Stepper Motor Control

Dependencies:   mbed

Full H Bridge Stepper Motor Demo software

Simple demo playing binary control lookup tables for dual full h bridge with driver.

http://en.wikipedia.org/wiki/H_bridge

Information

This demo requires a dual full h bridge (with mosfet driver, if separate mosfets are used) Not an integrated motor control IC

Inputs and Outputs

Input p18: Step pulse (if enabled) p19: Speed analog (if enabled) p20: Direction

Output p21: L1 p22: L2 p23: H1 p24: H2 p25: H3 p26: H4 p27: L3 p28: L4

Dual H Bridge

------------------------------------------ V+
 |			|		 |			|		
 \H1		\H2		 \H3		\H4	
 |----MA----|		 |----MB----|		
 \L1		\L2		 \L3		\L4	
 |			|		 |			|		
 ----------------------------------------- V- 

Files at this revision

API Documentation at this revision

Comitter:
jeroen3
Date:
Mon Sep 30 08:01:26 2013 +0000
Commit message:
Initial release

Changed in this revision

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
diff -r 000000000000 -r 896d8456cb58 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Sep 30 08:01:26 2013 +0000
@@ -0,0 +1,158 @@
+ /**    
+ * @file    main.cpp
+ * @brief   Bipolar Steppr Motor Control with dual H Bridge
+ * @details Software plays stepper motor lookup tables for dual h bridge control.
+ *                  
+ *
+ * @Author  Jeroen Lodder
+ * @Date    September 2013
+ * @version 1
+ *
+ */
+
+#include "mbed.h"
+
+/* IO declarations */
+    /* LED coil indicators */
+    BusOut leds(LED1, LED2, LED3, LED4);
+    /* H Bridge output IO */
+    BusOut motor(p21, p22, p23, p24, p25, p26, p27, p28);
+    /* MOSFET io 
+     *  FET         L1  L2  H1  H2      H3  H4  L3  L4
+     *  Motor       MA                  MB          
+     *  mbed        p21 p22 p23 p24     p25 p26 p27 p28
+     * ------------------------ V+
+     * |      |       |      |       
+     * \H1    \H2     \H3    \H4 
+     * |--MA--|       |--MB--|       
+     * \L1    \L2     \L3    \L4 
+     * |      |       |      |       
+     * ------------------------ V- 
+     */
+
+/* Single phase control */
+const uint8_t motortable_singlephase[4]     = { 
+    0x09    ,
+    0x90    ,
+    0x06    ,
+    0x60    
+};
+
+/* Dual phase motor control */
+const uint8_t motortable_dualphase[4]       = { 
+    0x99 ,
+    0x96 ,
+    0x66 ,
+    0x69
+};
+
+/* Half step motor control */
+const uint8_t motortable_half_step[8]           =    {  
+    0x09 ,
+    0x99 ,
+    0x90 ,
+    0x96 ,
+    0x06 ,
+    0x66 ,
+    0x60 ,
+    0x69
+};
+
+/* LED coil indicators tables */
+const uint8_t ledtable_singlephase[4]   =   {   0x4,0x2,0x8,0x1 };
+const uint8_t ledtable_dualphase[4]     =   {   0x6,0xA,0x9,0x5 };
+const uint8_t ledtable_half_step[8]     = { 0x4,0x6,0x2,0xA,0x8,0x9,0x1,0x5 };
+
+/* Fet driver definitions */
+    /* Turn off time fet driver in micro seconds (uS) */
+    #define TURN_ON_TIME_FET_DRIVER 750
+
+/* Control definitions */
+    /* Mutliplier of speed wait time setting */ 
+    #define SPEED_SCALING   0.05
+
+int main(void) {
+/* Control declarations */
+    /* Direction LUT are played */
+    DigitalIn direction( p20 ); 
+    /* Step pulse input if step mode */
+    DigitalIn step( p18 );
+    /* Speed potmeter input */
+    AnalogIn    speed( p19 );
+
+/* config variables */
+    /* Autostep or stepmode with step input */
+    uint8_t autostep = 1;
+    /* Halfstep or Dual phase mode */
+    uint8_t halfstep = 0;
+ 
+    
+/* Stepper motor control loop */    
+    while(1) {
+        if( halfstep ){
+            if(direction){
+                for(int i=0; i<8; i++) {
+                    leds    = ledtable_half_step[i];
+                    motor =  0;
+                    wait_us(TURN_ON_TIME_FET_DRIVER);
+                    motor =  motortable_half_step[i];
+                    /* Delay */
+                    if(!autostep){                      
+                        while(!step);
+                        wait(0.001);
+                        while(step);
+                    }else{
+                        wait((speed*SPEED_SCALING)+0.001);
+                    }
+                }
+            }else{
+                for(int i=7; i>-1; i--) {
+                    leds    = ledtable_half_step[i];
+                    motor =  0;
+                    wait_us(TURN_ON_TIME_FET_DRIVER);
+                    motor =  motortable_half_step[i];
+                    /* Delay */
+                    if(!autostep){                      
+                        while(!step);
+                        wait(0.001);
+                        while(step);
+                    }else{
+                        wait((speed*SPEED_SCALING)+0.001);
+                    }
+                }
+            }
+        }else{ /* Half step */
+            if(direction){
+                for(int i=0; i<4; i++) {
+                    leds    = ledtable_dualphase[i];
+                    motor =  0;
+                    wait_us(TURN_ON_TIME_FET_DRIVER);
+                    motor =  motortable_dualphase[i];
+                    /* Delay */
+                    if(!autostep){                      
+                        while(!step);
+                        wait(0.001);
+                        while(step);
+                    }else{
+                        wait((speed*SPEED_SCALING)+0.001);
+                    }
+                }
+            }else{
+                for(int i=3; i>-1; i--) {
+                    leds    = ledtable_dualphase[i];
+                    motor = 0;
+                    wait_us(TURN_ON_TIME_FET_DRIVER);
+                    motor =  motortable_dualphase[i];
+                    /* Delay */
+                    if(!autostep){                      
+                        while(!step);
+                        wait(0.001);
+                        while(step);
+                    }else{
+                        wait((speed*SPEED_SCALING)+0.001);
+                    }
+                }
+            }
+        }
+    }
+}
diff -r 000000000000 -r 896d8456cb58 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Mon Sep 30 08:01:26 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/a9913a65894f
\ No newline at end of file