jueves, 21 de junio de 2012

Motores DC. Control con L293D.

En la ultima entrada en la que os hablé de los motores de CC, os hablé de varios circuitos integrados que  nos hacen la faena más sencilla integrado en un solo circuito uno o más puentes en H completos.
Este fin de semana he montado una placa en un PCB de pruebas en la que he montado un L293d, con un PIC18F1320. Este microcontrolador es de la familia PIC18, que tan solo tiene 18 pines, pero lleva integrado un módulo ECCP (Enhanced Compare/ Capture/ PWM), el cual me sirve para obtener una señal pwm que luego introduciremos en el pin enable del L293D.
placa

Además también le he añadido un potenciometro conectado a un canal analógico del microcontrolador para poder aumentar o disminuir la velocidad del motor. El código del micro es el siguiente.

   1: #include <p18f1320.h>
   2: #include <delays.h>
   3:  
   4: #pragma config OSC = INTIO2, WDT = OFF, MCLRE = OFF, LVP = OFF
   5:  
   6: void main(){
   7:     
   8:     int duty, duty_reg;
   9:     
  10:     TRISAbits.TRISA0 = 0;    //contron motor como salida.
  11:     TRISAbits.TRISA1 = 0;
  12:     TRISBbits.TRISB3 = 0;
  13:     
  14:     TRISAbits.TRISA3 = 1;    //canal analogico como entrada
  15:     OSCCON = 0x72;    //Configuramos el ooscilador a 8MHz
  16:  
  17: // CONFIGURACIÓN MÓDULO CCP1
  18:     CCP1CON = 0x0C;    //salida simple PWM.
  19:     PR2 = 124;    //Fpwm = 1000 Hz.
  20:     T2CON = 0x06;    //Configuramos preescaler a 1:16
  21:     
  22: //CONFIGURACIÓN MODULO CAD
  23:     ADCON0 = 0x0D;
  24:     ADCON1 = 0x77;    //puertos digitales menos AN3
  25:     ADCON2 = 0x21;
  26:     
  27:     duty = 10;
  28:     duty_reg = 5 * duty;
  29:     CCPR1L = duty_reg / 4;
  30:     
  31:     LATAbits.LATA0 = 1;
  32:     LATAbits.LATA1 = 0;
  33:  
  34:     while(1){
  35:         
  36:         ADCON0bits.GO = 1;
  37:         while(ADCON0bits.DONE == 0);
  38:         
  39:         duty = ADRESH; 
  40:         CCPR1L = duty >> 1;
  41:         
  42:         }
  43:     }

Para reducir el espacio ocupado en la placa he utilizado el oscilador interno del microcontrolador funcionando a 8MHz.
Bueno ahora vamos a lo que interesa, que es el comportamiento del motor. No se si se llega a apreciar en la placa, pero he tenido que poner un condensador en paralelo al motor para evitar una gran sobre tensión inversa que se generaba. La onda que obtengo sin el condensador es la siguiente:


Dibujo1


El pico de tensión inversa llega hasta los –6 voltios, teniendo en cuenta que alimentamos a 4.5 voltios, es considerablemente alto. se observa que mientras la entrada está a nivel alto, alimentamos al motor con la tensión VCC, pero cuando dejamos de alimentar al motor en cada ciclo, no hay cero voltios, sino que tenemos una tensión que corresponde con la tensión que está generando el motor a esa velocidad, de hecho, cuando aumentamos la velocidad, esta tensión aumenta, y si la disminuimos, pues disminuye.
Al poner el condensador, el pico de tensión brusco que se produce desaparece, pero en su lugar tenemos una oscilación que es debida a que el condensador es quizás un poco grande (470nF), con uno de 100nF quizá mejore la respuesta.

IMG_1939

Pero cumplimos nuestro propósito ya que reducimos la tensión inversa hasta –2,3 voltios. En este caso, la oscilación nos tapa la tensión generada por el motor pero ahí sigue estando.



En el video no podéis ver lo que os comentaba de la tensión generada por el motor que aumenta o disminuye con la velocidad,ya que tenemos la oscilación generada por el circuito LC.
La segunda parte del video podéis ver el motor como desacelera si quitamos la alimentación (Enable = 0), y si cortocircuitamos las entradas. La diferencia no es muy grande ya que es un motor pequeño, y la tensión que genera es muy pequeña, por lo que la corriente también es muy pequeña.

No hay comentarios:

Publicar un comentario