Como hacer efecto dimmer

Si te encuentras diseñando, desarrollando o construyendo un proyecto y tienes complicaciones, en este sub-foro podemos ayudarte. Aquí ingresa con los temas que no puedas ubicar dentro de otros sub-foros, por ejemplo, Radio, Microcontroladores, Software, etc. Cuando algo no funciona, de este sub-foro sale en marcha.

Moderador: HJ

Re: Como hacer efecto dimmer

Notapor soymoe » Mar Abr 23, 2013 10:04 am

elgarbe escribió: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!

Probe hacer el cambio que me dijiste, pero el cambio es muy lento y el efecto es solo un parpadeo. La resistencia que tiene puesto es de 390, pero yo planeo usarlo para alimentar led conectados a un uln2003 o conectados a unos transistores.
Avatar de Usuario
soymoe
 
Mensajes: 36
Registrado: Dom Abr 21, 2013 3:10 pm
Ubicación: Esperanza

Re: Como hacer efecto dimmer

Notapor elgarbe » Mar Abr 23, 2013 10:25 am

Entiendo, tendría que simularlo para ver que ocurre, no te gusta el código que te pasé con el timer? ese funciona bien, a lo mejor podríamos tratar de adaptar ese código... Ya estas usando el timer para algo?
El problema de no hacerlo con timer es que los tiempos pueden variar mucho de acuerdo a si entra una interrupcion o no, o dependiendo de cuántas instrucciones hay entre el encendido y el apagado.... de todos modos hay una un momento donde la salida está en 0 y ahí el led debería estar apagado.... a lo mejor el tiempo es muy bajo (esas 100 repeticiones)... podrías probar aumentar el numero del lazo for j....
pasame el código completo de tu programa...

saludos
A palabras producidas por mentes inoperantes órganos auditivos en posicion de relax

You can be anything you want to be just turn yourself into anything you think that you could ever be - Freddie Mercury
Avatar de Usuario
elgarbe
 
Mensajes: 261
Registrado: Jue Mar 21, 2013 8:27 pm
Ubicación: Villa Ramallo - Buenos Aires - Argentina

Re: Como hacer efecto dimmer

Notapor Mario » Mar Abr 23, 2013 10:57 am

Qué pena que no trabajes con BASIC o ASM, Nestor.

Lo que necesitas es esto:



Fué lo que expliqué en ESTE artículo. Hasta el circuito de potencia para manejar LED grandes hay. Espero que puedas hacerlo en C con la ayuda del garbe ;)

Saludos!
Mario
En Servisystem, hay una sección de Montajes que puede llegar a interesarte. Hay muchas ideas útiles y montajes electrónicos para construir. No te olvides: todo lo que sea importante, también estará en el Blog.
Avatar de Usuario
Mario
Administrador del Sitio
 
Mensajes: 428
Registrado: Vie Ene 28, 2011 7:22 am
Ubicación: Principado de San Nicolás de los Arroyos

Re: Como hacer efecto dimmer

Notapor elgarbe » Mar Abr 23, 2013 1:18 pm

Claro, la rutina del timer que hace el PWM es copia casi fiel de tu rutina Mario. Lo ideal sería implementar el PWM en el timer (si es que no esta usando los 2 timer) y habilitar el dimming cuando lo requiera. La rutina de dimming lo que haría es jugar con la variable DUTY para conseguir el efecto que desee...

Saludos!
A palabras producidas por mentes inoperantes órganos auditivos en posicion de relax

You can be anything you want to be just turn yourself into anything you think that you could ever be - Freddie Mercury
Avatar de Usuario
elgarbe
 
Mensajes: 261
Registrado: Jue Mar 21, 2013 8:27 pm
Ubicación: Villa Ramallo - Buenos Aires - Argentina

Re: Como hacer efecto dimmer

Notapor soymoe » Mar Abr 23, 2013 9:31 pm

Mario escribió:Qué pena que no trabajes con BASIC o ASM, Nestor.

Lo que necesitas es esto:



Fué lo que expliqué en ESTE artículo. Hasta el circuito de potencia para manejar LED grandes hay. Espero que puedas hacerlo en C con la ayuda del garbe ;)

Saludos!
Mario

Hola mario, gracias por responder, en realidad se programar tambien en ASM, pero lo deje de lado porque es mas tedioso modificar un codigo en asm que en C. Tengo que llegar a lograr que el led casi se apague o se apague, porque si le meto la señal a un transistor o un uln 2003 y el transist0r sigue en saturacion, la variacion de intesidad de luz no se va a notar en los leds que conecte.
Avatar de Usuario
soymoe
 
Mensajes: 36
Registrado: Dom Abr 21, 2013 3:10 pm
Ubicación: Esperanza

Re: Como hacer efecto dimmer

Notapor soymoe » Mar Abr 23, 2013 9:43 pm

elgarbe escribió:Entiendo, tendría que simularlo para ver que ocurre, no te gusta el código que te pasé con el timer? ese funciona bien, a lo mejor podríamos tratar de adaptar ese código... Ya estas usando el timer para algo?
El problema de no hacerlo con timer es que los tiempos pueden variar mucho de acuerdo a si entra una interrupcion o no, o dependiendo de cuántas instrucciones hay entre el encendido y el apagado.... de todos modos hay una un momento donde la salida está en 0 y ahí el led debería estar apagado.... a lo mejor el tiempo es muy bajo (esas 100 repeticiones)... podrías probar aumentar el numero del lazo for j....
pasame el código completo de tu programa...

saludos

Hola elgarbe, gracias otra vez, el efecto dimmer que quiero hacer, lo quiero incorporar como un efecto mas a toda la linea de placas que hago, algunas con el 12f629 y otras con el 16f628a, asi que como dije debe ser una rutina que pueda llamar a mi antojos, mi programa principal es este:
Código: Seleccionar todo
#include <12F629.h>

#FUSES NOWDT                    // No Watch Dog Timer
#FUSES INTRC_IO                 // >>> Oscilador interno, no CLKOUT
#FUSES PUT                      // Power Up Timer
#FUSES NOMCLR                   // Master Clear pin used for I/O
#FUSES BROWNOUT                 // Reset when brownout detected
#FUSES NOPROTECT                // Code not protected from reading
#FUSES NOCPD                    // No EE protection
#use delay(int=4000000) // Especifica al compilador que hace uso del OSC interno
#byte GPIO=0x05
int estado=0;
int16 retardo=100;
int const Tprendido=7000;
#include <Leepote.c>
#include <Efectoscuz4canales12f.c>

void main()
{
   setup_comparator(NC_NC);   // Todo digital
   set_tris_a(0x00);   
   output_low(PIN_A0);
   output_low(PIN_A1);
   output_low(PIN_A2);
   output_low(PIN_A4);
   while(TRUE){
      intermitente1();
      intermitente2();
      intermitente3();
      intermitente4();
      intermitente5();
      prendido();
      // Bucle
   }
}

Los intermitentes estan en otro archivo y "prendido" tambien
Avatar de Usuario
soymoe
 
Mensajes: 36
Registrado: Dom Abr 21, 2013 3:10 pm
Ubicación: Esperanza

Re: Como hacer efecto dimmer

Notapor elgarbe » Mar Abr 23, 2013 11:23 pm

Fantástico, por lo que veo no usas el timer del micro. estoy en lo correcto?
El efecto dimmer es para todas las salidas por igual o tu eliges en que salida se aplica cada efecto?
pregunto esto por que si es un unico efecto dimmer (lease pwm) es muy simple. pero si necesitas por ejemplo dos partes del cartel con dimmer diferente (una parte del cartel incrementando brillo y otra parte decrementando, por ejemplo), entonces hay que hacer varios canales pwm. en el articulo de Mario se manejan hasta 8 salidas pwm independientes.
Cual sería tu caso?
el efecto dimmer se hace con el timer, una variabke DUTY (por ejemplo) y una salida. si colocas Duty=0 el led queda totalmente apagado. si pones DUTY=255 el led se prende a máximo brillo. entonces en tu rutina dimmer lo que harias es un lazo for desde 0 a 255 saltando cada 10 por ejemplo y en el lazo simplemente incrementas la variable DUTY, el timerse encarga de actuaizarte tus salidas. si te fijas en mi codigo, en el main no se hace nada con las saldas, simplemente hay lazos for que actualizan las variales DUTY y verifco un pulsador para incrementar la velocidad de gransicion del efecto.

si aceptas usar el timer para generar el pwm que te permitirá hacer tu rutina dimmer y si respondes las preguntas al principio, seguro te podemos ayudar con el código.

Saludos!
A palabras producidas por mentes inoperantes órganos auditivos en posicion de relax

You can be anything you want to be just turn yourself into anything you think that you could ever be - Freddie Mercury
Avatar de Usuario
elgarbe
 
Mensajes: 261
Registrado: Jue Mar 21, 2013 8:27 pm
Ubicación: Villa Ramallo - Buenos Aires - Argentina

Re: Como hacer efecto dimmer

Notapor borre » Mié Abr 24, 2013 10:49 am

soymoe escribió:.... asi que como dije debe ser una rutina que pueda llamar a mi antojos....


Pues al igual que como hiciste esto:

Código: Seleccionar todo
#include <Leepote.c>
#include <Efectoscuz4canales12f.c>


Lo mejor seria hacer con un timer una rutina, para que como bien dices lo llames como una función.

Como dice el garbe lo mejor seria hacer el timer, así no importa cuanta programación tengas en main() tu PWM sera lo mas exacto posible. Usar delays() no es una practica muy recomendable.

Saludos!
Avatar de Usuario
borre
 
Mensajes: 46
Registrado: Jue Mar 21, 2013 11:26 pm

Re: Como hacer efecto dimmer

Notapor soymoe » Mié Abr 24, 2013 2:48 pm

elgarbe escribió:Fantástico, por lo que veo no usas el timer del micro. estoy en lo correcto?
El efecto dimmer es para todas las salidas por igual o tu eliges en que salida se aplica cada efecto?
pregunto esto por que si es un unico efecto dimmer (lease pwm) es muy simple. pero si necesitas por ejemplo dos partes del cartel con dimmer diferente (una parte del cartel incrementando brillo y otra parte decrementando, por ejemplo), entonces hay que hacer varios canales pwm. en el articulo de Mario se manejan hasta 8 salidas pwm independientes.
Cual sería tu caso?
el efecto dimmer se hace con el timer, una variabke DUTY (por ejemplo) y una salida. si colocas Duty=0 el led queda totalmente apagado. si pones DUTY=255 el led se prende a máximo brillo. entonces en tu rutina dimmer lo que harias es un lazo for desde 0 a 255 saltando cada 10 por ejemplo y en el lazo simplemente incrementas la variable DUTY, el timerse encarga de actuaizarte tus salidas. si te fijas en mi codigo, en el main no se hace nada con las saldas, simplemente hay lazos for que actualizan las variales DUTY y verifco un pulsador para incrementar la velocidad de gransicion del efecto.

si aceptas usar el timer para generar el pwm que te permitirá hacer tu rutina dimmer y si respondes las preguntas al principio, seguro te podemos ayudar con el código.

Saludos!

No uso el tmer para nada. El efecto lo quiero en principio para todas las salidas a la vez, de (RA0,RA1,RA2,RA4), sin ningun pulsador ni nada.El efecto seria en subida y bajada de intensidad.
Avatar de Usuario
soymoe
 
Mensajes: 36
Registrado: Dom Abr 21, 2013 3:10 pm
Ubicación: Esperanza

Re: Como hacer efecto dimmer

Notapor elgarbe » Mié Abr 24, 2013 5:19 pm

No lo probe, pero esto debería andar:

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_0   PIN_A0
    #define PWM_1   PIN_A1
    #define PWM_2   PIN_A2

    #use fast_io(A)

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

    int TEMP;

    int ACC0;   //ACUMULADORES DE VALORES PWM
    int ACC1;   //Agregar 1 variable por cada salida PWM
    int ACC2;

    int DUTY_0;   //PWM DUTY CYCLES DE CADA SALIDA DEL PUERTO A
    int DUTY_1;   //Agregar 1 variable por cada salida PWM
    int DUTY_2;


    #int_TIMER0
    void TIMER0_isr(void)
    {
   //Copiar estas dos líneas para obtener más salidas PWM en el puerto A
       ACC0 = ACC0 + DUTY_0;   //ACTUALIZAMOS PWM0
       #ASM RLF TEMP,F #ENDASM

       ACC1 = ACC1 + DUTY_1;   //ACTUALIZAMOS PWM1
       #ASM RLF TEMP,F #ENDASM
       ACC2 = ACC2 + DUTY_2;   //ACTUALIZAMOS PWM2
       #ASM RLF TEMP,W #ENDASM
       #ASM MOVWF PORTA #ENDASM      //PASAMOS LOS ESTADOS DE LOS PWM A LAS SALIDAS
               //Cambiar PORTA por el puerto que sea
    }


    //*****************************************************************************
    //                            COMIENZA EL PROGRAMA PRINCIPAL
    //*****************************************************************************
    void main()
    {
       int i=0;
       int delay=150;   //Tiempo en ms que pasa entre cada actualizacion de brillo de led

       setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
       TEMP = 0;                              //PONEMOS TODAS LAS VARIABLES A CERO
       ACC0 = 0; ACC1 = 0; ACC2 = 0;
       DUTY_0 = 0; DUTY_1 = 0; DUTY_2 = 0;

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

       enable_interrupts(INT_TIMER0);
       enable_interrupts(GLOBAL);

       delay_ms(3000);

       do{
      dimmer()
          }
       }while(TRUE);
    }

void dimmer(void)
{
          DUTY_0 = 0;
          DUTY_1 = 0;
          DUTY_2 = 0;
          for(i=0;i<255;i+=15){
             DUTY_0 = i;
             DUTY_1 = i;
             DUTY_2 = i;
             delay_ms(delay);
          }
          for(i=0;i<255;i+=15){
             DUTY_0 = 255-i;
             DUTY_1 = 255-i;
             DUTY_2 = 255-i;
             delay_ms(delay);
          }
}


Cualquier duda con el código me avisas y te explico como hacer para tener más salidas PWM.

Saludos!
A palabras producidas por mentes inoperantes órganos auditivos en posicion de relax

You can be anything you want to be just turn yourself into anything you think that you could ever be - Freddie Mercury
Avatar de Usuario
elgarbe
 
Mensajes: 261
Registrado: Jue Mar 21, 2013 8:27 pm
Ubicación: Villa Ramallo - Buenos Aires - Argentina

AnteriorSiguiente

Volver a Problemas con mis Desarrollos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron