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@1:fb5553d9ff4c, 2015-01-14 (annotated)
- Committer:
- tbjazic
- Date:
- Wed Jan 14 10:37:57 2015 +0000
- Revision:
- 1:fb5553d9ff4c
- Parent:
- 0:d3f1d0d52615
- Child:
- 2:1675a4c00925
Configure function added.
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 | 1:fb5553d9ff4c | 11 | void HBridgeDCMotor::configure(float sampleTime, float switchingFrequency, float rampUpSlope, float rampDownSlope) { |
tbjazic | 1:fb5553d9ff4c | 12 | if (sampleTime < 1e-6) |
tbjazic | 1:fb5553d9ff4c | 13 | sampleTime = 1e-3; |
tbjazic | 1:fb5553d9ff4c | 14 | if (switchingFrequency < 100) |
tbjazic | 1:fb5553d9ff4c | 15 | switchingFrequency = 20e3; |
tbjazic | 1:fb5553d9ff4c | 16 | if (rampUpSlope < 0 || rampUpSlope > 1) |
tbjazic | 1:fb5553d9ff4c | 17 | rampUpSlope = 0.1; |
tbjazic | 1:fb5553d9ff4c | 18 | if (rampDownSlope > 0 || rampDownSlope < -1) |
tbjazic | 1:fb5553d9ff4c | 19 | rampDownSlope = -0.1; |
tbjazic | 1:fb5553d9ff4c | 20 | this->sampleTime = sampleTime; |
tbjazic | 1:fb5553d9ff4c | 21 | switchingPeriod = 1.0 / switchingFrequency; |
tbjazic | 1:fb5553d9ff4c | 22 | rl.setLimits(rampUpSlope, rampDownSlope, 0, sampleTime); |
tbjazic | 1:fb5553d9ff4c | 23 | } |
tbjazic | 1:fb5553d9ff4c | 24 | |
tbjazic | 0:d3f1d0d52615 | 25 | void HBridgeDCMotor::adjustDutyCycle() { |
tbjazic | 0:d3f1d0d52615 | 26 | dutyCycle = rl.out(tempDutyCycle); |
tbjazic | 0:d3f1d0d52615 | 27 | if (dutyCycle >= 0 && dutyCycle <= 1) { |
tbjazic | 0:d3f1d0d52615 | 28 | GH_B = 0; |
tbjazic | 0:d3f1d0d52615 | 29 | GL_B = 1; |
tbjazic | 0:d3f1d0d52615 | 30 | GL_A = 0; |
tbjazic | 0:d3f1d0d52615 | 31 | GH_A = dutyCycle; |
tbjazic | 0:d3f1d0d52615 | 32 | } else if (dutyCycle >= -1 && dutyCycle < 0) { // opposite direction |
tbjazic | 0:d3f1d0d52615 | 33 | GH_A = 0; |
tbjazic | 0:d3f1d0d52615 | 34 | GL_A = 1; |
tbjazic | 0:d3f1d0d52615 | 35 | GL_B = 0; |
tbjazic | 0:d3f1d0d52615 | 36 | GH_B = -dutyCycle; |
tbjazic | 0:d3f1d0d52615 | 37 | } else { |
tbjazic | 0:d3f1d0d52615 | 38 | coast(); |
tbjazic | 0:d3f1d0d52615 | 39 | } |
tbjazic | 0:d3f1d0d52615 | 40 | } |
tbjazic | 0:d3f1d0d52615 | 41 | |
tbjazic | 0:d3f1d0d52615 | 42 | void HBridgeDCMotor::setDutyCycle(float dc) { |
tbjazic | 0:d3f1d0d52615 | 43 | if (dc >= -1 && dc <= 1) { |
tbjazic | 0:d3f1d0d52615 | 44 | ticker.attach(this, &HBridgeDCMotor::adjustDutyCycle, sampleTime); |
tbjazic | 0:d3f1d0d52615 | 45 | tempDutyCycle = dc; |
tbjazic | 0:d3f1d0d52615 | 46 | } else { |
tbjazic | 0:d3f1d0d52615 | 47 | coast(); |
tbjazic | 0:d3f1d0d52615 | 48 | } |
tbjazic | 0:d3f1d0d52615 | 49 | } |
tbjazic | 0:d3f1d0d52615 | 50 | |
tbjazic | 0:d3f1d0d52615 | 51 | void HBridgeDCMotor::coast() { |
tbjazic | 0:d3f1d0d52615 | 52 | GH_A = 0; |
tbjazic | 0:d3f1d0d52615 | 53 | GL_A = 0; |
tbjazic | 0:d3f1d0d52615 | 54 | GH_B = 0; |
tbjazic | 0:d3f1d0d52615 | 55 | GL_B = 0; |
tbjazic | 0:d3f1d0d52615 | 56 | dutyCycle = tempDutyCycle = 0; |
tbjazic | 0:d3f1d0d52615 | 57 | rl.reset(); |
tbjazic | 0:d3f1d0d52615 | 58 | ticker.detach(); |
tbjazic | 0:d3f1d0d52615 | 59 | } |
tbjazic | 0:d3f1d0d52615 | 60 | |
tbjazic | 0:d3f1d0d52615 | 61 | float HBridgeDCMotor::getDutyCycle() { |
tbjazic | 0:d3f1d0d52615 | 62 | return dutyCycle; |
tbjazic | 0:d3f1d0d52615 | 63 | } |