Autor Tema: Luz interior para auto  (Leído 1723 veces)

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

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Luz interior para auto
« en: 21 de Julio de 2017, 10:55:20 »
Hola como va a todos, estoy haciendo una placa que suplante la luz interior del auto que se enciende cuando abris la puerta por un sistema automatico que retarda el apagado de la lampara por 10 seg y despues va bajando de a poco  la intensidad hasta apagarse una ve que se cerro la puerta, el sistema tiene un swich que permite prender la luz de forma manual y otro swich para pasar de automatico a manual, el tema esta en que no puedo hacer la rutina PWM para poder ir bajando de a poco la intensidad de la luz, la lampara se conecta a A0, A3 es el swich de la puerta y A2 es para seleccionar entre manual y automatico y A1 es la entrada de descarga de un capacitor que la idea era que la salida copie la descarga de ese capacitor para no tener que hacer el pWM, cargo y lo descargo para copiar la descarga del capacitor en la salida, a ver si alguien me da una mano con esto, adjunto el codigo y el proteus, gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Luz interior para auto
« Respuesta #1 en: 21 de Julio de 2017, 11:52:05 »
Personalmente lo haria asi, sin capacitor:

Código: C
  1. #include <12F675.h>
  2. #FUSES WDT                    // No Watch Dog Timer
  3. #FUSES INTRC_IO                 // >>> Oscilador interno, no CLKOUT
  4. #FUSES PUT                      // Power Up Timer
  5. #FUSES NOMCLR                   // Master Clear pin used for I/O
  6. #FUSES BROWNOUT                 // Reset when brownout detected
  7. #FUSES PROTECT                // Code not protected from reading
  8. #FUSES NOCPD                    // No EE protection
  9.  
  10. static int1 EstadoPrevio;     //Para indicar el estado previo que tenia
  11.  
  12. #use delay(int=4000000,wdt) // Especifica al compilador que hace uso del OSC interno
  13.  
  14. void PWM(int8 x)
  15. {
  16.   output_high(PIN_A0);
  17.   delay_us(x);
  18.   output_low(PIN_A0);
  19.   delay_us(256-x);
  20. }
  21.  
  22. void Automatico()
  23. {
  24.   int8 i;                       //Solo para variar el brillo
  25.  
  26.  
  27.   // Pregunto inicialmente si cambio el estado que tenia el switch. Ya que sino no me molesto en cambiar nada
  28.   if(EstadoPrevio != input_pin(PIN_A3))
  29.   {
  30.     //Actualizo
  31.     EstadoPrevio = input_pin(PIN_A3);
  32.     if(input_pin(PIN_A0))     //Para saber si esta encendido o no
  33.     {
  34.       // Esta encendido por lo cual debo apagarlo
  35.       for(i=255;i>0;i--)
  36.       {
  37.         //restart_wdt();
  38.         PWMsoft(i);
  39.       }
  40.       output_low(PIN_A0);   // Lo dejo en apagado si o si
  41.     }
  42.     else
  43.     {
  44.       //Estaba apagado, por lo cual encendemos
  45.       for(i=0;i<256;i++)
  46.       {
  47.         //restart_wdt();
  48.         PWMsoft(i);
  49.       }
  50.       output_high(PIN_A0); // Lo dejo encedido al finalizar.
  51.     }
  52.   }
  53. }
  54.  
  55. void main()
  56. {
  57.    setup_wdt(WDT_1152MS);
  58.    setup_adc_ports(sAN1|VSS_VDD); //Todos digitales CAMBIAR!
  59.    setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 ); //Para poder generar 200ms
  60.    setup_comparator(NC_NC);   // Todo digital
  61.    output_low(PIN_A0);
  62.    EstadoPrevio = 0;
  63.  
  64.    while(TRUE)
  65.    {
  66.       restart_wdt();
  67.       /*
  68.        *  Primero que nada revisamos que sea manual, aunque considero que la seleccion de
  69.        *  de manual o automatico deberia ser externo al micro. Es decir desactivando al micro.
  70.        */
  71.       if(input_pin(PIN_A2))
  72.       {
  73.         EstadoPrevio = input_pin(PIN_A3);
  74.         output_bit(PIN_A0,EstadoPrevio);     //En caso que sea manual solo responde a la puerta, segun como este el switch de la puerta actua
  75.       }
  76.       else
  77.       {
  78.         // En caso que se seleccione en automatico, es decir actua el PWM
  79.         Automatico();
  80.       }
  81.     }
  82. }

Si quisiera agrandarle el periodo o achicarle la frecuencia al PWM ( Para que no sea tan rapido) lo haria asi:

Código: C
  1. void PWM(int8 x)
  2. {
  3.   output_high(PIN_A0);
  4.   delay_us(x*2);
  5.   output_low(PIN_A0);
  6.   delay_us((256*2)-x);
  7. }

No le pongo delays en Automatico, sino eso te deja con un PWM que no respeta nada.
Si quisiera que copie la descarga de un capacitor, haria una tabla con excel y cambiaria esta parte:

Código: C
  1. int8 TablaDescarga[]={0,1,2,3,4,5,6};
  2.  
  3. void Automatico()
  4. {
  5.   int8 i;                       //Solo para variar el brillo
  6.  
  7.  
  8.   // Pregunto inicialmente si cambio el estado que tenia el switch. Ya que sino no me molesto en cambiar nada
  9.   if(EstadoPrevio != input_pin(PIN_A3))
  10.   {
  11.     //Actualizo
  12.     EstadoPrevio = input_pin(PIN_A3);
  13.     if(input_pin(PIN_A0))     //Para saber si esta encendido o no
  14.     {
  15.       // Esta encendido por lo cual debo apagarlo
  16.       for(i=TablaDescarga[(sizeof TablaDescarga)-1];i>0;i--)
  17.       {
  18.         //restart_wdt();
  19.         PWMsoft(TablaDescarga[i]);
  20.       }
  21.       output_low(PIN_A0);   // Lo dejo en apagado si o si
  22.     }
  23.     else
  24.     {
  25.       //Estaba apagado, por lo cual encendemos
  26.       for(i=0;i<(sizeof TablaDescarga);i++)
  27.       {
  28.         //restart_wdt();
  29.         PWMsoft(TablaDescarga[i]);
  30.       }
  31.       output_high(PIN_A0); // Lo dejo encedido al finalizar.
  32.     }
  33.   }
  34. }
« Última modificación: 21 de Julio de 2017, 11:54:19 por KILLERJC »

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:Luz interior para auto
« Respuesta #2 en: 21 de Julio de 2017, 16:48:17 »
Muchas gracias KIller lo pruebo y te digo :-/


 

anything