Autor Tema: Eficacia con el PWM por software....  (Leído 24894 veces)

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

Desconectado pocher

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Eficacia con el PWM por software....
« Respuesta #30 en: 12 de Mayo de 2005, 13:36:00 »
Cristian, me miré el Datasheet pero no dispongo del tiempo necesario para investigar el funcionamiento, parece complicado.

Amiguete deldepor, el usar cristales diferentes en los PICs solo va a afectar a la velocidad de ejecución del programa en el PIC correspondiente, no a la comunicación I2C.

El usar la interrupción del I2C por recepción de dato y al mismo tiempo la del TMR1 puede que dé problemas, o no recibirás bien el dato por estar en la int del TMR1 o no funcionará bien el Servo por estar en la int del I2C.

Prueba a quitar la int del TMR1 y a controlar el Servo con el cristal de 1MHz mediante un módulo CCP, yo he probado en PROTEUS el controlar 2 Servos con pwm por hardware y funciona bien.

Un saludo

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
RE: Eficacia con el PWM por software....
« Respuesta #31 en: 12 de Mayo de 2005, 17:28:00 »
Yo también estoy realizando algo parecido pero mi rutina controla 8 servos, en vez de utilizar el I2C, quiero utilizar por lo pronto la usart del pic, yo había pensado activar una patilla del pic que controla los servos para indicar al master que no envié datos por el puerto serie por que estoy trabajando con los servomotores en el periodo critico, que son los 2 primeros mSg de la señal de control, y después habilitar el pin durante el tiempo muerto (18mSg) en el que la rutina de los servos no hace nada... en principio como dice bien pocher si el tiempo muerto se alarga unos milisegundos o se acorta los servos seguirán funcionando bien porque esta dentro de su tolerancia de trabajo... este fin de semana quiero probarlo... podéis internar emularlo y ver que sale pero la lógica me dice que si funciona... es importante que tengas sincronizados todas la salidas de los servos para que esto funcione...
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
RE: Eficacia con el PWM por software....
« Respuesta #32 en: 12 de Mayo de 2005, 17:35:00 »
En mi caso las ocho salidas se activan al mismo tiempo y van cayendo según la necesidad de cada servomotor por lo que cuando pasan 2mSg todas estarán a cero... para comenzar todas juntas la parte muerta de 18mSeg...
Saludos desde Granada, España.

Desconectado aupadeportivo

  • PIC10
  • *
  • Mensajes: 18
RE: Eficacia con el PWM por software....
« Respuesta #33 en: 19 de Mayo de 2005, 06:27:00 »
  Bueno aqui en este programita controlo un motor dc mediante el pwm hardware del pic y un servo por software. Para ello se accede a una interrupcion cada 100us y dependiendo del valor del dutty me genera el pulso deseado para posicionar el servo. Probado fisicamente y funciona pèrfectamente, la unica pega, que para el caso de un pulso de 600 us me lo genera de 1200. Ya lo mirare.

Otra cosa, mediante i2c se envia un byte que recibe el esclavo.  Los 4 primeros bits me marcan la velocidad del motor dc, los 3 siguientes la posicion del servo y el ultimo para hacer que el cacharro vaya hacia alante o hacia atras.  

Pocher, al fianl miramos eso de que porque no recibia correctamente el i2c cuando metiamos la interrupcion del servo y ya funciona. En la directiva de use i2c, en vez de fast pusimos slow, y el puerto c no esta configurado, creo que lo configuraba como salida y creemos que por eso no recibia nada (que va a ser que si).

Bueno este es el programita del esclavo:


#include <16F876A.H>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD//, WRT
#use Delay(Clock=4000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, ADDRESS=0X08, SLOW , NOFORCE_SW)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#byte port_a = 5             // Identificador asociado al registro de dirección 5

#byte port_b = 6             // Identificador asociado al registro de dirección 6

#byte port_c = 7             // Identificador asociado al registro de dirección 7




int periodo, dutty;

#INT_TIMER1                  //Rutina de atención a la interrupcion
void interrupcion()
 {
set_timer1(65472);            //Recarga el timer a 100us (-36us) Base de tiempo

   periodo=periodo+1;            // cada vez que se entre incrementamso periodo

     if(periodo<dutty)             //Duracion de estado alto PWM segun
posicion servo
   {
 output_high(pin_a0);
 }
     else
   {
      output_low(pin_a0);
      }
      if(periodo==200)              // Acaba el periodo
      {
      periodo=0;
      }
   }




void main()
{
int dato, servo, xx, dutycalculado;
set_tris_a(0x00);
set_tris_b(0x00);
enable_interrupts(GLOBAL);                   // Activamos interrupciones
globales
enable_interrupts(INT_TIMER1);               // ... y la interrupcion por TMR1
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_1); //Configuracion TMR1 y preescaler
setup_timer_2(T2_DIV_BY_16,249,1) ;          // Div=16 ; PR2=249 ; Postscale=1
setup_CCP1 (CCP_PWM);
set_timer1(65472);
delay_ms(50);

while(1)
{



   if(i2c_poll())
            {
               dato=0;
               dato=i2c_read();


               i2c_stop();
            }
           
           
            port_b=dato;
            servo= 0b01110000 & dato;

            xx= 0b00001111 & dato; //velocidad (1=10%, 2=20%......10=100%)


            if(xx>10) //
            {
            xx=0;
            set_pwm1_duty(0); //Si es mayor a 10 duty=0
            }
            else
            {
            dutycalculado= 25 * xx ; // Valor a cargar en duty
            set_pwm1_duty(dutycalculado);
            }


            switch (servo)
            {
            case 0:
            dutty=12;
            break;
            case 16:
            dutty=15;
            break;
            case 48:
            dutty=18;
            break;
            case 64:
            dutty=9;
            break;
            case 114:
            dutty=6;
            break;
            }

while (!(i2c_poll()))
{
port_b=dato;



}
}
}


Bueno y el maestro es sencillo, simplemente enviar con las funciones de ccs i2c write()..... etc. Y eso funciona fisicamente sin problemas.

Una cosa que no tiene nada que ver, queremos enviar un byte de un robot a otro mediante infrarrojos y no sabemos muy bien como hacerlo. Hemos encontrado un enlace parece ser que bueno www.jdlope.tripod.com/infra.html  y tal te explica como hacerlo. Si le pegais un vistazo y tal me comentais. Nos gustaria si es posible evitar modular la señal. Si alguien ha hecho algo de esto porfi que comente algo por aqui o que abra un post de comunicacion infrarroja en el subforo de robotica.

Un saludo desde valencia.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
RE: Eficacia con el PWM por software....
« Respuesta #34 en: 28 de Junio de 2005, 08:50:00 »
Estoy de nuevo por aquí, en breve seguire comentando los avances...
Saludos desde Granada, España.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Eficacia con el PWM por software....
« Respuesta #35 en: 28 de Junio de 2005, 10:22:00 »
No hay algun pic con muchos canales (al menos 5) para PWM por hard, y ke sea capaz de hacer pulsos de 20hz?, o hay que hacerlo a lo cutre ... (poniendo un crista muyyyyyyy lento) RollEyes
Si juegas contra el mejor, pierdes como los demás.

Desconectado pocher

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Eficacia con el PWM por software....
« Respuesta #36 en: 28 de Junio de 2005, 10:47:00 »
Los hay, concretamente con ese número que has puesto: 5.

Ahora hay que encontrar a alguién que nos informe de su funcionamiento.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Eficacia con el PWM por software....
« Respuesta #37 en: 28 de Junio de 2005, 12:09:00 »
No entiendo lo que quieres decir pocher, con lo de "su funcionamiento". Yo los use cuando programa en ensablador, solo hay que escribir 2 numeros para indicar la frecuencia y el duty (periodo de trabajo), ambos con una pequeña formulita, este modulo si mal no recuerdo usaba el timer1, mi problema es que este modulo aunque cuenta con un preescaler, no lo es suficiente como para generar pulsos de 20hz, al menos con un cristal de 4mhz. Si a alguien le interesa como "usar" esas formulas busco entre el papeleo que tengo aquí y posteo.

En cuanto al PIC que dices con 5 modulos CCP, ¿me puedes indicar el modelo? Y ... ¿no habia unos PICs a los que se le podian poner un segundo cristal para estos menesteres? ó lo he soñado yo ...

Sorry, estoi leyendo entero el hilo y parece ser que llego tarde Avergonzado es un tocho considerable y da pereza, de todas formas el control de los servos parece que no ha quedado del todo claro, ami me parece como mejor solución el uso de esos pics con el 2º cristal (si se puede) o otro pic para gobernarlos con un cristal lento y comunicarlos con algun protocolo, p.ej. i2c.
Si juegas contra el mejor, pierdes como los demás.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Eficacia con el PWM por software....
« Respuesta #38 en: 28 de Junio de 2005, 17:08:00 »
jeje ... pues si encontrais info sobre los PIC con segundos cristales que sirven para el modulo CCP estaria agradecido. Creo que si existe es una solución muy buena, (que vale un cristal... 20centimos? ... en cambio un 2º pic ..). Aver que veo, ya postearemos algo :P
Si juegas contra el mejor, pierdes como los demás.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Eficacia con el PWM por software....
« Respuesta #39 en: 30 de Junio de 2005, 05:41:00 »
En www.superrobotica.com venden un kit de un brazo, concretamente este http://www.superrobotica.com/S300105.htm con el que adjuntan esto:



Y cito textualmente:
____________________________________________________________________

 La versión de kit completo incluye el circuito SSC (Serial Servo Controller) que permite controlar desde un puerto serie RS232 hasta 8 servos independientes. Este circuito SSC recibe las ordenes de movimiento de un PC, un BASIC Stamp o cualquier otro microcontrolador y genera los pulsos de control de posición de los servos.

____________________________________________________________________

Quisiera saber que lleba eso !!
Ardiendo Avergonzado
Si juegas contra el mejor, pierdes como los demás.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Eficacia con el PWM por software....
« Respuesta #40 en: 03 de Julio de 2005, 18:22:00 »
Creo que lleba algo como esto:

http://www.the-starbearer.de/Roboterelektronik/servo/sd20.pdf

Quien tiene mas info del SD20 !!! Rebotado
Si juegas contra el mejor, pierdes como los demás.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
RE: Eficacia con el PWM por software....
« Respuesta #41 en: 04 de Julio de 2005, 10:41:00 »
Es magnifico, pero parece que esta un poco en Alemán...
A ver si alguien consigue algo mas de información...
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
RE: Eficacia con el PWM por software....
« Respuesta #42 en: 06 de Julio de 2005, 18:25:00 »
Bueno le di un pequeño empujoncito a la rutina, he logrado fusionar mi antigua rutina de control de puerto serie con la rutina PWM, actualmente ambas coexisten compartiendo los recursos del micro sin interferir una en la otra... por lo que me quedaría implementar un protocolo con los datos recibidos por el RS232...

En principio había pensado en enviar una trama compuesta por un byte de arranque o cabecera + un byte de comando + el estado de los ocho servos  (8 byte) + checsum...
Lo del byte de comando es por implementar ordenes abreviadas o genéricas a todos los servos como... todos a off o posición central, o todos a un lado, o a otro... etc... acepto cualquier sugerencia...

Después de esto quedaria optimizar el sistema para lograr controlar el máximo numero de servos... y posiblemente habilitar también la posibilidad de controlar el sistema por I2C...

PD.
Le deje a la rutina de puerto serie un búfer de entrada de 50 byte por si hubiera algún tipo de retrazo en la interpretación de los datos recibidos pero en principio no he observado ninguno, por lo que se ve los 20Mhz están dando su fruto...
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
RE: Eficacia con el PWM por software....
« Respuesta #43 en: 07 de Julio de 2005, 19:25:00 »
Ya termine el primer comando serie, le indica a los ocho servos el nuevo estado...
Y por el momento todo ok...

Haciendo un resumen, el 16F877 esta gestionado un display de 2x16 caracteres, la rutina de los ocho servos por software y el puerto RS232...
Saludos desde Granada, España.

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Eficacia con el PWM por software....
« Respuesta #44 en: 08 de Julio de 2005, 02:49:00 »
Puedes indicarme por encima como as planteado el PWM por soft, según se me ocurre amí necesito 2 timer, ¿como lo hiciste tú?
Si juegas contra el mejor, pierdes como los demás.