Autor Tema: Control de giro sermovotores por PWM interno del 16f877A  (Leído 7459 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado seo

  • PIC10
  • *
  • Mensajes: 7
Control de giro sermovotores por PWM interno del 16f877A
« en: 10 de Mayo de 2009, 12:34:47 »
Hola... soy nuevo en el foro y me ha gustado bastante... creo que será mi próxima casa... :D

Hoy me trae por aquí algo que quiero compartir con ustedes... necesito hacer lo siguiente:

Tengo que hacer mover dos servomotores en un sentido ambos... (sentido normal, hacía delante) luego si por una entrada del pic llega un alto debo hacer que uno de los motores siga igual y el otro gire en sentido contrario. (para lograr el giro del dispositivo, finalmente es un coche)

Ya leí que para lograr la inversión de giro lo mejor es usar un puente H y hay CI que lo hacen muy bien (según lo que he leído, no lo he probado)

Necesitaría saber si los duros en programación y con más experiencia pueden decirme si el código que anexo a continuación si hace lo que necesito... la verdad no tengo claro como saco por RC1 Y RC2 un pulso definido.. la verdad no me interesa el control de velocidad.. solametne excitar a los motores con el PWM.. podría ser al 100%

Gracias por toda la ayuda.


Código: [Seleccionar]
#include <16F877.h>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#include <lcd.c>
#use delay(clock=200000)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#byte port_a = 5
#byte port_b = 6
#byte port_c = 7
#byte port_d = 8 
 
int entradas;
void main()
           
{     set_tris_a(0x0f);
      set_tris_b(0x00);
      setup_ccp1(CCP_PWM); //Ajusto el PWM por los pines del pic para tal fin
      setup_ccp2(CCP_PWM);
      setup_timer_2(T2_DIV_BY_4,249,1);      //T=(PR2+1)·4·Tosc·TMR2preesc
      lcd_init();
      lcd_putc("EN ESPERA:\nPREPARADO ");
      set_pwm1_duty(75); // Motores a velocidad del 75% del ciclo de trabajo     
      set_pwm2_duty(75);

do{

   if (entradas==1) // Se evalua si el interruptor de inicio está on
{
lcd_init();
lcd_putc("AVANZANDO\nEXPLORANDO TERRENO ");
set_pwm1_duty(75);   // Se le manda señal de excitación a los motores al 75% del ciclo de trabajo
set_pwm2_duty(75);    //
}

   else if (entradas==3) // Si el sensor detecta algo.
{
lcd_init();
lcd_putc("OBJETO DETECTADO:\nGIRANDO ");
set_pwm1_duty(75); // Queda encendido el motor 1
set_pwm2_duty(0); // El segundo motoro se apaga, aunque la idea es que gire en sentido opuesto!
}
}
while(TRUE);
}



Desconectado alexysar

  • PIC16
  • ***
  • Mensajes: 206
    • e-Kit
Re: Control de giro sermovotores por PWM interno del 16f877A
« Respuesta #1 en: 10 de Mayo de 2009, 14:07:27 »
Hola amigo,

El pwm es para variar la velocidad del motor, la idea es la siguiente:


Donde "D": Ciclo de actividad, "T" periodo, EAve: Tensión media. EMax: Tensión de alimentación

Variando el ciclo de actividad de la señal varias la tensión que recibe el motor, y por lo tanto su velocidad.
El puente H con PWM se utiliza para variar el sentido de giro y la velocidad en los cuatro cuadrantes. Si queres variar solo el sentido te recomiendo que no uses PWM porque te vas a complicar. No es que sea excesivamente dificil, pero si lo que necesitas es variar el sentido de giro sin variar la velocidad, es mucho más sencillo hacerlo con puente H pero sin pWM, y el código es más simplificado. Habilitando dos transitores del puente tenes el giro en un sentido y habilitando los otros dos ( y apagando los anteriores) tenes el giro en el otro sentido. Con dos pines del pic lo podes hacer facilmente

Desconectado seo

  • PIC10
  • *
  • Mensajes: 7
Re: Control de giro sermovotores por PWM interno del 16f877A
« Respuesta #2 en: 10 de Mayo de 2009, 16:11:44 »
Haber... yo sé qué se busca con el PWM, lo que trato de decir es que tengo un par de servor que de hecho se exitan con una señal cuadrada (un tren de pulsos) y que para no usar un driver o circuito adicional quiero utilizar las mismas salidas del pic 16f877 para que hacen esto.. tengo entendido q puedo por estas salidas sacar una señal de PWM, es decir, una señal modulada en su ancho de pulso... pero simplifico aún más la cosa por q lo que deseo igualmente no es variar la velocidad si no solamente hacer excitar los motores con EL PWM al 100%

Espero haberme hecho entender.

Un vez superado esa primera fase, pensemos en la inversión de giro del otro motor...

Gracias por el comentario.

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
Re: Control de giro sermovotores por PWM interno del 16f877A
« Respuesta #3 en: 10 de Mayo de 2009, 18:56:30 »
Primero que nada, deberias leer sobre el funcionamiento de un servomotor y entenderlo. Los servomotores requieren una señal pwm de frecuencia fija, tipicamente 50Hz (T=20ms) y dichos motores giran hacia un lado u otro dependiendo del tiempo en que la señal esté en alto (Duty cycle). Ahora bien, los servomotores tienen un tope de giro, algunos giran 180°, algunos 60° algunos apenas 45°, para que giren indefinidamente hacia un lado u otro necesitan modificación en su parte mecánica y electrónica. Para hacer que el motor gire hacia la derecha o hacia la izquierda, debes mantener en alto la señal del pwm durante un tiempo que va de 1ms a 2ms, depende de la marca del servo, esto equivale, en %, a:  1ms-->5%  y 2ms--> 10%.

Lo que tendrías que hacer es calcular los valores a introducir en "set_pwmx_duty(valor)" de modo tal que obtengas 1ms y 2ms; para ello usa la ecuación:
duty= valor*(1/clock)*t2div
donde:
           duty = Tiempo en alto de la señal pwm
           clock = Frecuencia del oscilador (en tu caso es 200.000)
           t2div = prescaler usado en el timer 2 (en tu caso es 4).

Ejemplo para obtener 1ms:
primero despejas "valor" de la ecuación;     

           valor= (duty*clock)/t2div   
           valor=(0.001*200000)/4 
           valor=50

           Para 2ms --> valor=100

Desconectado seo

  • PIC10
  • *
  • Mensajes: 7
Re: Control de giro sermovotores por PWM interno del 16f877A
« Respuesta #4 en: 10 de Mayo de 2009, 19:20:43 »
es decir, entiéndase que ya tengo los servomotores modificados para que giren libremente....

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
Re: Control de giro sermovotores por PWM interno del 16f877A
« Respuesta #5 en: 10 de Mayo de 2009, 19:58:47 »
Entonces ponle un pwm con un duty de 1ms para que gire hacia un lado y uno de 2ms para que gire hacia el otro....

Desconectado seo

  • PIC10
  • *
  • Mensajes: 7
Re: Control de giro sermovotores por PWM interno del 16f877A
« Respuesta #6 en: 12 de Mayo de 2009, 00:43:10 »
Eso he hecho pero sigue sin funcionarme....

Me pregunto cómo es el diagrama básico de conexión para ver si esto funciona o no...

Por favor, ayuda

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
Re: Control de giro sermovotores por PWM interno del 16f877A
« Respuesta #7 en: 12 de Mayo de 2009, 01:14:16 »
Sube el esquema que estas usando para ver...

Desconectado seo

  • PIC10
  • *
  • Mensajes: 7
Re: Control de giro sermovotores por PWM interno del 16f877A
« Respuesta #8 en: 12 de Mayo de 2009, 01:56:18 »
Sube el esquema que estas usando para ver...

Te soy franco.. lo estoy probando con unos leds.. y los tengo conectados directamente a RC1 Y RC2... no tengo nada más conectado en el pic... (obviamente lo que no debe faltar vss, vdd etc.)


Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
Re: Control de giro sermovotores por PWM interno del 16f877A
« Respuesta #9 en: 12 de Mayo de 2009, 02:54:24 »
¿Con unos led?  y como sabes que no hace los giros correctamente? con un duty de 1ms y uno de 2ms prácticamente no hay diferencia en el brillo del led.. si es que encienden con esos valores

Desconectado alcubo01

  • PIC12
  • **
  • Mensajes: 69
Re: Control de giro sermovotores por PWM interno del 16f877A
« Respuesta #10 en: 12 de Mayo de 2009, 08:04:27 »

 Yo opino lo mismo que los compañeros, y creo que el código está mal.

 Segun leo, interpretas que

 set_pwm1_duty(75); // Queda encendido el motor 1
 set_pwm2_duty(0); // El segundo motor se apaga, aunque la idea es que gire en sentido opuesto!

 Pero los servos no funcionan así.

 Para tu caso dices que has modificado los servos. Debe estar modificada la realimentación, sustituyendo el potenciómetro por un par de resistencias para que siempre devuelva el valor medio.

 Si quieres que se paren, debes darle el PWM que se ajuste a la lectura que le está devolviendo la realimentación. Solo en ese punto de equilibrio que el potenciómetro y la señal de entrada son coherentes, conseguirás que el servo esté parado. En tu caso le estás dando un duty de 0, es decir, la señal está a cero todo el tiempo.

 Si aumentas o disminuyes el duty respecto a esa señal centrada consigues giros a derecha o izquierda.



 Además, ¿Cómo pruebas con unos leds? La única manera que se me ocurre es con una habitación a oscuras y un luxómetro. :-)

 Saludos

P.D: Corrijan si me equivoco

Desconectado seo

  • PIC10
  • *
  • Mensajes: 7
Re: Control de giro sermovotores por PWM interno del 16f877A
« Respuesta #11 en: 12 de Mayo de 2009, 10:08:42 »

 Además, ¿Cómo pruebas con unos leds? La única manera que se me ocurre es con una habitación a oscuras y un luxómetro. :-)


Jejeje, bueno cuando lo probaba con led hacía recalculos para la frecuencia.. por q obviamente así no lo iba a poder notar... no obstante voy a hacer otras pruebas y simulaciones en proteus y les comento a ver cómo me va...

gracias de momento por todo... apenas estoy aprendiendo XD

Aprovecho y les hago una pregunta aparte... por que los servos que tengo se excitan sólos.. es decir.. los polarizo y a veces empiezan a andar sin meterle la señal por el cable de datos... o sea sin el pulso.... o a veces con medio tocarlo (con la mano) también empieza a andar...

Desconectado alcubo01

  • PIC12
  • **
  • Mensajes: 69
Re: Control de giro sermovotores por PWM interno del 16f877A
« Respuesta #12 en: 12 de Mayo de 2009, 11:43:56 »


 Ten en cuenta para las simulaciones que hagas lo que te comentamos, el valor que pones en set_pwm1_duty(valor) no significa que estes usando ese % del total de la potencia del servo.

 Respecto a que el servo se mueva solo, ¿Da pequeños latigazos y se para, o es un movimiento continuo? El pequeño latigazo justo al alimentarlos es normal.

 Por cierto, ¿Puedes indicar el tipo de modificación que le has hecho al servo?

 Saludos

Desconectado seo

  • PIC10
  • *
  • Mensajes: 7
Re: Control de giro sermovotores por PWM interno del 16f877A
« Respuesta #13 en: 12 de Mayo de 2009, 17:51:45 »
Respecto a que el servo se mueva solo, ¿Da pequeños latigazos y se para, o es un movimiento continuo? El pequeño latigazo justo al alimentarlos es normal.

 Por cierto, ¿Puedes indicar el tipo de modificación que le has hecho al servo?

en cuanto a lo primero el movimiento es continuo... como si fuera un dc

en lo segundo la modificación, según me dijo quien me los dio.. fue poniendo resistencias fijas.

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Control de giro sermovotores por PWM interno del 16f877A
« Respuesta #14 en: 19 de Mayo de 2009, 08:40:37 »
buenas seo, tendria que ver bien como es la modificación que tiene los servos, pienso que son servos de tipo radio control?
quizas te conviene hacer una modificación mas a esos servos para que giren continuos, lo que te interesa a ti parece que es la reduccion mecanica. La modificación consiste en eliminar por completo la placa de control que trae el servo y conectar solo la alimentación al motor (0 y 5V), de esta forma eliminas el tema de los anchos de pulso de 1ms y 2ms cada 20ms.
Como son motores de poco consumo, con un array de darlingtons, creo es el integrado un2003 o algo así puedes tranquilamente alimentarlos, y ahí si usas el PWM para controlar la velocidad.
El control de la velocidad es importante, quisas en este momento no lo uses pero veras mejoras. Cuando quieres invertir el sentido de giro de un motor que esta girando, las corrientes en contra son grandes, y podrias llegar a tener problemas. Haciendo una pendiente de descenso y ascenso de la velocidad controlada puedes tener un funcionamiento mas suave.
Ademas seria bueno que le pongas algun encoder en las ruedas para ver cuando se detiene cada una y recien ahi invertir la marcha.

Fijate este link: https://www.silabs.com/products/mcu/Pages/MotorControlApplications.aspx
En la Nota de Aplicacion AN191 que te explica un poco como controlar motores.

Saludos
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.


 

anything