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.
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
Generated on Sun Jul 17 2022 04:27:37 by
1.7.2