TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: leotronik en 26 de Febrero de 2013, 18:22:13

Título: Encoder para posición en grados de un motor DC
Publicado por: leotronik en 26 de Febrero de 2013, 18:22:13
Muy Buenas Tardes Colegas

En esta ocasión me enfrento frente a una duda que tengo con respecto a los encoder.

Quisiera saber si es posible determinar la posición en grados de un motor dc para visualizarlo en una pantalla lcd con un encoder, he leído por algunas paginas pero solo observo que sirve para determinar el numero de vueltas y no la posición.

Les agradezco de antemano que me ayuden a resolver esta duda ya que es un proyecto que estoy desarrollando desde hace rato pero no he encontrado la forma de determinar la posición en grados solo con un encoder.

Muchas gracias por su colaboración.
 
Título: Re: Encoder para posición en grados de un motor DC
Publicado por: planeta9999 en 26 de Febrero de 2013, 20:17:38



Puedes utilizar un servo, salvo que el motor deba de girar libremente, o utiliza un motor paso a paso.
Título: Re: Encoder para posición en grados de un motor DC
Publicado por: AngelGris en 26 de Febrero de 2013, 20:18:28
  ¿Puedes describir un poco más? Soy un poco lento para comprender  :oops:

  Supongo que el motor no estará en movimiento continuo, ya que de ser así su posición estaría cambiando constantemente.

  Tampoco conozco los encoders que van acoplados a los motores, pero imagino que no distarán mucho de los encoders rotativos utilizados por muchos equipos, por ejemplo, como control de volumen.
Título: Re: Encoder para posición en grados de un motor DC
Publicado por: KALLITOS en 26 de Febrero de 2013, 20:47:03
Existen encoder incremental y absoluto.

El encoder incremental traen pulsos A, B y Z este ultimo es un pulso unico en giro que hace de reset y con el cual se pone a 0 un contador y ya alli puedes saber la posicion exacta contando los pulsos A y B hasta que aparezca la Z y resetee el contador, el problema de este encoder es que cuando enciendas el equipo no sabra su posicion hasta que pase por Z.

Existen tambien los encoder absoluto con codificación fija es decir cada cierta distancia circular lleva un unico valor.

San google te despejara mejor tus dudas.

Buscar como encoder incremental y absoluto.

Saludos.
Título: Re: Encoder para posición en grados de un motor DC
Publicado por: RALF2 en 26 de Febrero de 2013, 20:50:07
leotronik
Tal como lo indicas si el motor es DC o AC por lo general se usa un tacometro para saber la velocidad de giro del eje del motor y no la posicion, ya que, la variable posicion por lo general no es de interes. Ahora bien si lo que quieres es saber la posicion del eje del motor, entonces como te han indicado los colegas del foro, debes emplear un servomotor para ello.

Danos una vision un poco mas amplica de lo que piensas hacer con el encoder para que asi podamos ayudarte mejor, que pic vas a utilizar, compilador a emplear...   :mrgreen:

Saludos
Título: Re: Encoder para posición en grados de un motor DC
Publicado por: rivale en 26 de Febrero de 2013, 23:36:29
Hola, en efecto puedes medir el incremento en grados de la posición de un motor, sin embargo, esto depende de la resolución de tu enconder, por ejemplo, si tu encoder tiene 360 divisiones, tu resolución máxima sera de 1 grado
Título: Re: Encoder para posición en grados de un motor DC
Publicado por: leotronik en 27 de Febrero de 2013, 18:56:46
Bueno Colegas Muchas gracias por responder.

Bueno tal y como me han comentado en esencia lo que necesito es identificar las señales de un encoder para que un pic16f877a las reconozca como señales digitales (valores binarios) y poder visualizarlas en una lcd es decir por cada grado que se mueva el eje del motor se pudiera visualizar en la pantalla los grados que se ha movido tanto en un sentido como en otro, por ejemplo si el motor se mueve hacia adelante 3 grados este valor se debe visualizar en la lcd pero si el motor se mueve hacia atrás 10 grados se debe visualizar en la lcd el valor en grados del movimiento hacia atrás.
Espero haberme hecho entender con claridad, cualquier comentario sera bienvenido.
Título: Re: Encoder para posición en grados de un motor DC
Publicado por: KALLITOS en 27 de Febrero de 2013, 19:34:28
Hola, hace un tiempo estuve jugando con encoder y me hice este codigo:

Código: C
  1. #include <16f628.h>
  2. #fuses   INTRC_IO
  3. #fuses   NOWDT
  4. #fuses   PROTECT
  5. #fuses   NOPUT
  6. #fuses   BROWNOUT
  7. #fuses   NOMCLR
  8.  
  9.  
  10. #use delay(clock=4000000)
  11. #use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1)
  12.  
  13. #define  encoder_A   input(pin_b4)
  14. #define  encoder_B   input(pin_b5)
  15.  
  16. #byte    tx_reg = 0x19
  17.  
  18. char  bufer[10];
  19.  
  20. int1  est_ant_1,est_ant_2,flag_cambio_encoder = 0;
  21. int32 encoder = 0;
  22. int16 valor;
  23. int1  enviar = 0;
  24. int8  contador = 0,cont;
  25.  
  26. #INT_RB
  27. void lectura_encoder(void)
  28.  {
  29.  int8 XXX;
  30. if(encoder_A != est_ant_1)
  31.    {
  32.    if(encoder_A){if(!encoder_B){encoder++;}else{encoder--;}}//
  33.    else {if(encoder_B){encoder++;}else{encoder--;}}//
  34.    }
  35. else if (encoder_B != est_ant_2)
  36.    {
  37.    if(encoder_B){if(encoder_A){encoder++;}else{encoder--;}}//
  38.    else {if(!encoder_A){encoder++;}else{encoder--;}}//
  39.    }
  40.  
  41. est_ant_1 = encoder_A;
  42. est_ant_2 = encoder_B;
  43. flag_cambio_encoder = 1;
  44. XXX = input_b();
  45.  }
  46.  
  47. #INT_TBE
  48. void tx (void)
  49. {
  50. if(bufer[cont])
  51.    {
  52.    tx_reg = bufer[cont++];
  53.    }
  54. else
  55.    {
  56.    disable_interrupts(INT_TBE);
  57.    }
  58. }
  59.  
  60.  
  61. #INT_TIMER1
  62. void tmer1(void)
  63. {
  64. set_timer1(valor);
  65. if(++contador > 10)
  66.    {
  67.    contador = 0;
  68.    enviar = 1;
  69.    }
  70. }
  71.  
  72. void main() {
  73.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);          //CONFIGURACION DE TIMER1
  74.    enable_interrupts(INT_TIMER1);
  75.    
  76.    enable_interrupts(INT_RB);
  77.    enable_interrupts(global);                       //ATIVACION DE INTERRUPCION GENERAL
  78.    set_tris_b (0b11111011);                                  //PUERTO B SALIDAS
  79.    valor = 3040;
  80.    set_timer1(valor);
  81.    
  82.    while(true)
  83.       {
  84.       if(enviar)
  85.          {
  86.          sprintf(bufer,"@%6lu%c",encoder,13);
  87.          cont = 0;
  88.          tx_reg = bufer[cont++];
  89.          enable_interrupts(INT_TBE);
  90.          enviar = 0;
  91.          }
  92.       }//
  93.  
  94. }//

Si tu encoder tiene 100 pulsos, el conteo se hace hasta 400, logra obtener conteo por cada flanco tanto de A y B del encoder y hace el aumento decremento del conteo.

Saludos.
Título: Re: Encoder para posición en grados de un motor DC
Publicado por: leotronik en 18 de Marzo de 2013, 10:06:04
Muchas gracias por la ayuda colegas me ha servido mucho...!