Library version for DC_Stepper_Controller_Lib with PWM speed control

Dependencies:   mbed QEI PID

Dependents:   DR-ArmServoTest Auto_DC_pick_class MBed_TR1 ros_button_2021

DC_Motor_Controller.h

Committer:
stivending
Date:
2021-05-24
Revision:
7:6e59ed00a6a9
Parent:
5:c040faf21e07
Child:
8:703502486434

File content as of revision 7:6e59ed00a6a9:

#include "mbed.h"
#include "QEI.h"
#include <cmath>

#ifndef DC_MOTOR_CONTROLLER_H
#define DC_MOTOR_CONTROLLER_H

class DC_Motor_Controller {

    private:
    
        DigitalOut out1, out2;    //  Motor direction control pin 2
        QEI dc_motor;    //(D8,D7,NC,792);    // Create QEI object for increment encoder
        void goto_angle(int angle){      //  Move motor to specific angle from home point
            
            //Serial device(USBTX, USBRX);  // tx, rx
            //device.baud(19200);
        
            int tar_pulse = ((double) angle / 360.0)* (2.0 * 792.0);    //  Calculating target pulse number
            int cur_pulse = dc_motor.getPulses();
            int direction = 0;
            
            //device.printf("\n------ current %d -> target %d -----\n", cur_pulse, tar_pulse);
            while ( tar_pulse != cur_pulse ){
                direction = tar_pulse > cur_pulse; // cw 1 ; acw 0
              
                // if margin of error is less than +-3 (+- 1 degree), give up 
                if(abs(tar_pulse - cur_pulse) < 3)
                {
                    //device.printf("GIVEUP ");
                    break;
                }
                
                // future direction diff from current motion, pause for 0.5 to prevent unexpected outputs
                else if (direction != out1) 
                {
                    out1 = out2 = 0;
                    //device.printf("PAUSE ");
                    wait(0.3); 
                }
              
                out1 = direction;
                out2 = !direction;
                //device.printf(direction ? "> " : "< ");
                
                cur_pulse = dc_motor.getPulses();   //  Get increment encoder current pulse number
                
                //device.printf("%d ", cur_pulse);
    
            }
            //device.printf("\n----- done -----\n");
            out1 = 0;       //  Stop motor
            out2 = 0;
        };
    
    public:
        DC_Motor_Controller(PinName out1_p, PinName out2_p, PinName in1_p,  PinName in2_p, int PPR) : 
            out1(out1_p), out2(out2_p), dc_motor(in1_p, in2_p, NC, PPR){}
        
        void reset(){       // Setting home point for increment encoder
            /*while (home_button == 0){       // Continue to turn clockwise until home button pressed
                out1 = 1;
                out2 = 0;
            }*/
            out1 = 0;
            out2 = 0;
            dc_motor.reset();       //  Reset pulse_
            wait(0.3);
         };
         
        void move_angle(int angle){      //  move for relative distance
            reset();
            goto_angle(angle);
            reset();
        };
        
        void set_out(int a, int b)
        { 
            out1 = a;
            out2 = b;
        }
        int get_pulse()
        {
            return dc_motor.getPulses();
        }
};
#endif