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.
Fork of HBridge by
HBridge.cpp@1:ef9cf0926575, 2015-10-09 (annotated)
- Committer:
- WAT34
- Date:
- Fri Oct 09 07:21:02 2015 +0000
- Revision:
- 1:ef9cf0926575
- Parent:
- 0:16208393c7ae
dekinai
Who changed what in which revision?
User | Revision | Line number | New 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 | } |