Página 1 de 3

Como hacer efecto dimmer

NotaPublicado: Dom Abr 21, 2013 3:16 pm
por soymoe
Hola necesito hacer un efecto dimmer para una placa, lo que tiene que hacer es variar la tension de una salida (la del pic) para poder variar la intensidad de unos leds, tiene que empezar con poco brillo aumentar al maximo y volver a bajar, no quiero usar interrupciones, asi que denme una mando de como hacer la rutina.

Re: Como hacer efecto dimmer

NotaPublicado: Dom Abr 21, 2013 3:36 pm
por Mario
Hola Moe!

Bienvenido al foro!
Nunca supe ni tu nombre, ni tu edad. Si no te molesta, me gustaría que lo compartas con nosotros.
Espero que puedas encontrar un buen espacio de trabajo y consulta aquí en el foro.

Respecto a lo que necesitas: Para variar intensidad deberíamos usar una salida de PWM manejada por un potenciómetro o por dos pulsadores. ¿Sobre cuál te inclinas? ¿O tiene que hacerlo solo al movimiento? Otra cosa, ¿en qué lenguaje trabajas? ¿C, BASIC, ASM?

Saludos moe!
Bienvenido!
Mario

PD: Intenta ser más simpático y amable al escribir moe, quienes te conocemos sabemos que es tu estilo, pero otros pueden escaparte. ;)

Re: Como hacer efecto dimmer

NotaPublicado: Lun Abr 22, 2013 10:34 am
por soymoe
Mario escribió:Hola Moe!

Bienvenido al foro!
Nunca supe ni tu nombre, ni tu edad. Si no te molesta, me gustaría que lo compartas con nosotros.
Espero que puedas encontrar un buen espacio de trabajo y consulta aquí en el foro.

Respecto a lo que necesitas: Para variar intensidad deberíamos usar una salida de PWM manejada por un potenciómetro o por dos pulsadores. ¿Sobre cuál te inclinas? ¿O tiene que hacerlo solo al movimiento? Otra cosa, ¿en qué lenguaje trabajas? ¿C, BASIC, ASM?

Saludos moe!
Bienvenido!
Mario

PD: Intenta ser más simpático y amable al escribir moe, quienes te conocemos sabemos que es tu estilo, pero otros pueden escaparte. ;)

Hola Mario, gracias por responder, mI nombre es Nestor, soy de Esperanza, provincia de Santa Fe, tengo 36 años, soy aficionado a la electronica y ex estudiante de Bioingenieria. Ahora estoy haciendo placas para carteleria led y te consultaba porque algunos ofrecen en sus placas un efecto lllamado "efecto dimmer" que consiste un bajar y subir la intensidad de los led conectados a las placas, no con un control externo sino solo baja y sube la intensidad automaticamente como si fuera otro efecto de luces, no se si me entiendes. Aqui el enlace al producto de mercadolibre, yo quiero agregar ese efecto a mis placas. http://articulo.mercadolibre.com.ar/MLA-453330749-secuenciador-intermitente-5-vias-para-leds-con-dimmer-_JM
Intentare ser mas simpatico, pero como vos decis, es mi estilo. :D

Re: Como hacer efecto dimmer

NotaPublicado: Lun Abr 22, 2013 1:14 pm
por elgarbe
Mario escribió:Respecto a lo que necesitas: Para variar intensidad deberíamos usar una salida de PWM manejada por un potenciómetro o por dos pulsadores. ¿Sobre cuál te inclinas? ¿O tiene que hacerlo solo al movimiento? Otra cosa, ¿en qué lenguaje trabajas? ¿C, BASIC, ASM?


Néstor eso es básicamente lo que necesitamos para ayudarte. Lo que tendrías que agregar en el programa de tu uC (usas uC en tus controladoras?) es una o varias salidas PWM (de Modulacion de Ancho de Pulso), es una técnica por la cual podés encender y apagar tu salida a una frecuencia determinada (>50Hz preferentemente) y regulando el tiempo que la salida está encendida, versus el tiempo que esta apagada en cada ciclo, será el valor medio obtenido a la salida. Es muy simple de realizar y hay miles de ejemplos, pero para ayudarte, como dice Mario, hay que saber que uC usas y en que lenguaje programas....

Saludos!

Re: Como hacer efecto dimmer

NotaPublicado: Lun Abr 22, 2013 2:39 pm
por soymoe
Perdon, es que a veces pienso que el ccs es el lenguaje universal, jaja. Programo en CCS y lo quiero usar en dos tipos de PIC, el 16f628a y el 12f629, asi que el micro a usar no seria importante, porque yo lo podria adaptar, solo necesito una funcion tipo:

void dimmer()

Que pueda llamar para usarla, solo es importante que la variacion de la intensidad de la luz de los led conectados a la salida sea apreciable a la vista, el tiempo entre la subida de la intensidad y la vuelta a bajar, no es critico, pero podria ser de unos 5 segundo, mas o menos.

Re: Como hacer efecto dimmer

NotaPublicado: Lun Abr 22, 2013 3:23 pm
por elgarbe
Ok, aquí tengo código de 3 PWM con el 12F629 (rutinas de PWM robadas a Mario, no digas nada...). Es para controlar unos LED RGB:

No le hagas caso a los comentarios, algunos dicen cualquier cosa, fijate si te huvicas más o menos y dejame las dudas. A la noche cuando vuelvo te respondo.

Código: Seleccionar todo
#include <12F629.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc NO I/O
#FUSES NOMCLR                   //Master Clear pin disabled

#use delay(clock=4000000)

#define PWM_R   PIN_A0
#define PWM_G   PIN_A1
#define PWM_B   PIN_A2

#use fast_io(A)

#byte PORTA = 0x5
#byte TRISA=0x85

int TEMP;

int ACC0;   //ACUMULADORES DE VALORES PWM
int ACC1;
int ACC2;

int DUTY_B;   //PWM DUTY CYCLES DE CADA SALIDA DEL PUERTO B
int DUTY_R;
int DUTY_G;


#int_TIMER0
void TIMER0_isr(void)
{
   ACC0 = ACC0 + DUTY_G;   //ACTUALIZAMOS PWM0
   #ASM RLF TEMP,F #ENDASM
   ACC1 = ACC1 + DUTY_R;   //ACTUALIZAMOS PWM1
   #ASM RLF TEMP,F #ENDASM
   ACC2 = ACC2 + DUTY_B;   //ACTUALIZAMOS PWM2
   #ASM RLF TEMP,W #ENDASM
   #ASM MOVWF PORTA #ENDASM      //PASAMOS LOS ESTADOS DE LOS PWM A LAS SALIDAS
}


//*****************************************************************************
//                            COMIENZA EL PROGRAMA PRINCIPAL
//*****************************************************************************
void main()
{
   int i=0;
   int delay=150;

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   //setup_oscillator(False);
   TEMP = 0;                              //PONEMOS TODAS LAS VARIABLES A CERO
   ACC0 = 0; ACC1 = 0; ACC2 = 0;
   DUTY_G = 0; DUTY_R = 0; DUTY_B = 0;

   TRISA=0b11111000;      //RA0 a RA2 como Salidas del PWM

   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);

   delay_ms(3000);

   do{
      DUTY_G = 0;
      DUTY_R = 0;
      DUTY_B = 0;
      for(i=0;i<255;i+=15){
         DUTY_R = i;
         //DUTY1 = 255-i;
         if(input(PIN_A3)==0){            //Si apretamos el boton Unidad Minuto
            delay_ms(50);                //Espero 100ms para rebote
            if(input(PIN_A3)==0){         //Si sigue apretado (ya no es rebote)
               while(input(PIN_A3)==0);   //Espero a que lo suelte
               delay+=50;                     //Sumo uno a la variable minuto
            }
         }
         delay_ms(delay);
      }
      DUTY_R = 0;
      for(i=0;i<255;i+=15){
         DUTY_G = i;
         //DUTY1 = 255-i;
         if(input(PIN_A3)==0){            //Si apretamos el boton Unidad Minuto
            delay_ms(50);                //Espero 100ms para rebote
            if(input(PIN_A3)==0){         //Si sigue apretado (ya no es rebote)
               while(input(PIN_A3)==0);   //Espero a que lo suelte
               delay+=50;                     //Sumo uno a la variable minuto
            }
         }
         delay_ms(delay);
      }
      DUTY_G = 0;
      for(i=0;i<255;i+=15){
         DUTY_B = i;
         //DUTY1 = 255-i;
         if(input(PIN_A3)==0){            //Si apretamos el boton Unidad Minuto
            delay_ms(50);                //Espero 100ms para rebote
            if(input(PIN_A3)==0){         //Si sigue apretado (ya no es rebote)
               while(input(PIN_A3)==0);   //Espero a que lo suelte
               delay+=50;                     //Sumo uno a la variable minuto
            }
         }
         delay_ms(delay);
      }
     
      DUTY_B = 0;
      DUTY_R = 255;
      for(i=0;i<255;i+=15){
         DUTY_B = i;
         //DUTY1 = 255-i;
         if(input(PIN_A3)==0){            //Si apretamos el boton Unidad Minuto
            delay_ms(50);                //Espero 100ms para rebote
            if(input(PIN_A3)==0){         //Si sigue apretado (ya no es rebote)
               while(input(PIN_A3)==0);   //Espero a que lo suelte
               delay+=50;                     //Sumo uno a la variable minuto
            }
         }
         delay_ms(delay);
      }
      DUTY_R = 0;
      for(i=0;i<255;i+=15){
         DUTY_G = i;
         //DUTY1 = 255-i;
         if(input(PIN_A3)==0){            //Si apretamos el boton Unidad Minuto
            delay_ms(50);                //Espero 100ms para rebote
            if(input(PIN_A3)==0){         //Si sigue apretado (ya no es rebote)
               while(input(PIN_A3)==0);   //Espero a que lo suelte
               delay+=50;                     //Sumo uno a la variable minuto
            }
         }
         delay_ms(delay);
      }
      DUTY_B = 0;
      for(i=0;i<255;i+=15){
         DUTY_R = i;
         //DUTY1 = 255-i;
         if(input(PIN_A3)==0){            //Si apretamos el boton Unidad Minuto
            delay_ms(50);                //Espero 100ms para rebote
            if(input(PIN_A3)==0){         //Si sigue apretado (ya no es rebote)
               while(input(PIN_A3)==0);   //Espero a que lo suelte
               delay+=50;                     //Sumo uno a la variable minuto
            }
         }
         delay_ms(delay);
      }
   }while(TRUE);
}


Saludos!

Re: Como hacer efecto dimmer

NotaPublicado: Lun Abr 22, 2013 11:06 pm
por soymoe
Hola, como te va, gracias por tu interes, mire tu codigo y lo adapte segun mi logica y esto es lo que obtuve:

Quisiera que la variacion sea un poco mas lenta y que baje mas hasta cero, este es mi cogigo:
Código: Seleccionar todo
void dimmer()
{
int i=0,j=0,DUTY_H=0,DUTYL=0;
   for(i=0;i<255;i+=5)
   {
         DUTY_H = i;
         DUTYL = 255-i;
         for(j=1;j<100;++j)
         {
            output_high(PIN_A0);    // PIN_A0 ó GPIO0 = '1'
            output_high(PIN_A1);     // PIN_A0 ó GPIO0 = '0'
            output_high(PIN_A2);
            output_high(PIN_A4);
            delay_us(DUTY_H);
            output_low(PIN_A0);
            output_low(PIN_A1);
            output_low(PIN_A2);
            output_low(PIN_A4);
            delay_us(DUTYL);
         }
   }
   for(i=0;i<255;i+=5)
   {
         DUTY_H = i;
         DUTYL = 255-i;
         for(j=1;j<100;++j)
         {
            output_high(PIN_A0);    // PIN_A0 ó GPIO0 = '1'
            output_high(PIN_A1);     // PIN_A0 ó GPIO0 = '0'
            output_high(PIN_A2);
            output_high(PIN_A4);
            delay_us(DUTYL);
            output_low(PIN_A0);
            output_low(PIN_A1);
            output_low(PIN_A2);
            output_low(PIN_A4);
            delay_us(DUTY_H);
         }
   }
}

Que opinas?

Re: Como hacer efecto dimmer

NotaPublicado: Lun Abr 22, 2013 11:14 pm
por HJ
Hola Nestor.
El vídeo aparece como privado... no se puede ver.

Saludos
HJ

Re: Como hacer efecto dimmer

NotaPublicado: Mar Abr 23, 2013 12:33 am
por soymoe
Gracias por avisar, ya lo cambie.

Re: Como hacer efecto dimmer

NotaPublicado: Mar Abr 23, 2013 8:34 am
por elgarbe
Por lo que veo, vas disminuyendo el tiempo en OFF a la misma vez que aumentas el tiempo en ON y por lo tanto el período de tu PWM es 255uS o sea 3,9Khz.... solo por hacer una prueba, cambia delay_us por delay_ms haver si mejora el apagado. que resistencia tienes en serie con el led?

saludos!