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

Committer:
ianmcc
Date:
Thu Aug 07 12:23:30 2014 +0000
Revision:
5:b5f360a16354
Parent:
4:3802325cf6e1
Added VNH5019Accel for a drop-in replacement for the VNH5019 but has a built-in acceleration limiter.  Default maximum acceleration will result in ramping up to maximum speed in 1/4 second.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ianmcc 1:5e8d9ed18f0f 1 #include "VNH5019.h"
ianmcc 0:5d3ab0ea7f27 2
ianmcc 1:5e8d9ed18f0f 3 VNH5019::VNH5019(PinName INA_, PinName INB_, PinName ENDIAG_, PinName CS_, PinName PWM_)
ianmcc 1:5e8d9ed18f0f 4 : INA(INA_),
ianmcc 1:5e8d9ed18f0f 5 INB(INB_),
ianmcc 1:5e8d9ed18f0f 6 ENDIAG(ENDIAG_),
ianmcc 1:5e8d9ed18f0f 7 CS(CS_),
ianmcc 1:5e8d9ed18f0f 8 PWM(PWM_)
ianmcc 0:5d3ab0ea7f27 9 {
ianmcc 0:5d3ab0ea7f27 10 this->init();
ianmcc 0:5d3ab0ea7f27 11 }
ianmcc 0:5d3ab0ea7f27 12
ianmcc 1:5e8d9ed18f0f 13 void VNH5019::init()
ianmcc 0:5d3ab0ea7f27 14 {
ianmcc 1:5e8d9ed18f0f 15 ENDIAG.input();
ianmcc 1:5e8d9ed18f0f 16 ENDIAG.mode(PullUp);
ianmcc 1:5e8d9ed18f0f 17 PWM.period(0.00025); // 4 kHz (valid 0 - 20 kHz)
ianmcc 1:5e8d9ed18f0f 18 PWM.write(0);
ianmcc 1:5e8d9ed18f0f 19 INA = 0;
ianmcc 1:5e8d9ed18f0f 20 INB = 0;
ianmcc 0:5d3ab0ea7f27 21 }
ianmcc 0:5d3ab0ea7f27 22
ianmcc 1:5e8d9ed18f0f 23 void VNH5019::speed(float Speed)
ianmcc 0:5d3ab0ea7f27 24 {
ianmcc 0:5d3ab0ea7f27 25 bool Reverse = 0;
ianmcc 0:5d3ab0ea7f27 26
ianmcc 0:5d3ab0ea7f27 27 if (Speed < 0)
ianmcc 0:5d3ab0ea7f27 28 {
ianmcc 0:5d3ab0ea7f27 29 Speed = -Speed; // Make speed a positive quantity
ianmcc 0:5d3ab0ea7f27 30 Reverse = 1; // Preserve the direction
ianmcc 0:5d3ab0ea7f27 31 }
ianmcc 0:5d3ab0ea7f27 32
ianmcc 0:5d3ab0ea7f27 33 // clamp the speed at maximum
ianmcc 0:5d3ab0ea7f27 34 if (Speed > 1.0)
ianmcc 0:5d3ab0ea7f27 35 Speed = 1.0;
ianmcc 0:5d3ab0ea7f27 36
ianmcc 0:5d3ab0ea7f27 37 if (Speed == 0.0)
ianmcc 0:5d3ab0ea7f27 38 {
ianmcc 1:5e8d9ed18f0f 39 INA = 0;
ianmcc 1:5e8d9ed18f0f 40 INB = 0;
ianmcc 4:3802325cf6e1 41 PWM = 0;
ianmcc 0:5d3ab0ea7f27 42 }
ianmcc 0:5d3ab0ea7f27 43 else
ianmcc 0:5d3ab0ea7f27 44 {
ianmcc 1:5e8d9ed18f0f 45 INA = !Reverse;
ianmcc 1:5e8d9ed18f0f 46 INB = Reverse;
ianmcc 1:5e8d9ed18f0f 47 PWM = Speed;
ianmcc 0:5d3ab0ea7f27 48 }
ianmcc 0:5d3ab0ea7f27 49 }
ianmcc 0:5d3ab0ea7f27 50
ianmcc 1:5e8d9ed18f0f 51 void VNH5019::clear_fault()
ianmcc 0:5d3ab0ea7f27 52 {
ianmcc 0:5d3ab0ea7f27 53 // if ENDIAG is high, then there is no fault
ianmcc 1:5e8d9ed18f0f 54 if (ENDIAG.read())
ianmcc 0:5d3ab0ea7f27 55 return;
ianmcc 0:5d3ab0ea7f27 56
ianmcc 0:5d3ab0ea7f27 57 // toggle the inputs
ianmcc 1:5e8d9ed18f0f 58 INA = 0;
ianmcc 1:5e8d9ed18f0f 59 INB = 0;
ianmcc 0:5d3ab0ea7f27 60 wait_us(250);
ianmcc 1:5e8d9ed18f0f 61 INA = 1;
ianmcc 1:5e8d9ed18f0f 62 INB = 1;
ianmcc 0:5d3ab0ea7f27 63 wait_us(250);
ianmcc 0:5d3ab0ea7f27 64
ianmcc 0:5d3ab0ea7f27 65 // pull low all inputs and wait 1600us for t_DEL
ianmcc 1:5e8d9ed18f0f 66 INA = 0;
ianmcc 1:5e8d9ed18f0f 67 INB = 0;
ianmcc 1:5e8d9ed18f0f 68 PWM = 0;
ianmcc 1:5e8d9ed18f0f 69 ENDIAG.output();
ianmcc 1:5e8d9ed18f0f 70 ENDIAG = 0;
ianmcc 0:5d3ab0ea7f27 71 wait_us(1600);
ianmcc 0:5d3ab0ea7f27 72
ianmcc 0:5d3ab0ea7f27 73 // and finally re-enable the motor
ianmcc 1:5e8d9ed18f0f 74 ENDIAG.input();
ianmcc 0:5d3ab0ea7f27 75 }