Example for a Magnevation Board used previously on a OOPICII

Fork of Motordriver by Christopher Hasler

Files at this revision

API Documentation at this revision

Comitter:
Degs
Date:
Mon Feb 11 21:44:17 2013 +0000
Parent:
5:3110b9209d3c
Commit message:
Motordriver adapted for the Magnevation Board used previously with OOPICII

Changed in this revision

motordriver.cpp Show annotated file Show diff for this revision Revisions of this file
motordriver.h Show annotated file Show diff for this revision Revisions of this file
--- a/motordriver.cpp	Thu Nov 25 13:34:15 2010 +0000
+++ b/motordriver.cpp	Mon Feb 11 21:44:17 2013 +0000
@@ -1,11 +1,11 @@
 /*motor driver libary modified from the following libary,
 *
 * mbed simple H-bridge motor controller
-* Copyright (c) 2007-2010, sford
+* Copyright (c) 2007-2010, S Ford
 *
-* by Christopher Hasler.
+* by Derek Calland modified for a Magnevation PWM Driver Board based on LMD18200T H-Bridge Driver IC's
 *
-* from sford's libary,
+* from Christopher Hasler originally from Simon Ford's libary,
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
@@ -30,111 +30,40 @@
 
 #include "mbed.h"
 
-Motor::Motor(PinName pwm, PinName fwd, PinName rev, int brakeable):
-        _pwm(pwm), _fwd(fwd), _rev(rev) {
+Motor::Motor(PinName pwm, PinName fwdrev, PinName brake, bool direction, bool stop): ///Class Implementation
+    _pwm(pwm), _fwdrev(fwdrev), _brake(brake)
+{
+    _direction = direction; //Set each motor to rotate in clockwise or counter clockwise
+    _stop = stop; //Stop all motion
 
     // Set initial condition of PWM
     _pwm.period(0.001);
     _pwm = 0;
 
     // Initial condition of output enables
-    _fwd = 0;
-    _rev = 0;
+    _fwdrev = fwdrev; //sets output to drive Motor in a direction
+    /* check the motor to see what direction this is from Magnevation Board */
 
-    //set if the motor dirver is capable of braking. (addition)
-    Brakeable= brakeable;
-    sign = 0;//i.e nothing.
+    //Initial condition of Brake
+    _brake = brake; //sets brake to ON/OFF condition to Magnevation Board
 }
 
-float Motor::speed(float speed) {
-    float temp = 0;
-    if (sign == 0) {
-        _fwd = (speed > 0.0);
-        _rev = (speed < 0.0);
-        temp = abs(speed);
-        _pwm = temp;
-    } else if (sign == 1) {
-        if (speed < 0) {
-            _fwd = (speed > 0.0);
-            _rev = (speed < 0.0);
-            _pwm = 0;
-            temp = 0;
-       } else {
-            _fwd = (speed > 0.0);
-            _rev = (speed < 0.0);
-            temp = abs(speed);
-            _pwm = temp;
-        }
-    } else if (sign == -1) {
-        if (speed > 0) {
-            _fwd = (speed > 0.0);
-            _rev = (speed < 0.0);
-            _pwm = 0;
-            temp = 0;
-        } else {
-            _fwd = (speed > 0.0);
-            _rev = (speed < 0.0);
-            temp = abs(speed);
-            _pwm = temp;
-        }
-    }
-    if (speed > 0)
-        sign = 1;
-    else if (speed < 0) {
-        sign = -1;
-    } else if (speed == 0) {
-        sign = 0;
-    }
-    return temp;
-}
-//  (additions)
-void Motor::coast(void) {
-    _fwd = 0;
-    _rev = 0;
-    _pwm = 0;
-    sign = 0;
+float Motor::speed(float speed, bool direction, bool stop)
+{
+    _fwdrev = direction;
+    _brake = stop; //Sets brake to ON/OFF condition to Magnevation Board
+    _pwm = abs(speed);
+    return speed;
 }
 
-float Motor::stop(float duty) {
-    if (Brakeable == 1) {
-        _fwd = 1;
-        _rev = 1;
-        _pwm = duty;
-        sign = 0;
-        return duty;
-    } else
-        Motor::coast();
-        return -1;
+float Motor::stop(float speed, bool stop)
+{
+    if (speed == 0.0) {
+        wait(0.02);
+        _brake = stop;
+    }
+    _pwm = abs(speed);
+    return speed;
 }
 
-float Motor::state(void) {
-    if ((_fwd == _rev) && (_pwm > 0)) {
-        return -2;//braking
-    } else if (_pwm == 0) {
-        return 2;//coasting
-    } else if ((_fwd == 0) && (_rev == 1)) {
-        return -(_pwm);//reversing
-    }  else if ((_fwd == 1) && (_rev == 0)) {
-        return _pwm;//fowards
-    } else
-        return -3;//error
-}
 
-/*
- test code, this demonstrates working motor drivers.
-
-Motor A(p22, p6, p5, 1); // pwm, fwd, rev, can break
-Motor B(p21, p7, p8, 1); // pwm, fwd, rev, can break
-int main() {
-    for (float s=-1.0; s < 1.0 ; s += 0.01) {
-       A.speed(s);
-       B.speed(s);
-       wait(0.02);
-    }
-    A.stop();
-    B.stop();
-    wait(1);
-    A.coast();
-    B.coast();
-}
-*/
\ No newline at end of file
--- a/motordriver.h	Thu Nov 25 13:34:15 2010 +0000
+++ b/motordriver.h	Mon Feb 11 21:44:17 2013 +0000
@@ -1,11 +1,11 @@
 /*motor driver libary modified from the following libary,
-*  
+*
 * mbed simple H-bridge motor controller
 * Copyright (c) 2007-2010, sford
-* 
-* by Christopher Hasler.
-* 
-* from sford's libary,
+*
+*by Derek Calland modified for a Magnevation PWM Driver Board based on LMD18200T H-Bridge Driver IC's
+*
+*from SFord's libary, and some comments program structure from Christopher Haslers
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
@@ -25,67 +25,63 @@
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
- 
+
 #ifndef MBED_MOTOR_H
 #define MBED_MOTOR_H
- 
+
 #include "mbed.h"
- 
-/** Interface to control a standard DC motor 
+
+/** Interface to control a standard DC motor
 * with an H-bridge using a PwmOut and 2 DigitalOuts
-*/
-class Motor {
-    public:
- 
-/** Create a motor control interface    
-*
-* @param pwm A PwmOut pin, driving the H-bridge enable line to control the speed
-* @param fwd A DigitalOut, set high when the motor should go forward
-* @param rev A DigitalOut, set high when the motor should go backwards
-* @param set if the motor driver is able to do braking 0 false 1 true.
-*/
-        Motor(PinName pwm, PinName fwd, PinName rev, int brakeable);
-  
-/** Set the speed of the motor 
-* 
-* @param speed The speed of the motor as a normalised value between -1.0 and 1.0.
-* @return the applied speed to the motor after checking to ensure motor doesn't switch from forward to reverse without stopping.
-*/
-        float speed(float speed);
-        
-/** Set the the motor to coast
-* 
-* @param void 
-* @return motor coasts until another instruction is recived.
-*/        
-  
-        void coast(void);
-
-/** Set the motor to dynamicaly brake
-* 
-* @param float 0 - 1.0 provides some control over how hard the motor brakes. 
-* @return duty applied to motor driver. -1 is error, motor driver can't brake.
+* Specifically for the Magnevation Board - refer to comments
 */
 
-        float stop(float duty);
-/** return the current state of the motor
-*
-* @param void
-* @return state of motor, -1 to 1 is speed, -2 is braking, 2 is coasting. -3 is error. 
-*/
-        float state(void);
-        
-    protected:
-        PwmOut _pwm;
-        DigitalOut _fwd;
-        DigitalOut _rev;
-        int Brakeable; // cna the motor driver break
-        int sign; //prevents throwing the motor from full foward to full reverse and stuff melting.
- 
+class Motor   ///Class Declaration
+{
+public:
+
+    /** Create a motor control interface
+    *
+    * @param pwm, A PwmOut pin driving the H-bridge enable line to control the speed
+    * @param fwdrev, A DigitalOut pin note Forward and Reverse is relative to how you connect the motor(s)
+    * and Refer to Figure 4 pages 6 & 7 in Instrument LMD18200 data sheet.
+    * @param brake, A DigitalOut pin the Magnevation driver board is able to perform a brake i.e. 0 false brake ON, 1 true brake OFF.
+    */
+    Motor(PinName pwm, PinName fwdrev, PinName brake, bool direction, bool stop); /** Create Motor instance */
+    
+    /** Set the speed of the motor
+    *
+    * @param speed The speed of the motor as a normalised value between 0.0 and 1.0.
+    * @param fwdrev Magnevation board sets direction on a pin so does not need -1.0 to 0.0.
+    * @param stop The Magnevation Board has a brake facility and incorporates the Current Limiting features of the LMD18200.
+    * @return the applied speed to the motor after checking to ensure motor doesn't switch from forward to reverse without stopping.
+    */
+    float speed(float speed, bool fwdrev, bool stop);
+
+    /** Set the the motor to coast
+    *
+    * In a practical world you would not neccessarily leave anything 'coasting' and acting as a dc generator
+    * always better to have a drive under control at all times so I haven't included this
+    * from the origanal class constructor for the Magnevation Board.
+    */
+
+    /** Set the motor to dynamicaly brake
+    *
+    * The Magnevation Board has a brake facility and incorporates the Current Limiting features
+    * of the LMD18200.
+    */
+
+    float stop(float speed, bool stop);
+    /** return the current state of the motor
+    */
+
+protected:
+    PwmOut _pwm;
+    DigitalOut _fwdrev;
+    DigitalOut _brake;
+    bool _direction;
+    bool _stop;
+
 };
 
-
-
-
-
 #endif