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

Committer:
tbjazic
Date:
2015-01-14
Revision:
0:d3f1d0d52615
Child:
1:fb5553d9ff4c

File content as of revision 0:d3f1d0d52615:

#include "HBridgeDCMotor.h"

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) {
    sampleTime = 1e-3;
    switchingPeriod = 1.0 / 20e3;
    dutyCycle = tempDutyCycle = 0;
    GH_A.period(switchingPeriod); // applies to all PwmOut instances
    rl.setLimits(0.1, -0.1, 0, sampleTime); // initial 10 second ramp
}

void HBridgeDCMotor::adjustDutyCycle() {
    dutyCycle = rl.out(tempDutyCycle);
    if (dutyCycle >= 0 && dutyCycle <= 1) {
        GH_B = 0;
        GL_B = 1;
        GL_A = 0;
        GH_A = dutyCycle;
    } else if (dutyCycle >= -1 && dutyCycle < 0) { // opposite direction
        GH_A = 0;
        GL_A = 1;
        GL_B = 0;
        GH_B = -dutyCycle;
    } else {
        coast();
    }
}

void HBridgeDCMotor::setDutyCycle(float dc) {
    if (dc >= -1 && dc <= 1) {
        ticker.attach(this, &HBridgeDCMotor::adjustDutyCycle, sampleTime);
        tempDutyCycle = dc;
    } else {
        coast();
    }
}

void HBridgeDCMotor::coast() {
    GH_A = 0;
    GL_A = 0;
    GH_B = 0;
    GL_B = 0;
    dutyCycle = tempDutyCycle = 0;
    rl.reset();
    ticker.detach();
}

float HBridgeDCMotor::getDutyCycle() {
    return dutyCycle;
}