Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of MotorDriver by
MotorDriver.cpp@3:7a6365365ee2, 2016-04-28 (annotated)
- Committer:
- knotbeer
- Date:
- Thu Apr 28 02:38:16 2016 +0000
- Revision:
- 3:7a6365365ee2
- Parent:
- 1:15e17abb9f29
Documentation Updates;
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| electromotivated | 0:871adb9cf798 | 1 | #include "MotorDriver.h" |
| electromotivated | 0:871adb9cf798 | 2 | #include "mbed.h" |
| electromotivated | 0:871adb9cf798 | 3 | #include <cmath> |
| electromotivated | 0:871adb9cf798 | 4 | |
| electromotivated | 0:871adb9cf798 | 5 | // See .h file for function descriptions and details |
| knotbeer | 1:15e17abb9f29 | 6 | MotorDriver::MotorDriver(DigitalOut in1, DigitalOut in2, PwmOut pwm, float pwmFreq, bool isBrakeable) |
| knotbeer | 1:15e17abb9f29 | 7 | : _in1(in1), _in2(in2), _pwm(pwm) |
| electromotivated | 0:871adb9cf798 | 8 | { |
| electromotivated | 0:871adb9cf798 | 9 | // Initialize motor and variables |
| knotbeer | 1:15e17abb9f29 | 10 | _in1 = 1; |
| knotbeer | 1:15e17abb9f29 | 11 | _in2 = 0; |
| knotbeer | 1:15e17abb9f29 | 12 | _pwm = 0.0; |
| knotbeer | 1:15e17abb9f29 | 13 | this->isBrakeable = isBrakeable; |
| knotbeer | 1:15e17abb9f29 | 14 | _pwm.period(1.0f/pwmFreq); |
| electromotivated | 0:871adb9cf798 | 15 | determineState(); |
| electromotivated | 0:871adb9cf798 | 16 | } |
| electromotivated | 0:871adb9cf798 | 17 | |
| knotbeer | 1:15e17abb9f29 | 18 | void MotorDriver::determineState() |
| knotbeer | 1:15e17abb9f29 | 19 | { |
| knotbeer | 1:15e17abb9f29 | 20 | if(_in1==1 && _in2==1) { |
| electromotivated | 0:871adb9cf798 | 21 | motor_state.code = BRAKING; |
| knotbeer | 1:15e17abb9f29 | 22 | motor_state.value = _pwm; |
| knotbeer | 1:15e17abb9f29 | 23 | } else if(_in1==1 && _in2==0) { |
| electromotivated | 0:871adb9cf798 | 24 | motor_state.code = DRIVING_CW; |
| electromotivated | 0:871adb9cf798 | 25 | motor_state.value = _pwm; |
| knotbeer | 1:15e17abb9f29 | 26 | } else if(_in1==0 && _in2==1) { |
| electromotivated | 0:871adb9cf798 | 27 | motor_state.code = DRIVING_CCW; |
| knotbeer | 1:15e17abb9f29 | 28 | motor_state.value = _pwm; |
| knotbeer | 1:15e17abb9f29 | 29 | } else if(_in1==0 && _in2==0) { |
| electromotivated | 0:871adb9cf798 | 30 | motor_state.code = COASTING; |
| electromotivated | 0:871adb9cf798 | 31 | motor_state.value = _pwm; |
| knotbeer | 1:15e17abb9f29 | 32 | } else { |
| knotbeer | 1:15e17abb9f29 | 33 | motor_state.code = MOTOR_ERROR; // Undefined config found |
| knotbeer | 1:15e17abb9f29 | 34 | motor_state.value = _pwm; |
| electromotivated | 0:871adb9cf798 | 35 | } |
| electromotivated | 0:871adb9cf798 | 36 | } |
| electromotivated | 0:871adb9cf798 | 37 | |
| knotbeer | 1:15e17abb9f29 | 38 | State_t MotorDriver::setSpeed(float speed) |
| knotbeer | 1:15e17abb9f29 | 39 | { |
| electromotivated | 0:871adb9cf798 | 40 | // Prevent instantaneous reversal; put into brake if requested to do so |
| knotbeer | 1:15e17abb9f29 | 41 | bool isTryingToInstantReverse = |
| knotbeer | 1:15e17abb9f29 | 42 | (bool)((speed < 0.0f) && (motor_state.code == DRIVING_CW) && (_pwm > 0.05f)) || |
| knotbeer | 1:15e17abb9f29 | 43 | (bool)((speed > 0.0f) && (motor_state.code == DRIVING_CCW)&& (_pwm > 0.05f)); |
| knotbeer | 1:15e17abb9f29 | 44 | if(isTryingToInstantReverse) { |
| knotbeer | 3:7a6365365ee2 | 45 | // Set motor to brake, set state to error |
| electromotivated | 0:871adb9cf798 | 46 | coast(); |
| knotbeer | 1:15e17abb9f29 | 47 | motor_state.code = MOTOR_ERROR; |
| knotbeer | 1:15e17abb9f29 | 48 | motor_state.value = _pwm; |
| electromotivated | 0:871adb9cf798 | 49 | return motor_state; |
| knotbeer | 1:15e17abb9f29 | 50 | } else { |
| knotbeer | 1:15e17abb9f29 | 51 | if(speed == 0.0f) { |
| knotbeer | 3:7a6365365ee2 | 52 | // No effect to _in pins |
| knotbeer | 1:15e17abb9f29 | 53 | } else { |
| knotbeer | 1:15e17abb9f29 | 54 | _in1 = (speed>0.0f); |
| knotbeer | 1:15e17abb9f29 | 55 | _in2 = (speed<0.0f); |
| electromotivated | 0:871adb9cf798 | 56 | } |
| electromotivated | 0:871adb9cf798 | 57 | _pwm = std::abs(speed); |
| electromotivated | 0:871adb9cf798 | 58 | determineState(); |
| electromotivated | 0:871adb9cf798 | 59 | return motor_state; |
| electromotivated | 0:871adb9cf798 | 60 | } |
| electromotivated | 0:871adb9cf798 | 61 | } |
| electromotivated | 0:871adb9cf798 | 62 | |
| knotbeer | 1:15e17abb9f29 | 63 | State_t MotorDriver::forceSetSpeed(float speed) |
| knotbeer | 1:15e17abb9f29 | 64 | { |
| knotbeer | 1:15e17abb9f29 | 65 | if(speed == 0.0f) { |
| knotbeer | 1:15e17abb9f29 | 66 | // No effect to _in pins |
| knotbeer | 1:15e17abb9f29 | 67 | } else { |
| knotbeer | 1:15e17abb9f29 | 68 | _in1 = (speed>0.0f); |
| knotbeer | 1:15e17abb9f29 | 69 | _in2 = (speed<0.0f); |
| knotbeer | 1:15e17abb9f29 | 70 | } |
| knotbeer | 1:15e17abb9f29 | 71 | _pwm = std::abs(speed); |
| knotbeer | 1:15e17abb9f29 | 72 | determineState(); |
| knotbeer | 1:15e17abb9f29 | 73 | return motor_state; |
| electromotivated | 0:871adb9cf798 | 74 | } |
| electromotivated | 0:871adb9cf798 | 75 | |
| knotbeer | 1:15e17abb9f29 | 76 | State_t MotorDriver::brake(float intensity) |
| knotbeer | 1:15e17abb9f29 | 77 | { |
| electromotivated | 0:871adb9cf798 | 78 | if(!isBrakeable) coast(); |
| knotbeer | 1:15e17abb9f29 | 79 | else { |
| knotbeer | 1:15e17abb9f29 | 80 | _in1=1; |
| knotbeer | 1:15e17abb9f29 | 81 | _in2=1; |
| knotbeer | 1:15e17abb9f29 | 82 | _pwm = _pwm * (1.0f - intensity); |
| electromotivated | 0:871adb9cf798 | 83 | } |
| electromotivated | 0:871adb9cf798 | 84 | determineState(); |
| electromotivated | 0:871adb9cf798 | 85 | return motor_state; |
| electromotivated | 0:871adb9cf798 | 86 | } |
| electromotivated | 0:871adb9cf798 | 87 | |
| knotbeer | 1:15e17abb9f29 | 88 | State_t MotorDriver::coast() |
| knotbeer | 1:15e17abb9f29 | 89 | { |
| knotbeer | 1:15e17abb9f29 | 90 | _in1=0; |
| knotbeer | 1:15e17abb9f29 | 91 | _in2=0; |
| knotbeer | 1:15e17abb9f29 | 92 | _pwm = 1.0; |
| electromotivated | 0:871adb9cf798 | 93 | determineState(); |
| electromotivated | 0:871adb9cf798 | 94 | return motor_state; |
| electromotivated | 0:871adb9cf798 | 95 | } |
| electromotivated | 0:871adb9cf798 | 96 | |
| knotbeer | 1:15e17abb9f29 | 97 | State_t MotorDriver::getState() |
| knotbeer | 1:15e17abb9f29 | 98 | { |
| electromotivated | 0:871adb9cf798 | 99 | return motor_state; |
| electromotivated | 0:871adb9cf798 | 100 | } |
