A class for driving a DC motor using a full-bridge (H-bridge) driver.

Dependencies:   RateLimiter

Dependents:   L298N-Breakout-Test Zavrsni_rad_NXP_cup

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?

UserRevisionLine numberNew 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 }