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 10:37:57 2015 +0000
Revision:
1:fb5553d9ff4c
Parent:
0:d3f1d0d52615
Child:
2:1675a4c00925
Configure function added.

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 1:fb5553d9ff4c 11 void HBridgeDCMotor::configure(float sampleTime, float switchingFrequency, float rampUpSlope, float rampDownSlope) {
tbjazic 1:fb5553d9ff4c 12 if (sampleTime < 1e-6)
tbjazic 1:fb5553d9ff4c 13 sampleTime = 1e-3;
tbjazic 1:fb5553d9ff4c 14 if (switchingFrequency < 100)
tbjazic 1:fb5553d9ff4c 15 switchingFrequency = 20e3;
tbjazic 1:fb5553d9ff4c 16 if (rampUpSlope < 0 || rampUpSlope > 1)
tbjazic 1:fb5553d9ff4c 17 rampUpSlope = 0.1;
tbjazic 1:fb5553d9ff4c 18 if (rampDownSlope > 0 || rampDownSlope < -1)
tbjazic 1:fb5553d9ff4c 19 rampDownSlope = -0.1;
tbjazic 1:fb5553d9ff4c 20 this->sampleTime = sampleTime;
tbjazic 1:fb5553d9ff4c 21 switchingPeriod = 1.0 / switchingFrequency;
tbjazic 1:fb5553d9ff4c 22 rl.setLimits(rampUpSlope, rampDownSlope, 0, sampleTime);
tbjazic 1:fb5553d9ff4c 23 }
tbjazic 1:fb5553d9ff4c 24
tbjazic 0:d3f1d0d52615 25 void HBridgeDCMotor::adjustDutyCycle() {
tbjazic 0:d3f1d0d52615 26 dutyCycle = rl.out(tempDutyCycle);
tbjazic 0:d3f1d0d52615 27 if (dutyCycle >= 0 && dutyCycle <= 1) {
tbjazic 0:d3f1d0d52615 28 GH_B = 0;
tbjazic 0:d3f1d0d52615 29 GL_B = 1;
tbjazic 0:d3f1d0d52615 30 GL_A = 0;
tbjazic 0:d3f1d0d52615 31 GH_A = dutyCycle;
tbjazic 0:d3f1d0d52615 32 } else if (dutyCycle >= -1 && dutyCycle < 0) { // opposite direction
tbjazic 0:d3f1d0d52615 33 GH_A = 0;
tbjazic 0:d3f1d0d52615 34 GL_A = 1;
tbjazic 0:d3f1d0d52615 35 GL_B = 0;
tbjazic 0:d3f1d0d52615 36 GH_B = -dutyCycle;
tbjazic 0:d3f1d0d52615 37 } else {
tbjazic 0:d3f1d0d52615 38 coast();
tbjazic 0:d3f1d0d52615 39 }
tbjazic 0:d3f1d0d52615 40 }
tbjazic 0:d3f1d0d52615 41
tbjazic 0:d3f1d0d52615 42 void HBridgeDCMotor::setDutyCycle(float dc) {
tbjazic 0:d3f1d0d52615 43 if (dc >= -1 && dc <= 1) {
tbjazic 0:d3f1d0d52615 44 ticker.attach(this, &HBridgeDCMotor::adjustDutyCycle, sampleTime);
tbjazic 0:d3f1d0d52615 45 tempDutyCycle = dc;
tbjazic 0:d3f1d0d52615 46 } else {
tbjazic 0:d3f1d0d52615 47 coast();
tbjazic 0:d3f1d0d52615 48 }
tbjazic 0:d3f1d0d52615 49 }
tbjazic 0:d3f1d0d52615 50
tbjazic 0:d3f1d0d52615 51 void HBridgeDCMotor::coast() {
tbjazic 0:d3f1d0d52615 52 GH_A = 0;
tbjazic 0:d3f1d0d52615 53 GL_A = 0;
tbjazic 0:d3f1d0d52615 54 GH_B = 0;
tbjazic 0:d3f1d0d52615 55 GL_B = 0;
tbjazic 0:d3f1d0d52615 56 dutyCycle = tempDutyCycle = 0;
tbjazic 0:d3f1d0d52615 57 rl.reset();
tbjazic 0:d3f1d0d52615 58 ticker.detach();
tbjazic 0:d3f1d0d52615 59 }
tbjazic 0:d3f1d0d52615 60
tbjazic 0:d3f1d0d52615 61 float HBridgeDCMotor::getDutyCycle() {
tbjazic 0:d3f1d0d52615 62 return dutyCycle;
tbjazic 0:d3f1d0d52615 63 }