A simple Hbridge driver library (tested with the L293D). It uses a PWM pin on the enable and two DIOs on the control pins. Versatile.

Dependents:   RSALB_hbridge_helloworld RSALB_lobster uva_nc

Committer:
p07gbar
Date:
Thu Sep 20 11:36:17 2012 +0000
Revision:
0:16208393c7ae
Working, Documented

Who changed what in which revision?

UserRevisionLine numberNew contents of line
p07gbar 0:16208393c7ae 1 #include "HBridge.h"
p07gbar 0:16208393c7ae 2
p07gbar 0:16208393c7ae 3 HBridge::HBridge(PinName A, PinName B, PinName en): enable(en),Adrive(A),Bdrive(B)
p07gbar 0:16208393c7ae 4 {
p07gbar 0:16208393c7ae 5 speed_value = 1;
p07gbar 0:16208393c7ae 6 power_status = false;
p07gbar 0:16208393c7ae 7 A_value = false;
p07gbar 0:16208393c7ae 8 B_value = false;
p07gbar 0:16208393c7ae 9 stored_direction = true;
p07gbar 0:16208393c7ae 10 set();
p07gbar 0:16208393c7ae 11 }
p07gbar 0:16208393c7ae 12
p07gbar 0:16208393c7ae 13 void HBridge::stop()
p07gbar 0:16208393c7ae 14 {
p07gbar 0:16208393c7ae 15 power_status = true;
p07gbar 0:16208393c7ae 16 A_value = false;
p07gbar 0:16208393c7ae 17 B_value = false;
p07gbar 0:16208393c7ae 18 set();
p07gbar 0:16208393c7ae 19 }
p07gbar 0:16208393c7ae 20
p07gbar 0:16208393c7ae 21 void HBridge::start()
p07gbar 0:16208393c7ae 22 {
p07gbar 0:16208393c7ae 23 direction(true);
p07gbar 0:16208393c7ae 24 power_status = true;
p07gbar 0:16208393c7ae 25 set();
p07gbar 0:16208393c7ae 26 }
p07gbar 0:16208393c7ae 27
p07gbar 0:16208393c7ae 28 void HBridge::power(float power_in)
p07gbar 0:16208393c7ae 29 {
p07gbar 0:16208393c7ae 30 if(power_in <= 0)
p07gbar 0:16208393c7ae 31 {
p07gbar 0:16208393c7ae 32 speed_value = 0;
p07gbar 0:16208393c7ae 33 }
p07gbar 0:16208393c7ae 34 else
p07gbar 0:16208393c7ae 35 {
p07gbar 0:16208393c7ae 36 speed_value = power_in;
p07gbar 0:16208393c7ae 37 }
p07gbar 0:16208393c7ae 38 set();
p07gbar 0:16208393c7ae 39 }
p07gbar 0:16208393c7ae 40
p07gbar 0:16208393c7ae 41 void HBridge::speed(float speed_in)
p07gbar 0:16208393c7ae 42 {
p07gbar 0:16208393c7ae 43 if(speed_in < 0)
p07gbar 0:16208393c7ae 44 {
p07gbar 0:16208393c7ae 45 power(speed_in * -1);
p07gbar 0:16208393c7ae 46 direction(false);
p07gbar 0:16208393c7ae 47 }
p07gbar 0:16208393c7ae 48 else
p07gbar 0:16208393c7ae 49 {
p07gbar 0:16208393c7ae 50 power(speed_in);
p07gbar 0:16208393c7ae 51 direction(true);
p07gbar 0:16208393c7ae 52 }
p07gbar 0:16208393c7ae 53 }
p07gbar 0:16208393c7ae 54
p07gbar 0:16208393c7ae 55 void HBridge::power(bool onoff)
p07gbar 0:16208393c7ae 56 {
p07gbar 0:16208393c7ae 57 power_status = onoff;
p07gbar 0:16208393c7ae 58 set();
p07gbar 0:16208393c7ae 59 }
p07gbar 0:16208393c7ae 60
p07gbar 0:16208393c7ae 61 void HBridge::soft_stop()
p07gbar 0:16208393c7ae 62 {
p07gbar 0:16208393c7ae 63 power_status = false;
p07gbar 0:16208393c7ae 64 set();
p07gbar 0:16208393c7ae 65 }
p07gbar 0:16208393c7ae 66
p07gbar 0:16208393c7ae 67
p07gbar 0:16208393c7ae 68 void HBridge::forward()
p07gbar 0:16208393c7ae 69 {
p07gbar 0:16208393c7ae 70 direction(true);
p07gbar 0:16208393c7ae 71 power(true);
p07gbar 0:16208393c7ae 72 }
p07gbar 0:16208393c7ae 73
p07gbar 0:16208393c7ae 74
p07gbar 0:16208393c7ae 75 void HBridge::backward()
p07gbar 0:16208393c7ae 76 {
p07gbar 0:16208393c7ae 77 direction(false);
p07gbar 0:16208393c7ae 78 power(true);
p07gbar 0:16208393c7ae 79 }
p07gbar 0:16208393c7ae 80
p07gbar 0:16208393c7ae 81
p07gbar 0:16208393c7ae 82 void HBridge::forward(float speed_in)
p07gbar 0:16208393c7ae 83 {
p07gbar 0:16208393c7ae 84 speed(speed_in);
p07gbar 0:16208393c7ae 85 forward();
p07gbar 0:16208393c7ae 86 }
p07gbar 0:16208393c7ae 87
p07gbar 0:16208393c7ae 88
p07gbar 0:16208393c7ae 89 void HBridge::backward(float speed_in)
p07gbar 0:16208393c7ae 90 {
p07gbar 0:16208393c7ae 91 speed(speed_in);
p07gbar 0:16208393c7ae 92 backward();
p07gbar 0:16208393c7ae 93 }
p07gbar 0:16208393c7ae 94
p07gbar 0:16208393c7ae 95 void HBridge::direction(bool direction_in)
p07gbar 0:16208393c7ae 96 {
p07gbar 0:16208393c7ae 97 stored_direction = direction_in;
p07gbar 0:16208393c7ae 98 A_value = stored_direction;
p07gbar 0:16208393c7ae 99 B_value = !stored_direction;
p07gbar 0:16208393c7ae 100 set();
p07gbar 0:16208393c7ae 101 }
p07gbar 0:16208393c7ae 102
p07gbar 0:16208393c7ae 103 void HBridge::A(bool highlow)
p07gbar 0:16208393c7ae 104 {
p07gbar 0:16208393c7ae 105 A_value = highlow;
p07gbar 0:16208393c7ae 106 }
p07gbar 0:16208393c7ae 107
p07gbar 0:16208393c7ae 108 void HBridge::B(bool highlow)
p07gbar 0:16208393c7ae 109 {
p07gbar 0:16208393c7ae 110 B_value = highlow;
p07gbar 0:16208393c7ae 111 }
p07gbar 0:16208393c7ae 112
p07gbar 0:16208393c7ae 113 void HBridge::set()
p07gbar 0:16208393c7ae 114 {
p07gbar 0:16208393c7ae 115 Adrive = A_value & power_status;
p07gbar 0:16208393c7ae 116 Bdrive = B_value & power_status;
p07gbar 0:16208393c7ae 117 enable = speed_value * float(power_status);
p07gbar 0:16208393c7ae 118 }