Autor Tema: Aumento PWM  (Leído 2698 veces)

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

Desconectado Xa2

  • PIC12
  • **
  • Mensajes: 58
Aumento PWM
« en: 07 de Abril de 2004, 04:39:00 »
Quiero realizar un programa en el que utilice una funcion para que cuando pulse RB0 se incremente 5 unidades el duty cycle, y cuando se pulse RB1 se decremente 5 unidades!
Mi frecuencia del PWM seria de 1KHZ con un clock de 4MHz, trabajo con int asi que el rango de valores es de 0 hasta 62.5!! 0 - 0% y 62.5 -100%!!
Tengo el programa principal en el que llamo a la fncion de calcular el duty cycle, aunque creo que lo mejor seria hacerlo por interrupcion, no lo se, por favor ayudarme!!!Todo esto se ampliaria a recibir todos estos datos por puerto serie en vez de por pulsadores!!
Gracias y saludos PICMANIACOS!!JEJE!!
Saludos de nuevo

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Aumento PWM
« Respuesta #1 en: 07 de Abril de 2004, 13:19:00 »
Yo me brindo a ayudarte, pero tienes que empezar tú con el programa.

No es necesario que lo hagas por interrupciones.

Un saludo y a ver que programación sacas (!no es dificil!)

Desconectado Xa2

  • PIC12
  • **
  • Mensajes: 58
RE: Aumento PWM
« Respuesta #2 en: 22 de Abril de 2004, 11:36:00 »
AQUI TE DEJO LO QUE HE PODIDO HACER, YA SE QUE NO ES MUCHO, PERO ES QUE ACABO DE EMPEZAR EN ESTO DE CCS Y NO CONTROLO TANTO, ENTONCES ME ENCANTARIA QUE ME PUDIERAS AYUDAR...
FALTARIA HACER QUE EL DUTY INCREMENTARA Y DECREMENTARA SEGUN LAS PULSACIONES EN EL PUERTO B!!!
MUCHAS GRACIAS Y SALUDOS



#include <16f873.h>
#use delay(clock=4000000)
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT

#byte portB=0x06
#byte portC=0x07

int CalcularDuty(void)
{
   //Aqui es donde testeo el puerto B para ver si se ha tocado o RB.0 o RB.1, si es el primero aumento 5 unidades
   // y si es el segundo decremento 5 unidades
  int duty_PWM;
  duty_PWM=31.25; //pongo 31.25 que es el 50% de duty, pero tendria que depender de los pulsadores
  return duty_PWM;

}

void main(void){

   int duty_PWM;
   // (4/4000000)*1*(62+1)=0.001seg 1KHz--1ms

   duty_PWM=0; //inicializo duty=0 para que inicialmente sea 0
   setup_timer_2(T2_DIV_BY_16, 62, 1);

   // seleccionamos PWM para el módulo CCP
   setup_ccp1 (CCP_PWM);

   duty_PWM=CalcularDuty();

   set_pwm1_duty(duty_PWM);


   while(1){   //bucle infinito.
   }
}

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Aumento PWM
« Respuesta #3 en: 23 de Abril de 2004, 02:21:00 »
Bueno, bueno, vamos bien, la cuestión es empezar.

- Mira el 62 de: setup_timer_2(T2_DIV_BY_16, 62, 1);  me parece que es un 61

- La función: CalcularDuty();  deberás meterla en el while, para que cada vez que cambies el valor de un pulsador cambie el duty.

Piensa a ver como harías para inc-dec el duty cada vez que se pulsa uno u otro.

Un saludo

Desconectado Xa2

  • PIC12
  • **
  • Mensajes: 58
RE: Aumento PWM
« Respuesta #4 en: 23 de Abril de 2004, 04:27:00 »
Buenas Pocher y demas foreros!!
Muchas gracias, ya me di cuenta de mi error, el que no sabia era el del timer2 el 61 que me decias, pero ya lo he cambiado, aunque no se el porque...
He conseguido hacer esto, pero al simular si le doy una vez al RB0 dependiendo del tiempo que lo este pulsando me sube hasta el 100% del duty, o hasta casi el 100%, ya se cual es el error, pero no se como solucionarlo. El fallo esta en que depende del tiempo que lo mantanga pulsado, durante ese tiempo me eincrementa el duty constantemente, por eso va directamente al 62.5, que es el 100%. Supongo que se solucionaria con delays, o haciendo que solo incremente una vez cada vez que lo pulse, aunque lo tenga pulsado durante un minuto (exagerando, es para que se vea lo que quiero decir). Claro con el RB1 pasa lo mismo logicamente!
Si me pudieras ayudar de alguna manera por favor!!!
Muchas gracias de todas formas y saludos!!!

+++++++++++++++++++++++++++++++++++++++++++++++
#include <16f873.h>
#use delay(clock=4000000)
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT

#byte portB=0x06
#byte portC=0x07

#bit  RB0 = 0x06.0  //cada pulsacion aumenta 5 unidades el duty cycle
#bit  RB1 = 0x06.1  //cada pulsacion decrementa 5 unidades el duty cycle

int CalcularDuty(void)
{
//Aqui es donde testeo el puerto B para ver si se ha tocado o RB.0 o RB.1, si es el primero aumento 5 unidades
// y si es el segundo decremento 5 unidades
int duty_PWM;

   if(RB0==1)
   {  
         if(duty_PWM>=62.5)
            duty_PWM=62.5;
         else
            duty_PWM=duty_PWM+5;
   }

   if(RB1==1)
   {
         if(duty_PWM>=5)
            duty_PWM=duty_PWM-5;
         else
            duty_PWM=0;
   }

//duty_PWM=31.25; //pongo 31.25 que es el 50% de duty, pero tendria que depender de los pulsadores
return duty_PWM;

}

main(void){

int duty_PWM;
// (4/4000000)*1*(62+1)=0.001seg 1KHz--1ms

duty_PWM=0; //inicializo duty=0 para que inicialmente sea 0
setup_timer_2(T2_DIV_BY_16, 61, 1);

// seleccionamos PWM para el módulo CCP
setup_ccp1 (CCP_PWM);


while(1){   //bucle infinito.

duty_PWM=CalcularDuty();

set_pwm1_duty(duty_PWM);

    }
}

Desconectado Xa2

  • PIC12
  • **
  • Mensajes: 58
RE: Aumento PWM
« Respuesta #5 en: 23 de Abril de 2004, 05:13:00 »
Aqui te mando lo he conseguido ahora mismo, creo que lo he solucionado...lo he simualdo en el Proteus y anda bien, pero al resetear el PWM no me comienza en cero como lo quiero yo, si me pudieras ayudar???
Muchas gracias por todo, haber si te gusta el programita si tiene buena pinta!!!Si se puede simplificar comentamelo!!!
Saludos


***********PROGRAMA***********************

#include <16f873.h>
#use delay(clock=4000000)
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT

#use fast_io(b)

#byte portB=0x06

#bit  RB0 = 0x06.0  //cada pulsacion aumenta 5 unidades el duty cycle
#bit  RB1 = 0x06.1  //cada pulsacion decrementa 5 unidades el duty cycle

int CalcularDuty(void)
{
//Aqui es donde testeo el puerto B para ver si se ha tocado o RB.0 o RB.1,
//si es el primero aumento 5 unidades
//y si es el segundo decremento 5 unidades
int duty_PWM;
int rebote, rebote2;

   
      Delay_Ms(32); //retardo de 32ms

      if(RB0==1) //funcion de la tecla
         {
            if(rebote==1)
            return; //si la bandera en esta caso es 1 se
                     //ejecuta un retorno

      else
         {  

            if(duty_PWM>=62.5)
                  duty_PWM=62.5;
            else
                  duty_PWM=duty_PWM+5; //ejecuta rutina
            rebote=1; // se prende la bandera indica que el
                     //boton ya se presiono y se evitan
                     //los rebotes
         }
         }

      else
      rebote=0; //si la tecla no se presiona se apaga
               //la bandera
               
//******************************************ahora decrementar*****************
     
      Delay_Ms(32); //retardo de 32ms
     
      if(RB1==1) //funcion de la tecla
         {
            if(rebote2==1)
            return; //si la bandera en esta caso es 1 se
                     //ejecuta un retorno
      else
         {  

             if(duty_PWM>=5)
                  duty_PWM=duty_PWM-5;
             else
                  duty_PWM=0; //ejecuta rutina
            rebote2=1; // se prende la bandera indica que el
                     //boton ya se presiono y se evitan
                     //los rebotes
         }
         }

      else
      rebote2=0; //si la tecla no se presiona se apaga
               //la bandera



//duty_PWM=31.25; //pongo 31.25 que es el 50% de duty, pero tendria que depender de los pulsadores
return duty_PWM;

}

main(void){

int duty_PWM;
// (4/4000000)*1*(62+1)=0.001seg 1KHz--1ms

duty_PWM=0; //inicializo duty=0 para que inicialmente sea 0
setup_timer_2(T2_DIV_BY_16, 61, 1);

// seleccionamos PWM para el módulo CCP
setup_ccp1 (CCP_PWM);


while(1){   //bucle infinito.

duty_PWM=CalcularDuty();

set_pwm1_duty(duty_PWM);

    }
}

Desconectado Xa2

  • PIC12
  • **
  • Mensajes: 58
RE: Aumento PWM
« Respuesta #6 en: 23 de Abril de 2004, 05:14:00 »
Aqui te pongo lo que he conseguido, creo haber solucionado el problema; pero al resetear no me deja el PWM en cero, que es lo que yo quiero!!!
Si se puede simplificar comentamelo, espero que tenga buena pìnta el programa!!
Saludos

***************PROGRAMA*****************
#include <16f873.h>
#use delay(clock=4000000)
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT

#use fast_io(b)

#byte portB=0x06

#bit  RB0 = 0x06.0  //cada pulsacion aumenta 5 unidades el duty cycle
#bit  RB1 = 0x06.1  //cada pulsacion decrementa 5 unidades el duty cycle

int CalcularDuty(void)
{
//Aqui es donde testeo el puerto B para ver si se ha tocado o RB.0 o RB.1,
//si es el primero aumento 5 unidades
//y si es el segundo decremento 5 unidades
int duty_PWM;
int rebote, rebote2;

   
      Delay_Ms(32); //retardo de 32ms

      if(RB0==1) //funcion de la tecla
         {
            if(rebote==1)
            return; //si la bandera en esta caso es 1 se
                     //ejecuta un retorno

      else
         {  

            if(duty_PWM>=62.5)
                  duty_PWM=62.5;
            else
                  duty_PWM=duty_PWM+5; //ejecuta rutina
            rebote=1; // se prende la bandera indica que el
                     //boton ya se presiono y se evitan
                     //los rebotes
         }
         }

      else
      rebote=0; //si la tecla no se presiona se apaga
               //la bandera
               
//******************************************ahora decrementar*****************
     
      Delay_Ms(32); //retardo de 32ms
     
      if(RB1==1) //funcion de la tecla
         {
            if(rebote2==1)
            return; //si la bandera en esta caso es 1 se
                     //ejecuta un retorno
      else
         {  

             if(duty_PWM>=5)
                  duty_PWM=duty_PWM-5;
             else
                  duty_PWM=0; //ejecuta rutina
            rebote2=1; // se prende la bandera indica que el
                     //boton ya se presiono y se evitan
                     //los rebotes
         }
         }

      else
      rebote2=0; //si la tecla no se presiona se apaga
               //la bandera



//duty_PWM=31.25; //pongo 31.25 que es el 50% de duty, pero tendria que depender de los pulsadores
return duty_PWM;

}

main(void){

int duty_PWM;
// (4/4000000)*1*(62+1)=0.001seg 1KHz--1ms

duty_PWM=0; //inicializo duty=0 para que inicialmente sea 0
setup_timer_2(T2_DIV_BY_16, 61, 1);

// seleccionamos PWM para el módulo CCP
setup_ccp1 (CCP_PWM);


while(1){   //bucle infinito.

duty_PWM=CalcularDuty();

set_pwm1_duty(duty_PWM);

    }
}

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Aumento PWM
« Respuesta #7 en: 23 de Abril de 2004, 09:43:00 »
Ves como sí que lo has conseguido, ahora solo te queda solucionar ese pequeño detalle.

Yo lo haría así:

Codigo:
#include <16f876.h>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay(clock=4000000)
#byte port_a=0x05

void main(void)
{
   int CCPR1L;
   
// Para cristal de 4 mhz, frecuencia de 1 khz(T=1000us)
// Preescaler de 16

   setup_timer_2(T2_DIV_BY_16, 61, 1);
   
// PR2=(T/(4·Tosc·TMR2preesc))-1=(1000us/(4·1/4MHz·16))-1=62.5-1=61.5=61

   setup_ccp1 (CCP_PWM);   

// CCPR1L=Duty/(4·Tosc·TMR2preesc)
// Para un Duty del 100%=1000us:   CCPR1L=1000us/(4·1/4Mhz·16)=62.5=62

   CCPR1L = 0;
   set_pwm1_duty(CCPR1L);
                   
   while(1)
   {
         if(bit_test(port_a,0))
         {
            if(CCPR1L<60)
            {
               CCPR1L=CCPR1L+5;
               set_pwm1_duty(CCPR1L);      // Salida por RC2
               while(bit_test(port_a,0));
            }
         }
         if(bit_test(port_a,1))
         {
            if(CCPR1L>0)
            {
               CCPR1L=CCPR1L-5;
               set_pwm1_duty(CCPR1L);      // Salida por RC2
               while(bit_test(port_a,1));
            }
         }                                 
   }
}




¡ Si hay alguna metida de pata, házmelo saber !

Un saludo

Desconectado Xa2

  • PIC12
  • **
  • Mensajes: 58
RE: Aumento PWM
« Respuesta #8 en: 23 de Abril de 2004, 11:18:00 »
Muchas Gracias Pocher, que grande eres..jeje!!
Va de cine, y se resetea sin ningun problema!!
Ahora lo siguiente que voy a intentar a hacer va a ser la direccion a l auqe haremos girar el motor, es decir, por una linea haremos que si pulsamos un pulsador de un 1=dchas; y si pulsamos el otro pulsador de un 0=izdas!!
Ya te pondre lo que consiga hacer para que me des tu opinion!!
Saludos y gracias de nuevo!!

Desconectado Xa2

  • PIC12
  • **
  • Mensajes: 58
RE: Aumento PWM
« Respuesta #9 en: 05 de Mayo de 2004, 04:34:00 »
Buenas Foreros!!
Tengo una duda, nunca he programado un puerto serie en C, y no se como hacerlo, lógicamente!!
Querría saber que es lo que llega por el puerto serie al PIc cuando pulsamos una tecla del teclado, claro, con su R-232 correspondiente!!
Me encantaria que me pudierais ayudar, porque no tengo ni idea, he llegado a programar en Ensamblador, pero en C no!!
Si me pudierais ayudar tambien con la inicializacion del puerto serie, a 9600 baudios y demas....
Pero mi principal duda es saber que es lo que llega al PIc por el puerto serie, y como se trata lo que llega!!!
Saludos y gracias adelantadas!!!