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:
Mon Oct 31 17:54:50 2016 +0000
Revision:
8:67f2711fdeed
Parent:
5:3e07f69d8abd
Child:
9:98c700c7dc30
added operator functions for simplified parameter passing

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 8:67f2711fdeed 10 this->duty_cycle=0.0;
jebradshaw 5:3e07f69d8abd 11 }
jebradshaw 5:3e07f69d8abd 12 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 13 _dir2 = true;
jebradshaw 5:3e07f69d8abd 14 _pwm_pin.period_us(50);
jebradshaw 5:3e07f69d8abd 15 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 16 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 17 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 18
jebradshaw 8:67f2711fdeed 19 this->duty_cycle=0.0;
jebradshaw 8:67f2711fdeed 20 this->mc_mode = 0; //mode pin determines braking (1 = dynamic braking, 0 = free-wheeling)
jebradshaw 5:3e07f69d8abd 21 }
jebradshaw 5:3e07f69d8abd 22 // dc is signed duty cycle (+/-1.0)
jebradshaw 8:67f2711fdeed 23 void MotCon::write(float dc){
jebradshaw 5:3e07f69d8abd 24 if(dc>1.0)
jebradshaw 5:3e07f69d8abd 25 dc=1.0;
jebradshaw 5:3e07f69d8abd 26 if(dc<-1.0)
jebradshaw 5:3e07f69d8abd 27 dc=-1.0;
jebradshaw 5:3e07f69d8abd 28
jebradshaw 8:67f2711fdeed 29 this->duty_cycle = dc;
jebradshaw 5:3e07f69d8abd 30 if(_dir2){
jebradshaw 8:67f2711fdeed 31 if(this->duty_cycle > 0.001){
jebradshaw 5:3e07f69d8abd 32 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 33 _dir2_pin = 1;
jebradshaw 8:67f2711fdeed 34 _pwm_pin = this->duty_cycle;
jebradshaw 5:3e07f69d8abd 35 }
jebradshaw 8:67f2711fdeed 36 else if(this->duty_cycle < -0.001){
jebradshaw 5:3e07f69d8abd 37 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 38 _dir1_pin = 1;
jebradshaw 8:67f2711fdeed 39 _pwm_pin = abs(this->duty_cycle);
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 8:67f2711fdeed 55 if(this->duty_cycle > 0.001){
jebradshaw 5:3e07f69d8abd 56 _dir1_pin = 0;
jebradshaw 8:67f2711fdeed 57 _pwm_pin = this->duty_cycle;
jebradshaw 5:3e07f69d8abd 58 }
jebradshaw 8:67f2711fdeed 59 else if(this->duty_cycle < -0.001){
jebradshaw 5:3e07f69d8abd 60 _dir1_pin = 1;
jebradshaw 8:67f2711fdeed 61 _pwm_pin = abs(this->duty_cycle);
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 8:67f2711fdeed 71 void MotCon::write(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 8:67f2711fdeed 77 duty_cycle = dc;
jebradshaw 5:3e07f69d8abd 78 if(_dir2){
jebradshaw 5:3e07f69d8abd 79 if(invert==0){
jebradshaw 8:67f2711fdeed 80 if(this->duty_cycle > 0.001){
jebradshaw 5:3e07f69d8abd 81 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 82 _dir2_pin = 1;
jebradshaw 8:67f2711fdeed 83 _pwm_pin = this->duty_cycle;
jebradshaw 5:3e07f69d8abd 84 }
jebradshaw 8:67f2711fdeed 85 else if(duty_cycle < -0.001){
jebradshaw 5:3e07f69d8abd 86 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 87 _dir1_pin = 1;
jebradshaw 8:67f2711fdeed 88 _pwm_pin = abs(this->duty_cycle);
jebradshaw 5:3e07f69d8abd 89 }
jebradshaw 5:3e07f69d8abd 90 else{
jebradshaw 5:3e07f69d8abd 91 if(mc_mode){
jebradshaw 5:3e07f69d8abd 92 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 93 _dir2_pin = 0;
jebradshaw 8:67f2711fdeed 94 _pwm_pin = 1.0;
jebradshaw 8:67f2711fdeed 95 this->duty_cycle=1.0;
jebradshaw 5:3e07f69d8abd 96 }
jebradshaw 5:3e07f69d8abd 97 else{
jebradshaw 5:3e07f69d8abd 98 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 99 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 100 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 101 }
jebradshaw 5:3e07f69d8abd 102 }
jebradshaw 5:3e07f69d8abd 103 }
jebradshaw 5:3e07f69d8abd 104 else{
jebradshaw 8:67f2711fdeed 105 if(this->duty_cycle > 0.001){
jebradshaw 5:3e07f69d8abd 106 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 107 _dir1_pin = 1;
jebradshaw 8:67f2711fdeed 108 _pwm_pin = this->duty_cycle;
jebradshaw 5:3e07f69d8abd 109 }
jebradshaw 8:67f2711fdeed 110 else if(this->duty_cycle < -0.001){
jebradshaw 5:3e07f69d8abd 111 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 112 _dir2_pin = 1;
jebradshaw 8:67f2711fdeed 113 _pwm_pin = abs(this->duty_cycle);
jebradshaw 5:3e07f69d8abd 114 }
jebradshaw 5:3e07f69d8abd 115 else{
jebradshaw 5:3e07f69d8abd 116 if(mc_mode){
jebradshaw 5:3e07f69d8abd 117 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 118 _dir2_pin = 0;
jebradshaw 8:67f2711fdeed 119 _pwm_pin = 1.0;
jebradshaw 8:67f2711fdeed 120 this->duty_cycle=1.0;
jebradshaw 5:3e07f69d8abd 121 }
jebradshaw 5:3e07f69d8abd 122 else{
jebradshaw 5:3e07f69d8abd 123 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 124 _dir2_pin = 0;
jebradshaw 5:3e07f69d8abd 125 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 126 }
jebradshaw 5:3e07f69d8abd 127 }
jebradshaw 5:3e07f69d8abd 128 }
jebradshaw 0:3ba12980833b 129 }
jebradshaw 5:3e07f69d8abd 130 else{
jebradshaw 5:3e07f69d8abd 131 if(invert==0){
jebradshaw 8:67f2711fdeed 132 if(this->duty_cycle > 0.001){
jebradshaw 5:3e07f69d8abd 133 _dir1_pin = 0;
jebradshaw 8:67f2711fdeed 134 _pwm_pin = this->duty_cycle;
jebradshaw 5:3e07f69d8abd 135 }
jebradshaw 8:67f2711fdeed 136 else if(this->duty_cycle < -0.001){
jebradshaw 5:3e07f69d8abd 137 _dir1_pin = 1;
jebradshaw 8:67f2711fdeed 138 _pwm_pin = abs(this->duty_cycle);
jebradshaw 5:3e07f69d8abd 139 }
jebradshaw 5:3e07f69d8abd 140 else{
jebradshaw 5:3e07f69d8abd 141 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 142 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 143 }
jebradshaw 5:3e07f69d8abd 144 }
jebradshaw 5:3e07f69d8abd 145 else{
jebradshaw 8:67f2711fdeed 146 if(this->duty_cycle > 0.001){
jebradshaw 5:3e07f69d8abd 147 _dir1_pin = 1;
jebradshaw 8:67f2711fdeed 148 _pwm_pin = this->duty_cycle;
jebradshaw 5:3e07f69d8abd 149 }
jebradshaw 8:67f2711fdeed 150 else if(this->duty_cycle < -0.001){
jebradshaw 5:3e07f69d8abd 151 _dir1_pin = 0;
jebradshaw 8:67f2711fdeed 152 _pwm_pin = abs(this->duty_cycle);
jebradshaw 5:3e07f69d8abd 153 }
jebradshaw 5:3e07f69d8abd 154 else{
jebradshaw 5:3e07f69d8abd 155 _dir1_pin = 0;
jebradshaw 5:3e07f69d8abd 156 _pwm_pin = 0.0;
jebradshaw 5:3e07f69d8abd 157 }
jebradshaw 5:3e07f69d8abd 158 }
jebradshaw 5:3e07f69d8abd 159 }
jebradshaw 0:3ba12980833b 160 }
jebradshaw 2:10187d108666 161
jebradshaw 5:3e07f69d8abd 162 void MotCon::setMode(bool mode){
jebradshaw 5:3e07f69d8abd 163 mc_mode = mode;
jebradshaw 2:10187d108666 164 }
jebradshaw 5:3e07f69d8abd 165
jebradshaw 5:3e07f69d8abd 166 bool MotCon::getMode(void){
jebradshaw 5:3e07f69d8abd 167 return mc_mode;
jebradshaw 8:67f2711fdeed 168 }
jebradshaw 8:67f2711fdeed 169
jebradshaw 8:67f2711fdeed 170 float MotCon::read(){
jebradshaw 8:67f2711fdeed 171 return this->duty_cycle;
jebradshaw 8:67f2711fdeed 172 }
jebradshaw 8:67f2711fdeed 173
jebradshaw 8:67f2711fdeed 174 MotCon& MotCon::operator= (float dc) {
jebradshaw 8:67f2711fdeed 175 write(dc);
jebradshaw 8:67f2711fdeed 176 return *this;
jebradshaw 8:67f2711fdeed 177 }
jebradshaw 8:67f2711fdeed 178
jebradshaw 8:67f2711fdeed 179 MotCon::operator float() {
jebradshaw 8:67f2711fdeed 180 return read();
jebradshaw 5:3e07f69d8abd 181 }