Library for the VNH5019 Motor Driver, with a helper class for the Pololu Dual VNH5019 Dual Motor Driver Shield http://www.pololu.com/product/2502

Dependents:   VNH5019_second VNH5019_second1

VNH5019.cpp

Committer:
ianmcc
Date:
2014-08-07
Revision:
5:b5f360a16354
Parent:
4:3802325cf6e1

File content as of revision 5:b5f360a16354:

#include "VNH5019.h"

VNH5019::VNH5019(PinName INA_, PinName INB_, PinName ENDIAG_, PinName CS_, PinName PWM_)
 : INA(INA_),
   INB(INB_),
   ENDIAG(ENDIAG_),
   CS(CS_),
   PWM(PWM_)
{
    this->init();
}

void VNH5019::init()
{
   ENDIAG.input();
   ENDIAG.mode(PullUp);
   PWM.period(0.00025);   // 4 kHz (valid 0 - 20 kHz)
   PWM.write(0);
   INA = 0;
   INB = 0;
}
 
void VNH5019::speed(float Speed)
{
   bool Reverse = 0;
  
   if (Speed < 0)
   {
     Speed = -Speed;  // Make speed a positive quantity
     Reverse = 1;  // Preserve the direction
   }
  
   // clamp the speed at maximum
   if (Speed > 1.0)
      Speed = 1.0;
    
   if (Speed == 0.0)
   {
       INA = 0;
       INB = 0;
       PWM = 0;
    }
    else
    {
      INA = !Reverse;
      INB = Reverse;
      PWM = Speed;
    }
}

void VNH5019::clear_fault()
{
    // if ENDIAG is high, then there is no fault
    if (ENDIAG.read())
       return;

   // toggle the inputs
   INA = 0;
   INB = 0;
   wait_us(250);
   INA = 1;
   INB = 1;
   wait_us(250);
   
   // pull low all inputs and wait 1600us for t_DEL
   INA = 0;
   INB = 0;
   PWM = 0;
   ENDIAG.output();
   ENDIAG = 0;
   wait_us(1600);
   
   // and finally re-enable the motor
   ENDIAG.input();
}