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:   mbed_ES410_simpleSpeedMeasurement mbed_ES20X_V21_Tester

This MotCon motor driver class can be used with a variety of motor driver integrated circuits for driving PM DC motors. The MotCon class is overloaded to accommodate either one or two direction pins and a PwmOut pin for speed control/motor enable .

include the mbed library with this snippet

#include "MotCon.h"     //uses the MotCon.h library for controlling the motor ports

//PC serial connection
Serial pc(USBTX, USBRX);    //tx, rx via USB connection
DigitalOut led(LED1);
MotCon m1(p25, p27);        //uses p25 for PWM and p27 for direction
MotCon m2(p26, p29, p30);   //uses p26 for pwm and p29 and 30 for direction (complimentary)

//------------ Main ------------------------------
int main() {    
    pc.baud(921600);//fast baud rate for USB PC connection
    while(1) {
        //iterate through 2*pi cycles in .01 increments
        for(float cycle=0;cycle<3.14159*2.0;cycle+=.01){
            float m1_dc = .85*sin(cycle);            
            m1.mot_control(m1_dc);
            
            float m2_dc = .85*cos(cycle);
            m2.mot_control(m2_dc);
                        
            pc.printf("cycle=%.3f  m1_dc = %.2f  m1_dc = %.2f\r\n", cycle, m1_dc, m2_dc);
            wait(.01);      //determines period
            led = !led;     //toggle LED1 to indicate activity
        }
    }
}
Committer:
jebradshaw
Date:
Fri Mar 16 15:31:03 2018 +0000
Revision:
10:8e93b06e7ff2
Parent:
7:4d79b914ffdf
Added shorthand read and write functions.  May need to check implementation of overloaded function with invert used

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jebradshaw 7:4d79b914ffdf 1 // J. Bradshaw - Motor Control Libary for support of most H-Bridge drivers with
jebradshaw 7:4d79b914ffdf 2 // a single PWM (enable active high) pin and one or two direction pins
jebradshaw 7:4d79b914ffdf 3 // to support forward/reverse (complimentary)
jebradshaw 5:3e07f69d8abd 4 #include "mbed.h"
jebradshaw 0:3ba12980833b 5 #include "MotCon.h"
jebradshaw 0:3ba12980833b 6
jebradshaw 0:3ba12980833b 7 //Constructor
jebradshaw 5:3e07f69d8abd 8 MotCon::MotCon(PinName pwm_pin, PinName dir1_pin) : _pwm_pin(pwm_pin), _dir1_pin(dir1_pin), _dir2_pin(NC) {
jebradshaw 5:3e07f69d8abd 9 _dir2 = false;
jebradshaw 5:3e07f69d8abd 10 _pwm_pin.period_us(50);
jebradshaw 5:3e07f69d8abd 11 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 12 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 13 }
jebradshaw 5:3e07f69d8abd 14 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 15 _dir2 = true;
jebradshaw 5:3e07f69d8abd 16 _pwm_pin.period_us(50);
jebradshaw 5:3e07f69d8abd 17 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 18 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 19 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 20
jebradshaw 5:3e07f69d8abd 21 mc_mode = 0; //mode pin determines braking (1 = dynamic braking, 0 = free-wheeling)
jebradshaw 5:3e07f69d8abd 22 }
jebradshaw 5:3e07f69d8abd 23 // dc is signed duty cycle (+/-1.0)
jebradshaw 5:3e07f69d8abd 24 void MotCon::mot_control(float dc){
jebradshaw 5:3e07f69d8abd 25 if(dc>1.0)
jebradshaw 5:3e07f69d8abd 26 dc=1.0;
jebradshaw 5:3e07f69d8abd 27 if(dc<-1.0)
jebradshaw 5:3e07f69d8abd 28 dc=-1.0;
jebradshaw 5:3e07f69d8abd 29
jebradshaw 5:3e07f69d8abd 30 if(_dir2){
jebradshaw 5:3e07f69d8abd 31 if(dc > 0.001){
jebradshaw 5:3e07f69d8abd 32 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 33 _dir2_pin = 1;
jebradshaw 5:3e07f69d8abd 34 _pwm_pin = dc;
jebradshaw 5:3e07f69d8abd 35 }
jebradshaw 5:3e07f69d8abd 36 else if(dc < -0.001){
jebradshaw 5:3e07f69d8abd 37 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 38 _dir1_pin = 1;
jebradshaw 5:3e07f69d8abd 39 _pwm_pin = abs(dc);
jebradshaw 5:3e07f69d8abd 40 }
jebradshaw 5:3e07f69d8abd 41 else{
jebradshaw 5:3e07f69d8abd 42 if(mc_mode){
jebradshaw 5:3e07f69d8abd 43 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 44 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 45 _pwm_pin = 1.0;
jebradshaw 5:3e07f69d8abd 46 }
jebradshaw 5:3e07f69d8abd 47 else{
jebradshaw 5:3e07f69d8abd 48 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 49 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 50 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 51 }
jebradshaw 5:3e07f69d8abd 52 }
jebradshaw 5:3e07f69d8abd 53 }
jebradshaw 5:3e07f69d8abd 54 else{
jebradshaw 5:3e07f69d8abd 55 if(dc > 0.001){
jebradshaw 5:3e07f69d8abd 56 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 57 _pwm_pin = dc;
jebradshaw 5:3e07f69d8abd 58 }
jebradshaw 5:3e07f69d8abd 59 else if(dc < -0.001){
jebradshaw 5:3e07f69d8abd 60 _dir1_pin = 1;
jebradshaw 5:3e07f69d8abd 61 _pwm_pin = abs(dc);
jebradshaw 5:3e07f69d8abd 62 }
jebradshaw 5:3e07f69d8abd 63 else{
jebradshaw 5:3e07f69d8abd 64 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 65 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 66 }
jebradshaw 5:3e07f69d8abd 67 }
jebradshaw 0:3ba12980833b 68 }
jebradshaw 0:3ba12980833b 69
jebradshaw 0:3ba12980833b 70 // dc is signed duty cycle (+/-1.0)
jebradshaw 5:3e07f69d8abd 71 void MotCon::mot_control(float dc, int invert){
jebradshaw 0:3ba12980833b 72 if(dc>1.0)
jebradshaw 0:3ba12980833b 73 dc=1.0;
jebradshaw 0:3ba12980833b 74 if(dc<-1.0)
jebradshaw 0:3ba12980833b 75 dc=-1.0;
jebradshaw 5:3e07f69d8abd 76
jebradshaw 5:3e07f69d8abd 77 if(_dir2){
jebradshaw 5:3e07f69d8abd 78 if(invert==0){
jebradshaw 5:3e07f69d8abd 79 if(dc > 0.001){
jebradshaw 5:3e07f69d8abd 80 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 81 _dir2_pin = 1;
jebradshaw 5:3e07f69d8abd 82 _pwm_pin = dc;
jebradshaw 5:3e07f69d8abd 83 }
jebradshaw 5:3e07f69d8abd 84 else if(dc < -0.001){
jebradshaw 5:3e07f69d8abd 85 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 86 _dir1_pin = 1;
jebradshaw 5:3e07f69d8abd 87 _pwm_pin = abs(dc);
jebradshaw 5:3e07f69d8abd 88 }
jebradshaw 5:3e07f69d8abd 89 else{
jebradshaw 5:3e07f69d8abd 90 if(mc_mode){
jebradshaw 5:3e07f69d8abd 91 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 92 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 93 _pwm_pin = 1.0;
jebradshaw 5:3e07f69d8abd 94 }
jebradshaw 5:3e07f69d8abd 95 else{
jebradshaw 5:3e07f69d8abd 96 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 97 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 98 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 99 }
jebradshaw 5:3e07f69d8abd 100 }
jebradshaw 5:3e07f69d8abd 101 }
jebradshaw 5:3e07f69d8abd 102 else{
jebradshaw 5:3e07f69d8abd 103 if(dc > 0.001){
jebradshaw 5:3e07f69d8abd 104 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 105 _dir1_pin = 1;
jebradshaw 5:3e07f69d8abd 106 _pwm_pin = dc;
jebradshaw 5:3e07f69d8abd 107 }
jebradshaw 5:3e07f69d8abd 108 else if(dc < -0.001){
jebradshaw 5:3e07f69d8abd 109 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 110 _dir2_pin = 1;
jebradshaw 5:3e07f69d8abd 111 _pwm_pin = abs(dc);
jebradshaw 5:3e07f69d8abd 112 }
jebradshaw 5:3e07f69d8abd 113 else{
jebradshaw 5:3e07f69d8abd 114 if(mc_mode){
jebradshaw 5:3e07f69d8abd 115 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 116 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 117 _pwm_pin = 1.0;
jebradshaw 5:3e07f69d8abd 118 }
jebradshaw 5:3e07f69d8abd 119 else{
jebradshaw 5:3e07f69d8abd 120 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 121 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 122 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 123 }
jebradshaw 5:3e07f69d8abd 124 }
jebradshaw 5:3e07f69d8abd 125 }
jebradshaw 0:3ba12980833b 126 }
jebradshaw 5:3e07f69d8abd 127 else{
jebradshaw 5:3e07f69d8abd 128 if(invert==0){
jebradshaw 5:3e07f69d8abd 129 if(dc > 0.001){
jebradshaw 5:3e07f69d8abd 130 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 131 _pwm_pin = dc;
jebradshaw 5:3e07f69d8abd 132 }
jebradshaw 5:3e07f69d8abd 133 else if(dc < -0.001){
jebradshaw 5:3e07f69d8abd 134 _dir1_pin = 1;
jebradshaw 5:3e07f69d8abd 135 _pwm_pin = abs(dc);
jebradshaw 5:3e07f69d8abd 136 }
jebradshaw 5:3e07f69d8abd 137 else{
jebradshaw 5:3e07f69d8abd 138 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 139 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 140 }
jebradshaw 5:3e07f69d8abd 141 }
jebradshaw 5:3e07f69d8abd 142 else{
jebradshaw 5:3e07f69d8abd 143 if(dc > 0.001){
jebradshaw 5:3e07f69d8abd 144 _dir1_pin = 1;
jebradshaw 5:3e07f69d8abd 145 _pwm_pin = dc;
jebradshaw 5:3e07f69d8abd 146 }
jebradshaw 5:3e07f69d8abd 147 else if(dc < -0.001){
jebradshaw 5:3e07f69d8abd 148 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 149 _pwm_pin = abs(dc);
jebradshaw 5:3e07f69d8abd 150 }
jebradshaw 5:3e07f69d8abd 151 else{
jebradshaw 5:3e07f69d8abd 152 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 153 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 154 }
jebradshaw 5:3e07f69d8abd 155 }
jebradshaw 5:3e07f69d8abd 156 }
jebradshaw 0:3ba12980833b 157 }
jebradshaw 2:10187d108666 158
jebradshaw 6:11fd2e721790 159 void MotCon::setMode(int mode){
jebradshaw 5:3e07f69d8abd 160 mc_mode = mode;
jebradshaw 2:10187d108666 161 }
jebradshaw 5:3e07f69d8abd 162
jebradshaw 7:4d79b914ffdf 163 int MotCon::getMode(void){
jebradshaw 5:3e07f69d8abd 164 return mc_mode;
jebradshaw 10:8e93b06e7ff2 165 }
jebradshaw 10:8e93b06e7ff2 166
jebradshaw 10:8e93b06e7ff2 167 float MotCon::read(void){
jebradshaw 10:8e93b06e7ff2 168 float ret = this->duty_cycle;
jebradshaw 10:8e93b06e7ff2 169
jebradshaw 10:8e93b06e7ff2 170 return ret;
jebradshaw 10:8e93b06e7ff2 171 }
jebradshaw 10:8e93b06e7ff2 172
jebradshaw 10:8e93b06e7ff2 173 MotCon& MotCon::operator= (float value){
jebradshaw 10:8e93b06e7ff2 174 mot_control(value);
jebradshaw 10:8e93b06e7ff2 175
jebradshaw 10:8e93b06e7ff2 176 return *this;
jebradshaw 10:8e93b06e7ff2 177 }
jebradshaw 10:8e93b06e7ff2 178
jebradshaw 10:8e93b06e7ff2 179 MotCon& MotCon::operator= (MotCon& rhs) {
jebradshaw 10:8e93b06e7ff2 180 // Underlying call is thread safe
jebradshaw 10:8e93b06e7ff2 181 mot_control(rhs.read());
jebradshaw 10:8e93b06e7ff2 182
jebradshaw 10:8e93b06e7ff2 183 return *this;
jebradshaw 10:8e93b06e7ff2 184 }
jebradshaw 10:8e93b06e7ff2 185
jebradshaw 10:8e93b06e7ff2 186 MotCon::operator float(){
jebradshaw 10:8e93b06e7ff2 187 // Underlying call is thread safe
jebradshaw 10:8e93b06e7ff2 188 return this->read();
jebradshaw 5:3e07f69d8abd 189 }