Clase Motor. Se usa para crear objetos del tipo motor, que pueden ser continuos o PAP. se especifica los pines a los cuales estara conectado cada Motor. Se puede controlar la velocidad con encoders, encontrar la posición inicial. Se debe especificar la cantidad de pasos y se podrá girar por ángulos.

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Motor.cpp Source File

Motor.cpp

00001 #include "mbed.h"
00002 #include "Motor.h"
00003 #include "Ticker.h"
00004 
00005 #define Pi 3.14159265
00006 #define Horario         1
00007 #define AntiHorario     0
00008 
00009 ///************  MOTOR CONTINUO ********************************//
00010 MotorContinuo::MotorContinuo()// speedPin(_speedPin)
00011 {
00012 
00013     
00014 };
00015 MotorContinuo::MotorContinuo(int q)// speedPin(_speedPin)
00016 {
00017 
00018     
00019 };
00020 
00021 /// CONSTRUCTOR
00022 
00023 /*
00024 MotorContinuo::MotorContinuo(PinName _L1, PinName _L2, PinName _speedPin, PinName _encodin, PinName _PosInicial, int _EncodPulses) :
00025 L1(_L1), L2(_L2), speedPin(_speedPin), encodin(_encodin), PosInicial(_PosInicial), EncodPulses(_EncodPulses)
00026 {
00027     speedPin.period_ms(2);
00028     speedPin.write(0);
00029     
00030 };
00031 
00032 
00033 
00034 
00035 
00036 void MotorContinuo::Forward()   { L1=1;  L2=0;}
00037 void MotorContinuo::Back()      { L1=0;  L2=1;}
00038 void MotorContinuo::Stop()      { L1=0;  L2=0;}
00039 void MotorContinuo::StopT()     { L1=1;  L2=1;}
00040 void MotorContinuo::SpeedDuty(int v) { speedPin.write(float(v/100.0));}
00041 void MotorContinuo::SpinLength_ms(float t)    { t++;}// Duración del giro en ms
00042 void MotorContinuo::SpinLength(float t)       { t++;};
00043     
00044     /*
00045 
00046 ///************  MOTOR DISCRETO ******************************** //    
00047 
00048 /// CONSTRUCTOR
00049 MotorDiscreto::MotorDiscreto(PinName _Dir, PinName _Step, int _NPasos, PinName _encodin, PinName _PosInicial, int _EncodPulses) :
00050 Dir(_Dir), Step(_Step), NPasos(_NPasos), encodin(_encodin), PosInicial(_PosInicial), EncodPulses(_EncodPulses)
00051 {
00052 };    
00053  
00054  
00055  // *************   METODOS ***************** ///
00056     
00057 void MotorDiscreto::moveMotor(void)  
00058     {
00059         if (StepOnHold != 0 && _moveMotorStopped == false) 
00060             {
00061                 Step = !Step; // Se hace elcambio de estado en el pin Step
00062                 entradas++; // se registra cada paso efectivo el cual es valido cada 2 entradas 
00063                             // 1ra entrada: tiempo en Bajo
00064                             // 2da entrada: tiempo en Alto
00065                             // Es decir cuando Step cumple un periodo.
00066                 if (entradas >= 2) // cuando se registran 2 entradas se disminuye un paso
00067                 {
00068                     StepOnHold--; // Se elimina 1 paso de los pendientes
00069                     entradas = 0; 
00070                 }
00071                 
00072                 Move.attach(callback(this,&MotorDiscreto::moveMotor), (TStep/2) ); // Reiniciamos el tiempo de imterrupcion
00073                 
00074             }
00075         else if (StepOnHold == 0 || _moveMotorStopped == true) // si no hay mas pasos pendientes
00076             {
00077                 Move.detach(); // desabilita la interrupcion
00078                 entradas = 0;
00079             }
00080     }
00081 
00082 
00083 void MotorDiscreto::Forward()   { Dir=1;}
00084 void MotorDiscreto::Back()      { Dir=0;}
00085 void MotorDiscreto::Stop()      { EnablePin = 0; _moveMotorStopped = true;}
00086 void MotorDiscreto::StopT()     { Move.detach(); _moveMotorStopped = true;}
00087 void MotorDiscreto::StepFreq(long n) { StepsBySecond = n; TStep = (1/float(n));}
00088 void MotorDiscreto::RunStep(long n) { StepOnHold = n; Move.attach(callback(this,&MotorDiscreto::moveMotor), (TStep/2) ); _moveMotorStopped = false; }// Duración del giro en ms
00089 void MotorDiscreto::Run(float t)    { StepOnHold = long(t/TStep); Move.attach(callback(this,&MotorDiscreto::moveMotor), (TStep/2) ); _moveMotorStopped = false; }
00090 void MotorDiscreto::RunRound(int n) { StepOnHold = (NPasos * n); Move.attach(callback(this,&MotorDiscreto::moveMotor), (TStep/2) ); _moveMotorStopped = false; }
00091 long MotorDiscreto::getStepOnHold(void){return StepOnHold; }
00092 
00093 void Ustep(int resolucion, DigitalOut* _M0, DigitalOut* _M1, DigitalOut* _M2)
00094     {
00095         
00096         switch(resolucion)
00097         {
00098             case 1: *_M0 = 0; *_M1 = 0; *_M2 = 0;
00099                     break;
00100             case 2: *_M0 = 1; *_M1 = 0; *_M2 = 0;
00101                     break;
00102             case 4: *_M0 = 0; *_M1 = 1; *_M2 = 0;
00103                     break; 
00104             case 8: *_M0 = 1; *_M1 = 1; *_M2 = 1;
00105                     break;
00106             case 16: *_M0 = 0; *_M1 = 0; *_M2 = 1;
00107                     break;
00108             case 32: *_M0 = 1; *_M1 = 0; *_M2 = 1;
00109                     break;
00110         
00111             default: *_M0 = 0; *_M1 = 0; *_M2 = 0;
00112         
00113         
00114         }
00115     
00116     
00117     }
00118 
00119       
00120 ///************  TRACCIONDISCRETA ******************************** //    
00121 
00122 
00123 /// ***************** CONSTRUCTOR ********************** ///
00124 TraccionD::TraccionD(PinName _StepMI, PinName _DirMI, PinName _StepMD, PinName _DirMD, int _NPasos, float _r, float _L ):
00125                     StepMI(_StepMI), DirMI(_DirMI), StepMD(_StepMD), DirMD(_DirMD), NPasos(_NPasos), r(_r), L(_L)
00126     {
00127         // 1. se halla la Relacion(Rl) de distacia entre los dos Radios(r y L)
00128             Rl  = (L / r); 
00129             
00130         };
00131 
00132  // *************   METODOS ***************** ///
00133 
00134 void TraccionD::moveMotor(void)  
00135     {
00136         if (StepOnHold != 0) 
00137             {
00138             
00139                 
00140                 StepMI = !StepMI; // Se hace elcambio de estado en el pin Step para ambos motores
00141                 StepMD =  StepMD; 
00142                 
00143                 entradas++; // se registra cada paso efectivo el cual es valido cada 2 entradas 
00144                             // 1ra entrada: tiempo en Bajo
00145                             // 2da entrada: tiempo en Alto
00146                             // Es decir cuando Step cumple un periodo.
00147                 if (entradas >= 2) // cuando se registran 2 entradas se disminuye un paso
00148                 {
00149                     StepOnHold--; // Se elimina 1 paso de los pendientes
00150                     entradas = 0; 
00151                 }
00152                 
00153                 Move.attach(callback(this,&TraccionD::moveMotor), (TStep/2) ); // Reiniciamos el tiempo de imterrupcion
00154                 
00155             }
00156         else if (StepOnHold == 0) // si no hay mas pasos para dar se deshabilita las interrupciones.
00157             {
00158                 Move.detach(); 
00159             }
00160     }
00161 
00162 
00163 void TraccionD::Forward()   { DirMI=1; DirMD=1;} // Configua de giro de ambos motores el el mismo sentido para avanzar hacia adelante
00164 void TraccionD::Back()      { DirMI=0; DirMD=0;} // Configua el sentido giro en ambos motores contrario al de Forward(), para avanzar hacia atras
00165 void TraccionD::Left()      { DirMI=0; DirMD=1;} // Configura el sentido de giro de ambos motores de manera contraria para girar hacia la izquierda
00166 void TraccionD::Right()     { DirMI=1; DirMD=0;} // Configura el sentido de giro de ambos motores de manera contraria e inverso al de Left() para girar hacia la derecha
00167 void TraccionD::Stop()      { EnablePinM1 = 0; EnablePinM2 = 0;}
00168 void TraccionD::StopT()     { Move.detach();}
00169 void TraccionD::StepFreq(long n) { StepsBySecond = n; TStep = (1/float(n));}
00170 void TraccionD::RunStep(long n){ StepOnHold = n; Move.attach(callback(this,&TraccionD::moveMotor), (TStep/2) ); }// Duración del giro en ms
00171 void TraccionD::Run(float t)    { StepOnHold = long(t/TStep); Move.attach(callback(this,&TraccionD::moveMotor), (TStep/2) ); }
00172 void TraccionD::RunRound(int n) { StepOnHold = (NPasos * n); Move.attach(callback(this,&TraccionD::moveMotor), (TStep/2) ); }
00173 long TraccionD::getStepOnHold(void){return StepOnHold; }
00174 
00175 void TraccionD::Giro(long grados, bool sentido)     
00176 { 
00177     
00178     StepOnHold = grados * int(Rl * NPasos);
00179     StepOnHold /= 360; 
00180     Move.attach(callback(this,&TraccionD::moveMotor), (TStep/2) );
00181 
00182 }
00183 
00184 */
00185 
00186 
00187 
00188 
00189 
00190 
00191 
00192 
00193 
00194