Uso de la clase Motor para el control de velocidad de un motor continuo con encoder.

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
CCastrop1012
Date:
Fri Sep 03 05:04:12 2021 +0000
Commit message:
Uso de la clase Motor para control de velocidad de motor continuo con encoder.

Changed in this revision

Motor.cpp Show annotated file Show diff for this revision Revisions of this file
Motor.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Motor.cpp	Fri Sep 03 05:04:12 2021 +0000
@@ -0,0 +1,113 @@
+#include "mbed.h"
+#include "Motor.h"
+
+
+MotorContinuo::MotorContinuo(PinName _L1, PinName _L2, PinName _speedPin, PinName _encodin, PinName _PosInicial, int _EncodPulses) :
+L1(_L1), L2(_L2), speedPin(_speedPin), encodin(_encodin), PosInicial(_PosInicial), EncodPulses(_EncodPulses)
+{
+    speedPin.period_ms(2);
+    speedPin.write(0);
+    
+};
+
+void MotorContinuo::Forward()   { L1=1;  L2=0;}
+void MotorContinuo::Back()      { L1=0;  L2=1;}
+void MotorContinuo::Stop()      { L1=0;  L2=0;}
+void MotorContinuo::StopT()     { L1=1;  L2=1;}
+void MotorContinuo::SpeedDuty(int v) { speedPin.write(float(v/100.0));}
+void MotorContinuo::SpinLength_ms(float t)    { t++;}// Duración del giro en ms
+void MotorContinuo::SpinLength(float t)       { t++;};
+    
+
+
+MotorDiscreto::MotorDiscreto(PinName _Dir, PinName _Step, int _NPasos, PinName _encodin, PinName _PosInicial, int _EncodPulses) :
+Dir(_Dir), Step(_Step), NPasos(_NPasos), encodin(_encodin), PosInicial(_PosInicial), EncodPulses(_EncodPulses)
+{
+    
+    
+
+};    
+    
+void MotorDiscreto::moveMotor(void)  
+    {
+        if (StepOnHold != 0) 
+            {
+                Step = !Step; // Se hace elcambio de estado en el pin Step
+                entradas++; // se registra cada paso efectivo el cual es valido cada 2 entradas 
+                            // 1ra entrada: tiempo en Bajo
+                            // 2da entrada: tiempo en Alto
+                            // Es decir cuando Step cumple un periodo.
+                if (entradas >= 2) // cuando se registran 2 entradas se disminuye un paso
+                {
+                    StepOnHold--; // Se elimina 1 paso de los pendientes
+                    entradas = 0; 
+                }
+                
+                Move.attach(callback(this,&MotorDiscreto::moveMotor), (TStep/2) ); // Reiniciamos el tiempo de imterrupcion
+                
+            }
+        else if (StepOnHold == 0)
+            {
+                Move.detach();
+            }
+    }
+
+
+void MotorDiscreto::Forward()   { Dir=1;}
+void MotorDiscreto::Back()      { Dir=0;}
+void MotorDiscreto::Stop()      { EnablePin = 0; }
+void MotorDiscreto::StopT()     { Move.detach();}
+void MotorDiscreto::StepFreq(int n) { StepsBySecond = n; TStep = (1/n);}
+void MotorDiscreto::RunStep(long n){ StepOnHold = n; Move.attach(callback(this,&MotorDiscreto::moveMotor), (TStep/2) ); }// Duración del giro en ms
+void MotorDiscreto::Run(float t)    { StepOnHold = long(t/TStep); Move.attach(callback(this,&MotorDiscreto::moveMotor), (TStep/2) ); }
+void MotorDiscreto::RunRound(int n) { StepOnHold = (NPasos * n); Move.attach(callback(this,&MotorDiscreto::moveMotor), (TStep/2) ); }
+
+void Ustep(int resolucion, DigitalOut* _M0, DigitalOut* _M1, DigitalOut* _M2)
+    {
+        
+        switch(resolucion)
+        {
+            case 1: *_M0 = 0; *_M1 = 0; *_M2 = 0;
+                    break;
+            case 2: *_M0 = 1; *_M1 = 0; *_M2 = 0;
+                    break;
+            case 4: *_M0 = 0; *_M1 = 1; *_M2 = 0;
+                    break; 
+            case 8: *_M0 = 1; *_M1 = 1; *_M2 = 1;
+                    break;
+            case 16: *_M0 = 0; *_M1 = 0; *_M2 = 1;
+                    break;
+            case 32: *_M0 = 1; *_M1 = 0; *_M2 = 1;
+                    break;
+        
+            default: *_M0 = 0; *_M1 = 0; *_M2 = 0;
+        
+        
+        }
+    
+    
+    }
+        
+    
+ /*   
+void scolor_TCS3200::SetMode(uint8_t mode) {
+    switch (mode){
+        case SCALE_100:  _s0= 1; _s1=1; break;
+        case SCALE_20:   _s0=1 ; _s1=0; break;
+        case SCALE_2:    _s0=0 ; _s1=1; break;
+        case POWER_DOWN: _s0=0 ; _s1=0; break;
+    } 
+};
+ 
+ 
+long  scolor_TCS3200::pulsewidth() {
+    while(!_s_in);
+    timer.start();
+    while(_s_in);
+    timer.stop();
+    float pulsewidth_v = timer.read_us();
+    timer.reset();
+    return pulsewidth_v;
+};
+*/          
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Motor.h	Fri Sep 03 05:04:12 2021 +0000
@@ -0,0 +1,102 @@
+#ifndef Motor_H
+#define Motor_H
+#include "mbed.h"
+ /* **************************************************************************
+ 
+@CCastrop
+cristiank.castrop@ecci.edu.co
+
+    L1      Terminal A del motor
+    L2      Terminal B del motor
+    SpeedPin Pin de salida PWM
+    
+ 
+******************************************************************************/
+
+
+class MotorContinuo {
+  public:
+    /// Constructores para Motores Continuos
+    MotorContinuo(PinName _L1, PinName _L2, PinName _speedPin, PinName _encodin, PinName _PosInicial, int _EncodPulses);
+    
+    void Forward();     // Da un sentido de giro al motor
+    void Back();        // Genera un sentido de giro contrario al de Forward
+    void Stop();        // Detiene el motor dejando el movimiento libre
+    void StopT();       // Detiene el motor truncando o enclavando el movimiento(Lo mantiene quieto).
+    void SpeedDuty(int v);   // Varia la velocidad de giro del motor de 0 a 100%
+    void SpinLength_ms(float t);  // Duración del giro en ms
+    void SpinLength(float t);  // Duración del giro
+    
+  private:
+
+    DigitalOut L1;
+    DigitalOut L2;
+    PwmOut     speedPin;
+    DigitalIn  encodin;
+    DigitalIn  PosInicial;
+    int EncodPulses;
+
+
+    
+
+};
+
+
+class MotorDiscreto {
+  public:
+    /// Constructores para Motores Continuos
+    MotorDiscreto(PinName _Dir, PinName _Step, int _NPasos, PinName _encodin, PinName _PosInicial, int _EncodPulses);
+    MotorDiscreto(void);    
+    void Forward();                 // Da un sentido de giro al motor
+    void Back();                    // Genera un sentido de giro contrario al de Forward
+    void Stop();                    // Detiene el motor dejando el movimiento libre. Pin Enable = 0
+    void StopT();                   // Detiene el motor truncando o enclavando el movimiento(Lo mantiene quieto).
+    void StepFreq(int n);           // Configura la Velocidad en Número(n) de pasos por segundos. Es decir la Frecuencia de paso.
+    void RunStep(long n);          // Se mueve el motor la cantidad de pasos ingresada
+    void Run(float t);              // Gira el motor durante el tiempo ingresado, si es 0 indefinidamente hasta llamada a Stop().
+    void RunRound(int n);           // Girar n vueltas
+    void Ustep(int resolucion, PinName M0, PinName M1, PinName M2);
+                                    // Configura los pasos a 1/2, 1/4, 1/8, 1/16, 1/32
+    
+                                    
+    long StepOnHold;                // Pasos faltantes por ejecutar
+    long StepsBySecond;             // Pasos por segundo
+    
+  private:
+    
+    void moveMotor(void);
+    
+    DigitalOut Dir;
+    DigitalOut Step;
+    int        NPasos;
+    DigitalIn  encodin;
+    DigitalIn  PosInicial;
+    int        EncodPulses;
+    
+    DigitalOut* EnablePin;
+    DigitalOut* M0;
+    DigitalOut* M1;
+    DigitalOut* M2;
+    
+    Ticker Move;                /// Timer de interrupcion
+    float TStep;                /// periodo del paso TStep = 1/StepsBySecond;
+    
+    int entradas;               /// registra cada 2 ingresos a la interrupcion
+
+};
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Sep 03 05:04:12 2021 +0000
@@ -0,0 +1,61 @@
+#include "mbed.h"
+#include "Motor.h"
+
+Serial Mbed(PB_6, PB_7);
+//Serial Mbed(PA_2, PA_3);
+InterruptIn Encoder(PC_9);
+DigitalOut LED(PA_5);
+DigitalIn  Button(PA_0);
+MotorContinuo Mizq(PD_13, PD_11, PB_15, NC,NC,0);
+
+
+long x = 0;
+long muestras[200];
+int  t = 10; 
+int escalon_1 = 10, escalon_2 = 80, escalon_3 = 30, escalon_4 = 50,  escalon_5 = 65, escalon_6 = 5, escalon_7 = 20, escalon_8 = 40;   
+
+
+
+
+
+void interrupt()
+{
+    x ++;
+    
+}
+
+
+
+int main() {
+    
+    Mbed.printf("Hello World\n!");
+    Encoder.rise(&interrupt);
+    
+    long temp = 0;
+    int  duty = 10;
+    
+    
+    
+    while(1) 
+    {
+        
+             //////// Giro sentido 1
+
+            Mbed.printf("Motor Velocidad = %d%% : ",duty);
+            LED = 1;
+            
+            Mizq.Forward();
+            Mizq.SpeedDuty(duty);
+            x = 0;  temp = 0;
+            wait(1); 
+            temp = x;
+            Mbed.printf("PPS = %d : \n",temp);
+            LED = 0;
+            if(Button == 0) { duty++; if(duty > 100) duty = 10; }
+            wait(1);
+            
+        
+    
+        
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Sep 03 05:04:12 2021 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/3a7713b1edbc
\ No newline at end of file