Autor Tema: Consultas de novato: PWM.  (Leído 4193 veces)

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

Desconectado Cossworth

  • PIC12
  • **
  • Mensajes: 56
Consultas de novato: PWM.
« en: 02 de Noviembre de 2008, 20:24:51 »
    Hola, antes que nada disculpen si éste tema ya se habló, estuve revisando todo el foro y no encontre lo que busco.

    Hace unos dias que empecé con los PIC's, por ahora solo simulando en proteus (estoy armando un trainer). Hice los ejemplos que figuran en esta seccion como las luces del auto fantastico, displays de 7 segmentos, etc.

    Ahora quisiera hacer algo un poco mas avanzado, la idea que tengo es una lampara rgb manejando cada led con un pwm independiente para poder lograr mezclas de colores (si no se entiende pongo un video).

    Hasta ahora todos los ejemplos de PWM en CSS que encontré en el foro, usan el PWM por hardware, y el micro que yo utilizo (16f628) solo tiene una salida de éste tipo. Por eso ando buscando algun ejemplo o una pista de como hacerlo por soft, solo necesito que haga eso el programa, no pretendo que me escriban el codigo ni nada de eso, solo algo para aprender :)

Muchas gracias!

jacrmr

  • Visitante
Re: Consultas de novato: PWM.
« Respuesta #1 en: 02 de Noviembre de 2008, 20:36:14 »
Tienes que tener un contador (de PWM) que comienza en cero y termina en el número de pasos de PWM que quieras obtener (por ejemplo para 8 bits serían 255 pasos). Con cada incremento tienes que compararlo con tus valores actuales de tus "salidas pwm" y de ahí encenderlas o apagarlas según corresponda.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Consultas de novato: PWM.
« Respuesta #2 en: 02 de Noviembre de 2008, 21:58:17 »
Hola!
Seguro estos post te son de mucha ayuda:

Programa para controlar X servos con 1 interrupción (PIC18 y PIC16)
Algoritmo para controlar hasta 8 servos con una sola interrupción (en C)

Son para generar PWM para servos, pero seguro sacas ideas de como conseguir adaptarlo para leds rgb.
Busca tambien algo sobre el "giroplay", puede que alli hablen sobre como controlar leds rgb.
Salu2
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Consultas de novato: PWM.
« Respuesta #3 en: 02 de Noviembre de 2008, 22:27:49 »
Justo yo estos dias estuve jugando con un led rgb. Me robe un ejemplo de nocturno y lo modifique un poquito para q funcione con un 16f84 a 4MHz. Espero q te sirva.

Código: [Seleccionar]
#include <16F84A.h>
#fuses XT,NOWDT,NOPROTECT
#use delay(clock=4000000)

#byte port_a=0x05
#byte port_b=0x06

#bit  LedRojo        =     port_b.0
#bit  LedVerde       =     port_b.1
#bit  LedAzul        =     port_b.2
#bit  reloj          =     port_b.3

#define Retardo   2
#define precarga  220

int8 Rojo,Verde,Azul, Ticks;

#int_Timer0
void ActivaLed()
{
   Ticks++;

   if (Ticks==0)
   {
      LedAzul=1;
      LedRojo=1;
      LedVerde=1;
      reloj = !reloj;
   };
   if (Ticks==Rojo)
         LedRojo=0;
   if (Ticks==Verde)
         LedVerde=0;
   if (Ticks==Azul)
         LedAzul=0;
   set_timer0(precarga);
}

void Demo()
{
   Rojo=255;
   Verde=0;
   Azul=0;
   for (Verde=0;Verde<255;Verde++)
      delay_ms(Retardo);
   for (Rojo=255;Rojo>0;Rojo--)
      delay_ms(Retardo);
   for (Azul=0;Azul<255;Azul++)
      delay_ms(Retardo);
   for (Verde=255;Verde>0;Verde--)
      delay_ms(Retardo);
   for (Rojo=0;Rojo<255;Rojo++)
      delay_ms(Retardo);
   for (Azul=255;Azul>0;Azul--)
      delay_ms(Retardo);
   Rojo=0;
}

void main()

   set_tris_b(0x00);
   set_tris_a(0xFF);
   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_1);
   set_timer0(precarga);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);
   
   while(TRUE)
   {
      Demo();
   }
}
« Última modificación: 04 de Noviembre de 2008, 11:51:09 por gera »

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado El_Guitre

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1046
Re: Consultas de novato: PWM.
« Respuesta #4 en: 02 de Noviembre de 2008, 23:00:20 »
Este es el proyecto de nocturno que modifico gera, en el site de manolo podes registrarte y ver el codigo para usarlo como guia. Saludos.

Desconectado Cossworth

  • PIC12
  • **
  • Mensajes: 56
Re: Consultas de novato: PWM.
« Respuesta #5 en: 03 de Noviembre de 2008, 07:08:25 »
Muchas gracias a todos por las respuestas, cuando llegue de la uni a la tarde me pongo a leer, ni bien tenga un codigo mas o menos coherente lo subo para que me comenten su opinion :)

Desconectado Cossworth

  • PIC12
  • **
  • Mensajes: 56
Re: Consultas de novato: PWM.
« Respuesta #6 en: 04 de Noviembre de 2008, 11:11:56 »
Estuve leyendo el ejemplo de Nocturno, entendi casi todo :D
Un par de preguntas, en esta seccion de codigo:

Código: [Seleccionar]
#int_Timer0

void ActivaLed() {

Ticks++;



if (Ticks==0) {

LedAzul=1;

LedRojo=1;

LedVerde=1;

};

if (Ticks==Rojo)

LedRojo=0;

if (Ticks==Verde)

LedVerde=0;

if (Ticks==Azul)

LedAzul=0;

set_timer0(140);

}

1º) Cada vez que desborda el timer se ejecuta la funcion que hay debajo de la interrupcion sin importar que haya sido llamada por el main, no? (Nunca usé timers)
2º) Al ser "Ticks" una variable de 8 bits, cuando vale 256 y le sumo 1, vuelve a 0? Sino no encuentro en que parte se resetea :?
3º) El valor de 140 del timer, como se calcula? Lei varias paginas, seguí los pasos que indican ACA pero me da una frecuencia cercana a los 17khz. Es decir, deseo saber a que se debe la eleccion del valor 140, o si puede ser cualquier valor siempre y cuando sea superior a los 33hz para engañar al ojo humano.

Gracias por la paciencia, si les parece adecuado muevan el tema a "Primeros pasos-Iniciación a los Microcontroladores" yo lo coloqé aca porque solo uso C.

Muchas gracias nuevamente.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Consultas de novato: PWM.
« Respuesta #7 en: 04 de Noviembre de 2008, 11:21:55 »
1º) Cada vez que desborda el timer se ejecuta la funcion que hay debajo de la interrupcion sin importar que haya sido llamada por el main, no? (Nunca usé timers)
2º) Al ser "Ticks" una variable de 8 bits, cuando vale 256 y le sumo 1, vuelve a 0? Sino no encuentro en que parte se resetea :?
3º) El valor de 140 del timer, como se calcula? Lei varias paginas, seguí los pasos que indican ACA pero me da una frecuencia cercana a los 17khz. Es decir, deseo saber a que se debe la eleccion del valor 140, o si puede ser cualquier valor siempre y cuando sea superior a los 33hz para engañar al ojo humano.
1-Esa directiva q esta arriba de la funcion, significa q esa funcion es la q se va a ejecutar cuando ocurra la interrupcion del rtcc
2-Exacto, cuando llega a 255, y le sumas 1, vuelve a 0. Aunq es saludable resetear la variable por ahi, cosa de q sea visible al ojo del programador.
3-Tenes q tener en cuenta la frecuencia del oscilador, y el tamaño del timer (el timer1 es de 16 bits, los demas de 8). Yo modifique todos esos valores para q funcione con un clock de 4MHz.

Saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado Cossworth

  • PIC12
  • **
  • Mensajes: 56
Re: Consultas de novato: PWM.
« Respuesta #8 en: 04 de Noviembre de 2008, 11:47:45 »
1º) Cada vez que desborda el timer se ejecuta la funcion que hay debajo de la interrupcion sin importar que haya sido llamada por el main, no? (Nunca usé timers)
2º) Al ser "Ticks" una variable de 8 bits, cuando vale 256 y le sumo 1, vuelve a 0? Sino no encuentro en que parte se resetea :?
3º) El valor de 140 del timer, como se calcula? Lei varias paginas, seguí los pasos que indican ACA pero me da una frecuencia cercana a los 17khz. Es decir, deseo saber a que se debe la eleccion del valor 140, o si puede ser cualquier valor siempre y cuando sea superior a los 33hz para engañar al ojo humano.
1-Esa directiva q esta arriba de la funcion, significa q esa funcion es la q se va a ejecutar cuando ocurra la interrupcion del rtcc
2-Exacto, cuando llega a 255, y le sumas 1, vuelve a 0. Aunq es saludable resetear la variable por ahi, cosa de q sea visible al ojo del programador.
3-Tenes q tener en cuenta la frecuencia del oscilador, y el tamaño del timer (el timer1 es de 16 bits, los demas de 8). Yo modifique todos esos valores para q funcione con un clock de 4MHz.

Saludos!

Buenisimo, me quiero matar, se me habia pasado totalmente por alto tu post, ahora que lo veo es mucho mas "entendible" que el del link.
Veo si hoy puedo hacer el codigo, ya que estoy voy a intentar con la comunicacion serie a ver si lo puedo hacer andar :)

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Consultas de novato: PWM.
« Respuesta #9 en: 04 de Noviembre de 2008, 13:54:40 »
El valor 140 no es crítico. Con él conseguirás aumentar o disminuir la frecuencia de parpadeo de los leds y hay un amplio rango de frecuencias en el que será lo suficientemente rápido como para que el ojo no note parpadeos, y el led responda bien al PWM.
Lo mejor es probar con varios valores y quedarte con el que más te guste.

Desconectado Cossworth

  • PIC12
  • **
  • Mensajes: 56
Re: Consultas de novato: PWM.
« Respuesta #10 en: 04 de Noviembre de 2008, 14:33:16 »
El valor 140 no es crítico. Con él conseguirás aumentar o disminuir la frecuencia de parpadeo de los leds y hay un amplio rango de frecuencias en el que será lo suficientemente rápido como para que el ojo no note parpadeos, y el led responda bien al PWM.
Lo mejor es probar con varios valores y quedarte con el que más te guste.

Muchas gracias, una duda menos :)

Ya tengo un codigo que funciona, casi igual a los que postearon :D pero ahora lo entiendo.

Proximo paso intentar la conexion serial y ensamblarlo en el trainer :-/

Desconectado Cossworth

  • PIC12
  • **
  • Mensajes: 56
Re: Consultas de novato: PWM.
« Respuesta #11 en: 06 de Noviembre de 2008, 16:13:24 »
« Última modificación: 13 de Noviembre de 2008, 00:35:03 por Cossworth »


 

anything