Example for a Magnevation Board used previously on a OOPICII
Fork of Motordriver by
Revision 6:81b393c33b77, committed 2013-02-11
- 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 |
diff -r 3110b9209d3c -r 81b393c33b77 motordriver.cpp --- 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
diff -r 3110b9209d3c -r 81b393c33b77 motordriver.h --- 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