Basic Motor Driver library. Being used with BTS7970 on the RC-AutoBot project. The latest DIY project created by your favorite open-source company: Clownface.space
Fork of MotorDriver by
MotorDriver.cpp@4:9283a3f684af, 2016-04-30 (annotated)
- Committer:
- knotbeer
- Date:
- Sat Apr 30 05:38:43 2016 +0000
- Revision:
- 4:9283a3f684af
- Parent:
- 3:7a6365365ee2
API Documentation
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 | } |