Simple DC motor control commands for driving DC motor conroller with PWM and up to 2 direction signals (complementary). Takes float value from -1.0 to 1.0.

Dependents:   Teensy_Mot_QEI_Ser_20180111 Axis Axis_20181108 Axis_version2

Fork of MotCon by Joseph Bradshaw

Overloaded class that takes a pwm motor control pin and one or two direction pins for driving DC motors with a variety of motor control IC's. Tested examples include the LM298, TD340, MC33926, A3949.

Revision:
5:3e07f69d8abd
Parent:
4:10187d108666
diff -r 10187d108666 -r 3e07f69d8abd MotCon.cpp
--- a/MotCon.cpp	Mon May 23 19:06:31 2016 +0000
+++ b/MotCon.cpp	Tue Oct 18 11:32:36 2016 +0000
@@ -1,66 +1,162 @@
+#include "mbed.h"
 #include "MotCon.h"
 
 //Constructor
-MotCon::MotCon(PinName pwm, PinName dir) : _pwm(pwm), _dir(dir) {
-    _pwm.period_us(50);
-    _pwm = 0.0;
-    _dir = 0;
+MotCon::MotCon(PinName pwm_pin, PinName dir1_pin) : _pwm_pin(pwm_pin), _dir1_pin(dir1_pin), _dir2_pin(NC) {
+    _dir2 = false;
+    _pwm_pin.period_us(50);
+    _pwm_pin = 0.0;
+    _dir1_pin = 0;
+}
+MotCon::MotCon(PinName pwm_pin, PinName dir1_pin, PinName dir2_pin) : _pwm_pin(pwm_pin), _dir1_pin(dir1_pin), _dir2_pin(dir2_pin) {
+    _dir2 = true;
+    _pwm_pin.period_us(50);
+    _pwm_pin = 0.0;
+    _dir1_pin = 0;
+    _dir2_pin = 0;
+    
+    mc_mode = 0;    //mode pin determines braking (1 = dynamic braking, 0 = free-wheeling)    
+}
+// dc is signed duty cycle (+/-1.0)
+void MotCon::mot_control(float dc){    
+    if(dc>1.0)
+        dc=1.0;
+    if(dc<-1.0)
+        dc=-1.0;
+            
+    if(_dir2){            
+        if(dc > 0.001){
+            _dir1_pin = 0;
+            _dir2_pin = 1;
+            _pwm_pin = dc;
+        }
+        else if(dc < -0.001){
+            _dir2_pin = 0;
+            _dir1_pin = 1;        
+            _pwm_pin = abs(dc);
+        }
+        else{
+            if(mc_mode){
+                _dir1_pin = 0;
+                _dir2_pin = 0;
+                _pwm_pin = 1.0;                
+            }
+            else{
+                _dir1_pin = 0;
+                _dir2_pin = 0;
+                _pwm_pin = 0.0;
+            }
+        }         
+    }
+    else{            
+        if(dc > 0.001){
+            _dir1_pin = 0;
+            _pwm_pin = dc;
+        }
+        else if(dc < -0.001){
+            _dir1_pin = 1;
+            _pwm_pin = abs(dc);
+        }
+        else{
+            _dir1_pin = 0;
+            _pwm_pin = 0.0;
+        }             
+    }
 }
 
 // dc is signed duty cycle (+/-1.0)
-void MotCon::mot_control(float dc){        
+void MotCon::mot_control(float dc, int invert){
     if(dc>1.0)
         dc=1.0;
     if(dc<-1.0)
         dc=-1.0;
-        
-    if(dc > 0.001){
-        _dir = 0;
-        _pwm = dc;
+                
+    if(_dir2){
+        if(invert==0){
+            if(dc > 0.001){
+                _dir1_pin = 0;
+                _dir2_pin = 1;
+                _pwm_pin = dc;
+            }
+            else if(dc < -0.001){
+                _dir2_pin = 0;
+                _dir1_pin = 1;
+                _pwm_pin = abs(dc);
+            }
+            else{
+                if(mc_mode){
+                    _dir1_pin = 0;
+                    _dir2_pin = 0;
+                    _pwm_pin = 1.0;                
+                }
+                else{
+                    _dir1_pin = 0;
+                    _dir2_pin = 0;
+                    _pwm_pin = 0.0;
+                }
+            }
+        }
+        else{
+            if(dc > 0.001){
+                _dir2_pin = 0;
+                _dir1_pin = 1;
+                _pwm_pin = dc;
+            }
+            else if(dc < -0.001){
+                _dir1_pin = 0;
+                _dir2_pin = 1;
+                _pwm_pin = abs(dc);
+            }
+            else{
+                if(mc_mode){
+                    _dir1_pin = 0;
+                    _dir2_pin = 0;
+                    _pwm_pin = 1.0;                
+                }
+                else{
+                    _dir1_pin = 0;
+                    _dir2_pin = 0;
+                    _pwm_pin = 0.0;
+                }
+            }
+        }
     }
-    else if(dc < -0.001){
-        _dir = 1;
-        _pwm = abs(dc);
-    }
-    else{
-        _dir = 0;
-        _pwm = 0.0;
-    }      
+    else{        
+        if(invert==0){
+            if(dc > 0.001){
+                _dir1_pin = 0;
+                _pwm_pin = dc;
+            }
+            else if(dc < -0.001){
+                _dir1_pin = 1;
+                _pwm_pin = abs(dc);
+            }
+            else{
+                _dir1_pin = 0;
+                _pwm_pin = 0.0;
+            }
+        }
+        else{
+            if(dc > 0.001){
+                _dir1_pin = 1;
+                _pwm_pin = dc;
+            }
+            else if(dc < -0.001){
+                _dir1_pin = 0;
+                _pwm_pin = abs(dc);
+            }
+            else{
+                _dir1_pin = 0;
+                _pwm_pin = 0.0;
+            }
+        }    
+    }    
 }
 
-// dc is signed duty cycle (+/-1.0)
-void MotCon::mot_control(float dc, int invert){        
-    if(dc>1.0)
-        dc=1.0;
-    if(dc<-1.0)
-        dc=-1.0;
-        
-    if(invert==0){
-        if(dc > 0.001){
-            _dir = 0;
-            _pwm = dc;
-        }
-        else if(dc < -0.001){
-            _dir = 1;
-            _pwm = abs(dc);
-        }
-        else{
-            _dir = 0;
-            _pwm = 0.0;
-        }
-    }
-    else{
-        if(dc > 0.001){
-            _dir = 1;
-            _pwm = dc;
-        }
-        else if(dc < -0.001){
-            _dir = 0;
-            _pwm = abs(dc);
-        }
-        else{
-            _dir = 0;
-            _pwm = 0.0;
-        }
-    }
+void MotCon::setMode(bool mode){
+    mc_mode = mode;
 }
+
+bool MotCon::getMode(void){
+    return mc_mode;
+}
\ No newline at end of file