Simple DC motor control commands for driving DC motor conroller with PWM and up to 2 direction signals (complementary). Takes float value from -1.0 to 1.0.

Dependents:   Teensy_Mot_QEI_Ser_20180111 Axis Axis_20181108 Axis_version2

Fork of MotCon by Joseph Bradshaw

Overloaded class that takes a pwm motor control pin and one or two direction pins for driving DC motors with a variety of motor control IC's. Tested examples include the LM298, TD340, MC33926, A3949.

Committer:
jebradshaw
Date:
Tue Nov 15 15:40:19 2016 +0000
Revision:
6:709761ee0a14
Parent:
5:3e07f69d8abd
Overloaded class for using one or two direction pins on motor driver IC with PWM control

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jebradshaw 5:3e07f69d8abd 1 #include "mbed.h"
jebradshaw 0:3ba12980833b 2 #include "MotCon.h"
jebradshaw 0:3ba12980833b 3
jebradshaw 0:3ba12980833b 4 //Constructor
jebradshaw 5:3e07f69d8abd 5 MotCon::MotCon(PinName pwm_pin, PinName dir1_pin) : _pwm_pin(pwm_pin), _dir1_pin(dir1_pin), _dir2_pin(NC) {
jebradshaw 5:3e07f69d8abd 6 _dir2 = false;
jebradshaw 5:3e07f69d8abd 7 _pwm_pin.period_us(50);
jebradshaw 5:3e07f69d8abd 8 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 9 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 10 }
jebradshaw 5:3e07f69d8abd 11 MotCon::MotCon(PinName pwm_pin, PinName dir1_pin, PinName dir2_pin) : _pwm_pin(pwm_pin), _dir1_pin(dir1_pin), _dir2_pin(dir2_pin) {
jebradshaw 5:3e07f69d8abd 12 _dir2 = true;
jebradshaw 5:3e07f69d8abd 13 _pwm_pin.period_us(50);
jebradshaw 5:3e07f69d8abd 14 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 15 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 16 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 17
jebradshaw 5:3e07f69d8abd 18 mc_mode = 0; //mode pin determines braking (1 = dynamic braking, 0 = free-wheeling)
jebradshaw 5:3e07f69d8abd 19 }
jebradshaw 5:3e07f69d8abd 20 // dc is signed duty cycle (+/-1.0)
jebradshaw 5:3e07f69d8abd 21 void MotCon::mot_control(float dc){
jebradshaw 5:3e07f69d8abd 22 if(dc>1.0)
jebradshaw 5:3e07f69d8abd 23 dc=1.0;
jebradshaw 5:3e07f69d8abd 24 if(dc<-1.0)
jebradshaw 5:3e07f69d8abd 25 dc=-1.0;
jebradshaw 5:3e07f69d8abd 26
jebradshaw 5:3e07f69d8abd 27 if(_dir2){
jebradshaw 5:3e07f69d8abd 28 if(dc > 0.001){
jebradshaw 5:3e07f69d8abd 29 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 30 _dir2_pin = 1;
jebradshaw 5:3e07f69d8abd 31 _pwm_pin = dc;
jebradshaw 5:3e07f69d8abd 32 }
jebradshaw 5:3e07f69d8abd 33 else if(dc < -0.001){
jebradshaw 5:3e07f69d8abd 34 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 35 _dir1_pin = 1;
jebradshaw 5:3e07f69d8abd 36 _pwm_pin = abs(dc);
jebradshaw 5:3e07f69d8abd 37 }
jebradshaw 5:3e07f69d8abd 38 else{
jebradshaw 5:3e07f69d8abd 39 if(mc_mode){
jebradshaw 5:3e07f69d8abd 40 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 41 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 42 _pwm_pin = 1.0;
jebradshaw 5:3e07f69d8abd 43 }
jebradshaw 5:3e07f69d8abd 44 else{
jebradshaw 5:3e07f69d8abd 45 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 46 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 47 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 48 }
jebradshaw 5:3e07f69d8abd 49 }
jebradshaw 5:3e07f69d8abd 50 }
jebradshaw 5:3e07f69d8abd 51 else{
jebradshaw 5:3e07f69d8abd 52 if(dc > 0.001){
jebradshaw 5:3e07f69d8abd 53 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 54 _pwm_pin = dc;
jebradshaw 5:3e07f69d8abd 55 }
jebradshaw 5:3e07f69d8abd 56 else if(dc < -0.001){
jebradshaw 5:3e07f69d8abd 57 _dir1_pin = 1;
jebradshaw 5:3e07f69d8abd 58 _pwm_pin = abs(dc);
jebradshaw 5:3e07f69d8abd 59 }
jebradshaw 5:3e07f69d8abd 60 else{
jebradshaw 5:3e07f69d8abd 61 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 62 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 63 }
jebradshaw 5:3e07f69d8abd 64 }
jebradshaw 0:3ba12980833b 65 }
jebradshaw 0:3ba12980833b 66
jebradshaw 0:3ba12980833b 67 // dc is signed duty cycle (+/-1.0)
jebradshaw 5:3e07f69d8abd 68 void MotCon::mot_control(float dc, int invert){
jebradshaw 0:3ba12980833b 69 if(dc>1.0)
jebradshaw 0:3ba12980833b 70 dc=1.0;
jebradshaw 0:3ba12980833b 71 if(dc<-1.0)
jebradshaw 0:3ba12980833b 72 dc=-1.0;
jebradshaw 5:3e07f69d8abd 73
jebradshaw 5:3e07f69d8abd 74 if(_dir2){
jebradshaw 5:3e07f69d8abd 75 if(invert==0){
jebradshaw 5:3e07f69d8abd 76 if(dc > 0.001){
jebradshaw 5:3e07f69d8abd 77 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 78 _dir2_pin = 1;
jebradshaw 5:3e07f69d8abd 79 _pwm_pin = dc;
jebradshaw 5:3e07f69d8abd 80 }
jebradshaw 5:3e07f69d8abd 81 else if(dc < -0.001){
jebradshaw 5:3e07f69d8abd 82 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 83 _dir1_pin = 1;
jebradshaw 5:3e07f69d8abd 84 _pwm_pin = abs(dc);
jebradshaw 5:3e07f69d8abd 85 }
jebradshaw 5:3e07f69d8abd 86 else{
jebradshaw 5:3e07f69d8abd 87 if(mc_mode){
jebradshaw 5:3e07f69d8abd 88 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 89 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 90 _pwm_pin = 1.0;
jebradshaw 5:3e07f69d8abd 91 }
jebradshaw 5:3e07f69d8abd 92 else{
jebradshaw 5:3e07f69d8abd 93 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 94 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 95 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 96 }
jebradshaw 5:3e07f69d8abd 97 }
jebradshaw 5:3e07f69d8abd 98 }
jebradshaw 5:3e07f69d8abd 99 else{
jebradshaw 5:3e07f69d8abd 100 if(dc > 0.001){
jebradshaw 5:3e07f69d8abd 101 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 102 _dir1_pin = 1;
jebradshaw 5:3e07f69d8abd 103 _pwm_pin = dc;
jebradshaw 5:3e07f69d8abd 104 }
jebradshaw 5:3e07f69d8abd 105 else if(dc < -0.001){
jebradshaw 5:3e07f69d8abd 106 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 107 _dir2_pin = 1;
jebradshaw 5:3e07f69d8abd 108 _pwm_pin = abs(dc);
jebradshaw 5:3e07f69d8abd 109 }
jebradshaw 5:3e07f69d8abd 110 else{
jebradshaw 5:3e07f69d8abd 111 if(mc_mode){
jebradshaw 5:3e07f69d8abd 112 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 113 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 114 _pwm_pin = 1.0;
jebradshaw 5:3e07f69d8abd 115 }
jebradshaw 5:3e07f69d8abd 116 else{
jebradshaw 5:3e07f69d8abd 117 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 118 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 119 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 120 }
jebradshaw 5:3e07f69d8abd 121 }
jebradshaw 5:3e07f69d8abd 122 }
jebradshaw 0:3ba12980833b 123 }
jebradshaw 5:3e07f69d8abd 124 else{
jebradshaw 5:3e07f69d8abd 125 if(invert==0){
jebradshaw 5:3e07f69d8abd 126 if(dc > 0.001){
jebradshaw 5:3e07f69d8abd 127 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 128 _pwm_pin = dc;
jebradshaw 5:3e07f69d8abd 129 }
jebradshaw 5:3e07f69d8abd 130 else if(dc < -0.001){
jebradshaw 5:3e07f69d8abd 131 _dir1_pin = 1;
jebradshaw 5:3e07f69d8abd 132 _pwm_pin = abs(dc);
jebradshaw 5:3e07f69d8abd 133 }
jebradshaw 5:3e07f69d8abd 134 else{
jebradshaw 5:3e07f69d8abd 135 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 136 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 137 }
jebradshaw 5:3e07f69d8abd 138 }
jebradshaw 5:3e07f69d8abd 139 else{
jebradshaw 5:3e07f69d8abd 140 if(dc > 0.001){
jebradshaw 5:3e07f69d8abd 141 _dir1_pin = 1;
jebradshaw 5:3e07f69d8abd 142 _pwm_pin = dc;
jebradshaw 5:3e07f69d8abd 143 }
jebradshaw 5:3e07f69d8abd 144 else if(dc < -0.001){
jebradshaw 5:3e07f69d8abd 145 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 146 _pwm_pin = abs(dc);
jebradshaw 5:3e07f69d8abd 147 }
jebradshaw 5:3e07f69d8abd 148 else{
jebradshaw 5:3e07f69d8abd 149 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 150 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 151 }
jebradshaw 5:3e07f69d8abd 152 }
jebradshaw 5:3e07f69d8abd 153 }
jebradshaw 0:3ba12980833b 154 }
jebradshaw 4:10187d108666 155
jebradshaw 5:3e07f69d8abd 156 void MotCon::setMode(bool mode){
jebradshaw 5:3e07f69d8abd 157 mc_mode = mode;
jebradshaw 4:10187d108666 158 }
jebradshaw 5:3e07f69d8abd 159
jebradshaw 5:3e07f69d8abd 160 bool MotCon::getMode(void){
jebradshaw 5:3e07f69d8abd 161 return mc_mode;
jebradshaw 5:3e07f69d8abd 162 }