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.

Dependents:   RSALB_hbridge_helloworld RSALB_lobster uva_nc

HBridge.cpp

Committer:
p07gbar
Date:
2012-09-20
Revision:
0:16208393c7ae

File content as of revision 0:16208393c7ae:

#include "HBridge.h"

HBridge::HBridge(PinName A, PinName B, PinName en): enable(en),Adrive(A),Bdrive(B)
{
    speed_value = 1;
    power_status = false;
    A_value = false;
    B_value = false;
    stored_direction = true;
    set();
}
    
void HBridge::stop()
{
    power_status = true;
    A_value = false;
    B_value = false;
    set();
}

void HBridge::start()
{
    direction(true);
    power_status = true;
    set();
}

void HBridge::power(float power_in)
{
    if(power_in <= 0)
    {
        speed_value = 0;
    }
    else
    {
        speed_value = power_in;
    }
    set();
}

void HBridge::speed(float speed_in)
{
    if(speed_in < 0)
    {
        power(speed_in * -1);
        direction(false);
    }
    else
    {
        power(speed_in);
        direction(true);
    }
}

void HBridge::power(bool onoff)
{
    power_status = onoff;
    set();
}

void HBridge::soft_stop()
{
    power_status = false;
    set();
}


void HBridge::forward()
{
    direction(true);
    power(true);
}


void HBridge::backward()
{
    direction(false);
    power(true);
}


void HBridge::forward(float speed_in)
{
    speed(speed_in);
    forward();
}


void HBridge::backward(float speed_in)
{
    speed(speed_in);
    backward();
}

void HBridge::direction(bool direction_in)
{
    stored_direction = direction_in;
    A_value = stored_direction;
    B_value = !stored_direction;
    set();
}

void HBridge::A(bool highlow)
{
    A_value = highlow;
}

void HBridge::B(bool highlow)
{
    B_value = highlow;
}

void HBridge::set()
{
    Adrive = A_value & power_status;
    Bdrive = B_value & power_status;
    enable = speed_value * float(power_status);
}