otamesi

Dependencies:   mbed

Committer:
394
Date:
Mon Oct 22 01:28:54 2018 +0000
Revision:
7:1c1b782263cf
Parent:
0:a01fda36fde8
10/22; 10:29

Who changed what in which revision?

UserRevisionLine numberNew contents of line
seangshim 0:a01fda36fde8 1 #include "motordriver.h"
seangshim 0:a01fda36fde8 2 #include "mbed.h"
seangshim 0:a01fda36fde8 3
seangshim 0:a01fda36fde8 4 Motor::Motor(PinName pwm, PinName fwd, PinName rev, int brakeable):
seangshim 0:a01fda36fde8 5 _pwm(pwm), _fwd(fwd), _rev(rev) {
seangshim 0:a01fda36fde8 6
seangshim 0:a01fda36fde8 7 // Set initial condition of PWM
seangshim 0:a01fda36fde8 8 _pwm.period(0.001);
seangshim 0:a01fda36fde8 9 _pwm = 0;
seangshim 0:a01fda36fde8 10
seangshim 0:a01fda36fde8 11 // Initial condition of output enables
seangshim 0:a01fda36fde8 12 _fwd = 0;
seangshim 0:a01fda36fde8 13 _rev = 0;
seangshim 0:a01fda36fde8 14
seangshim 0:a01fda36fde8 15 //set if the motor dirver is capable of braking. (addition)
seangshim 0:a01fda36fde8 16 Brakeable= brakeable;
seangshim 0:a01fda36fde8 17 sign = 0;//i.e nothing.
seangshim 0:a01fda36fde8 18 }
seangshim 0:a01fda36fde8 19
seangshim 0:a01fda36fde8 20 float Motor::speed(float speed) {
seangshim 0:a01fda36fde8 21 float temp = 0;
seangshim 0:a01fda36fde8 22 if (sign == 0) {
seangshim 0:a01fda36fde8 23 _fwd = (speed > 0.0);
seangshim 0:a01fda36fde8 24 _rev = (speed < 0.0);
seangshim 0:a01fda36fde8 25 temp = abs(speed);
seangshim 0:a01fda36fde8 26 _pwm = temp;
seangshim 0:a01fda36fde8 27 } else if (sign == 1) {
seangshim 0:a01fda36fde8 28 if (speed < 0) {
seangshim 0:a01fda36fde8 29 _fwd = (speed > 0.0);
seangshim 0:a01fda36fde8 30 _rev = (speed < 0.0);
seangshim 0:a01fda36fde8 31 _pwm = 0;
seangshim 0:a01fda36fde8 32 temp = 0;
seangshim 0:a01fda36fde8 33 } else {
seangshim 0:a01fda36fde8 34 _fwd = (speed > 0.0);
seangshim 0:a01fda36fde8 35 _rev = (speed < 0.0);
seangshim 0:a01fda36fde8 36 temp = abs(speed);
seangshim 0:a01fda36fde8 37 _pwm = temp;
seangshim 0:a01fda36fde8 38 }
seangshim 0:a01fda36fde8 39 } else if (sign == -1) {
seangshim 0:a01fda36fde8 40 if (speed > 0) {
seangshim 0:a01fda36fde8 41 _fwd = (speed > 0.0);
seangshim 0:a01fda36fde8 42 _rev = (speed < 0.0);
seangshim 0:a01fda36fde8 43 _pwm = 0;
seangshim 0:a01fda36fde8 44 temp = 0;
seangshim 0:a01fda36fde8 45 } else {
seangshim 0:a01fda36fde8 46 _fwd = (speed > 0.0);
seangshim 0:a01fda36fde8 47 _rev = (speed < 0.0);
seangshim 0:a01fda36fde8 48 temp = abs(speed);
seangshim 0:a01fda36fde8 49 _pwm = temp;
seangshim 0:a01fda36fde8 50 }
seangshim 0:a01fda36fde8 51 }
seangshim 0:a01fda36fde8 52 if (speed > 0)
seangshim 0:a01fda36fde8 53 sign = 1;
seangshim 0:a01fda36fde8 54 else if (speed < 0) {
seangshim 0:a01fda36fde8 55 sign = -1;
seangshim 0:a01fda36fde8 56 } else if (speed == 0) {
seangshim 0:a01fda36fde8 57 sign = 0;
seangshim 0:a01fda36fde8 58 }
seangshim 0:a01fda36fde8 59 return temp;
seangshim 0:a01fda36fde8 60 }
seangshim 0:a01fda36fde8 61 // (additions)
seangshim 0:a01fda36fde8 62 void Motor::coast(void) {
seangshim 0:a01fda36fde8 63 _fwd = 0;
seangshim 0:a01fda36fde8 64 _rev = 0;
seangshim 0:a01fda36fde8 65 _pwm = 0;
seangshim 0:a01fda36fde8 66 sign = 0;
seangshim 0:a01fda36fde8 67 }
seangshim 0:a01fda36fde8 68
seangshim 0:a01fda36fde8 69 float Motor::stop(float duty) {
seangshim 0:a01fda36fde8 70 if (Brakeable == 1) {
seangshim 0:a01fda36fde8 71 _fwd = 1;
seangshim 0:a01fda36fde8 72 _rev = 1;
seangshim 0:a01fda36fde8 73 _pwm = duty;
seangshim 0:a01fda36fde8 74 sign = 0;
seangshim 0:a01fda36fde8 75 return duty;
seangshim 0:a01fda36fde8 76 } else
seangshim 0:a01fda36fde8 77 Motor::coast();
seangshim 0:a01fda36fde8 78 return -1;
seangshim 0:a01fda36fde8 79 }
seangshim 0:a01fda36fde8 80
seangshim 0:a01fda36fde8 81 float Motor::state(void) {
seangshim 0:a01fda36fde8 82 if ((_fwd == _rev) && (_pwm > 0)) {
seangshim 0:a01fda36fde8 83 return -2;//braking
seangshim 0:a01fda36fde8 84 } else if (_pwm == 0) {
seangshim 0:a01fda36fde8 85 return 2;//coasting
seangshim 0:a01fda36fde8 86 } else if ((_fwd == 0) && (_rev == 1)) {
seangshim 0:a01fda36fde8 87 return -(_pwm);//reversing
seangshim 0:a01fda36fde8 88 } else if ((_fwd == 1) && (_rev == 0)) {
seangshim 0:a01fda36fde8 89 return _pwm;//fowards
seangshim 0:a01fda36fde8 90 } else
seangshim 0:a01fda36fde8 91 return -3;//error
seangshim 0:a01fda36fde8 92 }
seangshim 0:a01fda36fde8 93
seangshim 0:a01fda36fde8 94 /*
seangshim 0:a01fda36fde8 95 test code, this demonstrates working motor drivers.
seangshim 0:a01fda36fde8 96
seangshim 0:a01fda36fde8 97 Motor A(p22, p6, p5, 1); // pwm, fwd, rev, can break
seangshim 0:a01fda36fde8 98 Motor B(p21, p7, p8, 1); // pwm, fwd, rev, can break
seangshim 0:a01fda36fde8 99 int main() {
seangshim 0:a01fda36fde8 100 for (float s=-1.0; s < 1.0 ; s += 0.01) {
seangshim 0:a01fda36fde8 101 A.speed(s);
seangshim 0:a01fda36fde8 102 B.speed(s);
seangshim 0:a01fda36fde8 103 wait(0.02);
seangshim 0:a01fda36fde8 104 }
seangshim 0:a01fda36fde8 105 A.stop();
seangshim 0:a01fda36fde8 106 B.stop();
seangshim 0:a01fda36fde8 107 wait(1);
seangshim 0:a01fda36fde8 108 A.coast();
seangshim 0:a01fda36fde8 109 B.coast();
seangshim 0:a01fda36fde8 110 }
seangshim 0:a01fda36fde8 111 */