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 Matt Rogers

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?

UserRevisionLine numberNew 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 }