TODOPIC

Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: Celacanto en 08 de Abril de 2014, 14:42:15

Título: Programa para mover un Servo indefinidamente
Publicado por: Celacanto en 08 de Abril de 2014, 14:42:15
Hola a todos los foreros!

Soy bastante nuevo en este mundo de la electrónica, y la verdad es que me apasiona, porque la combino con otra de mis grandes pasiones... la Magia!
Pues sí, como veis, la electrónica y la magia se llevan bastante bien en los tiempos que corren, y por ello me he embarcado en un proyecto que me está quemando las neuronas... ya que, como os acabo de comentar, soy bastante nuevo en el mundo de la programación en C.

Al lío:
He hecho un programita en CCS con el objetivo de hacer que un servo se mueva indefinidamente de 0º a 90º y a 180º, y vuelta a empezar... Para ello lo que he hecho ha sido modificar un programa del gran REDPic (gracias por tus artículos!!!), añadiendo un switch que lo que hace es cambiar automáticamente, cada 50 pulsos, la duración de los pulsos generados que llegan al servo.

Sin embargo, aunque esta mañana me funcionaba a la perfección, hace un rato que el servo sólo se movía en dos direcciones (como si omitiera uno de los casos del switch). No sé si se ha quemado el servo, porque ahora resulta que ni hace el amago de moverse  :shock:  :shock: :shock: Aquí os dejo el programa:


#include <16f628A.h>                  
#fuses INTRC_IO,NOWDT,NOPROTECT,PUT      //ordenes para el programador
#use delay (clock=4000000)               //Fosc=4Mhz
#use standard_io(A)

#define PIN_SERVO1 PIN_A2

const int AJUSTE_FINO_DE_RTCC = 30;     //cada pulso tiene una duración de
const int ticks_PULSO_MINIMO = 44;      //4/4000000 = 1 us * 16 (preescaler) = 16 us
const int ticks_PULSO_MEDIO = 112;
const int ticks_PULSO_MAXIMO = 169;


///////////////TIEMPOS DE LOS PULSOS/////////////
//const int ticks_PULSO_MINIMO = 44;  Son 0.7 ms
//const int ticks_PULSO_MEDIO = 112;   Son 1.8 ms
//const int ticks_PULSO_MAXIMO = 169; Son 2.7 ms
/////////////////////////////////////////////////

int1 flagRTCC = 0;
int contRTCC = 0;
int1 flagSERVO1 = 0;
int tSERVO1 = ticks_PULSO_MEDIO;


#int_RTCC
RTCC_isr(){
  ++contRTCC;
  if(contRTCC==4){
    set_TIMER0(AJUSTE_FINO_DE_RTCC);
  }
  if(contRTCC==5){
    flagRTCC=1;
    contRTCC=0x00;
    }
}

void main() {

int valTIMER0;
int pulsos=0;

  setup_counters(RTCC_INTERNAL,RTCC_DIV_16);
  enable_interrupts(global);
  set_TIMER0(0);
  enable_interrupts(INT_RTCC);

while (1)
{

do {
   if(flagRTCC==1)
     {
      flagRTCC=0;
      output_high(PIN_SERVO1);
      flagSERVO1=1;
     }
 // CONTROL DE ANCHO DEL PULSO PWM
   if(flagSERVO1==1)
     {
      valTIMER0 = get_TIMER0();
      if(valTIMER0>tSERVO1)
       {
        flagSERVO1=0;
        output_low(PIN_SERVO1);
        pulsos++;
       }
     }
  }while (pulsos<50);            //El parámetro pulsos controla el tiempo
                 //que mantiene el servo la posición.
pulsos=0;

switch(tSERVO1){

case ticks_PULSO_MINIMO:
tSERVO1 = ticks_PULSO_MEDIO;
break;

case ticks_PULSO_MEDIO:
tSERVO1 = ticks_PULSO_MAXIMO;
break;

case ticks_PULSO_MAXIMO:
tSERVO1 = ticks_PULSO_MINIMO;
break;
}

}
}


Os pediría un poco de ayuda, a ver si me podéis decir en qué está fallando el programa.

Muchas gracias de antemano.

Un mágico saludo!


Título: Re: Programa para mover un Servo indefinidamente
Publicado por: Miquel_S en 08 de Abril de 2014, 17:16:40
Hola Celacanto, despues de revisar el codigo posteado el cual me parece correcto y comentar que antes te funcionaba me decantaria por un fallo en el hardware, revisa las soldaduras y conexiones.

Saludos!
Título: Re: Programa para mover un Servo indefinidamente
Publicado por: Celacanto en 08 de Abril de 2014, 18:48:30
Ante todo muchas gracias por responder Miguel!

Me alegra lo que me comentas, pues con eso ya se que no es cosa del programa... Antes de que dejara de funcionar me empezó a hacer cosas raras el servo, así que me dio por tocar el regulador de tensión (un L7805CV) y me quemé el dedo!!! ¿Qué pasó?

Después de aquello, he comprobado que el regulador sigue dándome 5V en la patilla de salida, por lo que no se ha dañado.
El sobrecalentamiento habrá sido por un corto supongo, ¿no?.
Por otra parte, el pic lo he vuelto a programar para que haga parpadear un led y parece que funciona con normalidad.
Sin embargo, el servo... ¿se ha podido quemar? Porque no da señales de vida...
Título: Re: Programa para mover un Servo indefinidamente
Publicado por: RedPic en 09 de Abril de 2014, 14:40:29
... REDPic (gracias por tus artículos!!!)

De nada Celacanto, a mandar que para eso estamos.  :mrgreen:

El Servo ¿no hace nada de nada? ¿no vibra? ¿no tiembla? Normalmente cuando el servo está bien pero es la señal la que le llega mal algo hace, generalmente se va a un extremo y ahí se queda temblando ... si no hace nada podrías olerlo a ver si huele a quemado  :shock:
Título: Re: Programa para mover un Servo indefinidamente
Publicado por: Celacanto en 09 de Abril de 2014, 19:16:26
Hola RedPic!!!

En primer lugar, tengo que decirte que para mí es todo un honor que hayas respondido!!!  ((:-)).

Corrígeme si me equivoco, pero creo que acabo de descubrir por qué se ha quemado el servo... El que estaba utilizando era un "Microservo Turnigy Tg9 comp. Futaba, Hitec", y parece ser que este tipo de servos funciona a un voltaje de 4,8 V. El PIC lo estaba alimentando a 5V, a través de un regulador de tensión, pero el servo... lo estaba alimentando directamente con una pila de 9V  :5]. Claro, en cuanto el circuito estuvo funcionando durante más de 10-15 segundos, se quemó el potenciómetro del servo y se produjo un corto, lo que provocó el sobrecalentamiento del regulador. Ay, he pagado la novatada!!!

A comprar otro servo!

Por cierto, por su parte, el pic (un 16F628A) en el pin RA4 sólo funciona como entrada, pero no como salida. He hecho la prueba para que parpadee, poniéndolo en high y low indefinidamente y no responde... ¿Se habrá estropeado como consecuencia del corto provocado por el servo? El pin que mandaba señales al servo era otro diferente (el RA2)

Muchas gracias de nuevo y un saludo!!! ;-)

Título: Re: Programa para mover un Servo indefinidamente
Publicado por: Celacanto en 09 de Abril de 2014, 20:26:22
No he dicho nada... acabo de encontrarme con tu artículo titulado "El PORTA de los PIC's y una de sus particularidades : RA4".

Pues no queda nada más que decir... me quito la chistera  :oops:
Título: Re: Programa para mover un Servo indefinidamente
Publicado por: RedPic en 10 de Abril de 2014, 07:52:21
esas cosas pasan en las mejores familias, bienvenido al club ja, ja, ja  :D :D :D

Título: Re: Programa para mover un Servo indefinidamente
Publicado por: Celacanto en 10 de Abril de 2014, 08:09:50
Una última pregunta, RED!

Quiero que tanto el pic como el servo funcionen con la misma batería, pero el consumo en ambos casos es muy distinto... he visto que hay placas de iniciación como la que tiene la BasicStamp de Parallax, donde con una misma batería son alimentados ambos elementos... ¿qué tengo que hacer para que el amperaje del servo no afecte al pic?

Gracias de nuevo!!! :-/
Título: Re: Programa para mover un Servo indefinidamente
Publicado por: rivale en 11 de Abril de 2014, 13:15:33
Hola Celacanto, puedes alimentar tu pic y tu servo con la misma fuente, solo que la corriente que consume el motor puede generar oscilaciones en la fuente y resetear tu pic, por lo que es recomendable que le pongas capacitores a la alimentación para evitar estos inconvenientes
Título: Re: Programa para mover un Servo indefinidamente
Publicado por: Celacanto en 12 de Abril de 2014, 13:16:27
Hola Rivale!

Eso era lo que necesitaba, porque tras empezar a moverse, la estrella del servo volvía a la posición inicial del programa y empezaba desde cero. Le acabo de poner un condensador y va de lujo.

Muchísimas gracias por tu ayuda Rivale!!!

Un saludo.
Título: Re: Programa para mover un Servo indefinidamente
Publicado por: rivale en 13 de Abril de 2014, 16:35:42
por nada, que bueno que funcionó