Autor Tema: Algoritmo para controlar hasta 8 servos con una sola interrupción (en C)  (Leído 65373 veces)

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

Desconectado thom

  • PIC10
  • *
  • Mensajes: 3
Re: Algoritmo para controlar 16 servos (en C) pic18f4550
« Respuesta #75 en: 11 de Agosto de 2010, 13:26:10 »
Felicidades amigo, buen proyecto y es de gran utilidad. bueno solo te quiero pedir el favor de ayudarme con la interfaz grafica, ya que en los enlaces de JIM no se pueden descargar.

Te lo agradezco de antemano!!!! :lol: :lol: :)

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Algoritmo para controlar hasta 8 servos con una sola interrupción (en C)
« Respuesta #76 en: 11 de Agosto de 2010, 18:15:43 »
te has visitado la pagina de RedPic PicMania?
Ahi puede que encuentres mas info hacerca de programar en la PC el puerto serie, creo que es el que usa para controlar los servos.

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

Desconectado thom

  • PIC10
  • *
  • Mensajes: 3
Re: Algoritmo para controlar hasta 8 servos con una sola interrupción (en C)
« Respuesta #77 en: 17 de Agosto de 2010, 17:55:44 »
Amigo, como ya dije, excelente trabajo, pero he tenido inconvenientes con la interfaz gráfica, no me quiere funcionar y eso q me he basado en lo de Jim, agradecería si me envias con el proyecto completo de la interfaz gráfica.

Te lo agradecería.

Desconectado elhertz33

  • PIC10
  • *
  • Mensajes: 1
Re: Algoritmo para controlar hasta 8 servos con una sola interrupción (en C)
« Respuesta #78 en: 25 de Marzo de 2011, 02:47:13 »
hola amigos tengo un proyecto para controlar tres servos solamente e hice elprograma con el algoritmo de interrupcion por timer 1 pero el porblema que tengo es que la frecuencia no funciona esta hecho en un pic 18f4550 deseo su ayuda jejejej y de antemano muchas gracias a este foro por todo lo que he aprendido.
Código: [Seleccionar]
#include <18f4550.h>
#fuses HS,NOMCLR,PUT,NOWDT,NOPROTECT,BROWNOUT,NOLVP,NOCPD,NODEBUG,NOWRT
#use delay(clock=20000000)

#use fast_io(D)
#use fast_io(B)
 
#priority timer1

#define SERVO1 PIN_D7
#define SERVO2 PIN_D6
#define SERVO3 PIN_D5
#define SERVO4 PIN_D4
#define SERVO5 PIN_D3
#define SERVO6 PIN_D2
#define SERVO7 PIN_D1
#define SERVO8 PIN_D0
const int16  TOTAL  = 12500;  // PWM Window for servo = 2.5 ms x 8 = 20 ms
//const int16  Ticks4Minimum =  3500;  // PWM High for Minimum Position = 0.7 ms 
//const int16  Ticks4Center  =  7500;  // PWM High for Center  Position = 1.5 ms 
///const int16  Ticks4Maximum = 11500;  // PWM High for Maximum Position = 2.3 ms 

int16 TIEMPOS[8]={7500,3500,7500,0,0,0,0,0};
static int8  NUMSERVO=0;
static int1  SERVO1_ON=1;
static int1  SERVO2_ON=1;
static int1  SERVO3_ON=1;
static int1  SERVO4_ON=0;
static int1  SERVO5_ON=0;
static int1  SERVO6_ON=0;
static int1  SERVO7_ON=0;
static int1  SERVO8_ON=0;
static int1  ENTRADAS;
static int16 SIGUIENTEINT=53036;

#int_timer1
void timer1_isr(void){
 
   if(ENTRADAS==0){
      if(NUMSERVO==0 && SERVO1_ON) output_high(SERVO1);
      if(NUMSERVO==1 && SERVO2_ON) output_high(SERVO2);
      if(NUMSERVO==2 && SERVO3_ON) output_high(SERVO3);
      if(NUMSERVO==3 && SERVO4_ON) output_high(SERVO4);
      if(NUMSERVO==4 && SERVO5_ON) output_high(SERVO5);
      if(NUMSERVO==5 && SERVO6_ON) output_high(SERVO6);
      if(NUMSERVO==6 && SERVO7_ON) output_high(SERVO7);
      if(NUMSERVO==7 && SERVO8_ON) output_high(SERVO8);
      SIGUIENTEINT = 65535 - TIEMPOS[NUMSERVO];
      set_timer1(SIGUIENTEINT);
   }
   if(ENTRADAS==1){
      if(NUMSERVO==0 && SERVO1_ON) output_low(SERVO1);
      if(NUMSERVO==1 && SERVO2_ON) output_low(SERVO2);
      if(NUMSERVO==2 && SERVO3_ON) output_low(SERVO3);
      if(NUMSERVO==3 && SERVO4_ON) output_low(SERVO4);
      if(NUMSERVO==4 && SERVO5_ON) output_low(SERVO5);
      if(NUMSERVO==5 && SERVO6_ON) output_low(SERVO6);
      if(NUMSERVO==6 && SERVO7_ON) output_low(SERVO7);
      if(NUMSERVO==7 && SERVO8_ON) output_low(SERVO8);
      SIGUIENTEINT = 65535 - TOTAL + TIEMPOS[NUMSERVO];
      set_timer1(SIGUIENTEINT);
      if(++NUMSERVO>7) NUMSERVO=0;
   }
   ++ENTRADAS;
}
void main(void) {
   
 
   disable_interrupts(global);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
   setup_timer_0(RTCC_OFF);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED);
   port_b_pullups(TRUE);
 
   set_tris_D(0b00000000);
   set_tris_B(0b11111111);
 
   output_low(SERVO1);
   output_low(SERVO2);
   output_low(SERVO3);
   output_low(SERVO4);
   output_low(SERVO5);
   output_low(SERVO6);
   output_low(SERVO7);
   output_low(SERVO8);
 
   delay_ms(1000);
 
   set_timer1(SIGUIENTEINT);
   enable_interrupts(int_timer1);
   enable_interrupts(global);

 
   do {
      IF(INPUT(PIN_B0)&&TIEMPOS[0]<11000){
         IF(!INPUT(PIN_B0)&&TIEMPOS[0]<11000){
         TIEMPOS[0]=TIEMPOS[0]+ 250;
         }
      }
      IF(INPUT(PIN_B1)&&TIEMPOS[0]>3800){
          IF(!INPUT(PIN_B1)&&TIEMPOS[0]<11000){
            TIEMPOS[0]=TIEMPOS[0] - 250;
          }
      }
     
   } while (TRUE);
}
 

por favor estoy algo desesperado con esto espero que me puedan ayudar a encontrar la solucion.

Desconectado beatAurex1

  • PIC12
  • **
  • Mensajes: 78
    • Proyectos de Ingeniera -Control-Electrónica y desarrollo embebido.
Re: Algoritmo para controlar hasta 8 servos con una sola interrupción (en C)
« Respuesta #79 en: 30 de Marzo de 2011, 20:35:44 »
una Saludo

Una pregunta Redpic, estuve probando el algoritmo de 8 servos,  pero con 4 servos, la frecuencia, y el tiempo en alto de  de .7,  1.5 y  2,3 ms funciona perfecto, pero hay algun otra forma de que mis servos respondan mas rapido? ya que siento que responden muy lentos.


cuando avanzo hacia adelante o hacia  atras su posicion Servo_PWM+=80; funcionan y se  deslizan suavemente pero  el recorrido es demasiado lento,  aumente los pasos para acelerar el recorrido por ejemplo

Servo_PWM+=400;


Pero no se si haya algun otra  forma de aceelrar el recorrido del servo.

gracias

Desconectado beatAurex1

  • PIC12
  • **
  • Mensajes: 78
    • Proyectos de Ingeniera -Control-Electrónica y desarrollo embebido.
Re: Algoritmo para controlar hasta 8 servos con una sola interrupción (en C)
« Respuesta #80 en: 13 de Abril de 2011, 21:18:51 »
Bueno Me respondo Yo Mismo jaja solo tenia unas lineas de mas por lo cual me respondian bastante lentos los servos.

Saludos

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Re: Algoritmo para controlar hasta 8 servos con una sola interrupción (en C)
« Respuesta #81 en: 25 de Marzo de 2012, 06:01:02 »
Gracias amigo RedPIC por compartir tu excelente idea con todos nosotros, fijate que al ver tu código me entraron ganas de probarlo con un 16F887, así que lo copie, lo pegue, cambie el PIC, comente la línea del Timer3....y vualá!!! funciona de maravillas! y solo me tomo 3 minutos hecharlo a andar, así es cuando de verdad da gusto que los demás compartan sus códigos, muchas gracias.

Solo tengo una inquietud: a qué frecuencia sale la señal de cada PWM?, por que tengo un LED conectado a las salidas y se ve que parpadea muy lentamente, osea que debe ser menor a 24Hz, y lo normal es 50, además se nota la baja frecuencia en los servos cuando lo muevo fuera de la posición y tarda en regresar.
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com