A class for driving a DC motor using a full-bridge (H-bridge) driver.
Dependencies: RateLimiter
Dependents: L298N-Breakout-Test Zavrsni_rad_NXP_cup
HBridgeDCMotor.cpp@0:d3f1d0d52615, 2015-01-14 (annotated)
- Committer:
- tbjazic
- Date:
- Wed Jan 14 08:51:14 2015 +0000
- Revision:
- 0:d3f1d0d52615
- Child:
- 1:fb5553d9ff4c
Initial commit.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tbjazic | 0:d3f1d0d52615 | 1 | #include "HBridgeDCMotor.h" |
tbjazic | 0:d3f1d0d52615 | 2 | |
tbjazic | 0:d3f1d0d52615 | 3 | HBridgeDCMotor::HBridgeDCMotor(PinName gh_a, PinName gl_a, PinName gh_b, PinName gl_b) : GH_A(gh_a), GL_A(gl_a), GH_B(gh_b), GL_B(gl_b) { |
tbjazic | 0:d3f1d0d52615 | 4 | sampleTime = 1e-3; |
tbjazic | 0:d3f1d0d52615 | 5 | switchingPeriod = 1.0 / 20e3; |
tbjazic | 0:d3f1d0d52615 | 6 | dutyCycle = tempDutyCycle = 0; |
tbjazic | 0:d3f1d0d52615 | 7 | GH_A.period(switchingPeriod); // applies to all PwmOut instances |
tbjazic | 0:d3f1d0d52615 | 8 | rl.setLimits(0.1, -0.1, 0, sampleTime); // initial 10 second ramp |
tbjazic | 0:d3f1d0d52615 | 9 | } |
tbjazic | 0:d3f1d0d52615 | 10 | |
tbjazic | 0:d3f1d0d52615 | 11 | void HBridgeDCMotor::adjustDutyCycle() { |
tbjazic | 0:d3f1d0d52615 | 12 | dutyCycle = rl.out(tempDutyCycle); |
tbjazic | 0:d3f1d0d52615 | 13 | if (dutyCycle >= 0 && dutyCycle <= 1) { |
tbjazic | 0:d3f1d0d52615 | 14 | GH_B = 0; |
tbjazic | 0:d3f1d0d52615 | 15 | GL_B = 1; |
tbjazic | 0:d3f1d0d52615 | 16 | GL_A = 0; |
tbjazic | 0:d3f1d0d52615 | 17 | GH_A = dutyCycle; |
tbjazic | 0:d3f1d0d52615 | 18 | } else if (dutyCycle >= -1 && dutyCycle < 0) { // opposite direction |
tbjazic | 0:d3f1d0d52615 | 19 | GH_A = 0; |
tbjazic | 0:d3f1d0d52615 | 20 | GL_A = 1; |
tbjazic | 0:d3f1d0d52615 | 21 | GL_B = 0; |
tbjazic | 0:d3f1d0d52615 | 22 | GH_B = -dutyCycle; |
tbjazic | 0:d3f1d0d52615 | 23 | } else { |
tbjazic | 0:d3f1d0d52615 | 24 | coast(); |
tbjazic | 0:d3f1d0d52615 | 25 | } |
tbjazic | 0:d3f1d0d52615 | 26 | } |
tbjazic | 0:d3f1d0d52615 | 27 | |
tbjazic | 0:d3f1d0d52615 | 28 | void HBridgeDCMotor::setDutyCycle(float dc) { |
tbjazic | 0:d3f1d0d52615 | 29 | if (dc >= -1 && dc <= 1) { |
tbjazic | 0:d3f1d0d52615 | 30 | ticker.attach(this, &HBridgeDCMotor::adjustDutyCycle, sampleTime); |
tbjazic | 0:d3f1d0d52615 | 31 | tempDutyCycle = dc; |
tbjazic | 0:d3f1d0d52615 | 32 | } else { |
tbjazic | 0:d3f1d0d52615 | 33 | coast(); |
tbjazic | 0:d3f1d0d52615 | 34 | } |
tbjazic | 0:d3f1d0d52615 | 35 | } |
tbjazic | 0:d3f1d0d52615 | 36 | |
tbjazic | 0:d3f1d0d52615 | 37 | void HBridgeDCMotor::coast() { |
tbjazic | 0:d3f1d0d52615 | 38 | GH_A = 0; |
tbjazic | 0:d3f1d0d52615 | 39 | GL_A = 0; |
tbjazic | 0:d3f1d0d52615 | 40 | GH_B = 0; |
tbjazic | 0:d3f1d0d52615 | 41 | GL_B = 0; |
tbjazic | 0:d3f1d0d52615 | 42 | dutyCycle = tempDutyCycle = 0; |
tbjazic | 0:d3f1d0d52615 | 43 | rl.reset(); |
tbjazic | 0:d3f1d0d52615 | 44 | ticker.detach(); |
tbjazic | 0:d3f1d0d52615 | 45 | } |
tbjazic | 0:d3f1d0d52615 | 46 | |
tbjazic | 0:d3f1d0d52615 | 47 | float HBridgeDCMotor::getDutyCycle() { |
tbjazic | 0:d3f1d0d52615 | 48 | return dutyCycle; |
tbjazic | 0:d3f1d0d52615 | 49 | } |