Autor Tema: PWM por Software  (Leído 1483 veces)

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

Desconectado Macko77

  • PIC10
  • *
  • Mensajes: 6
PWM por Software
« en: 01 de Diciembre de 2013, 12:01:19 »
Buenas Amigos, acudo a uds para ver quien me puede colaborar con la inserción de un PWM por software en un proyecto que estoy realizando.

Les cuento el proyecto q realizo es la integración de una tarjeta de adquisición y Matlab, a través de procesamiento de señales en matlab diseñe un sistema de control lumínico, por ahora el pic solo prende y apaga las luces del recinto controlado dependiendo del carácter que le envié matlab, ahora a través de unas señas que haré frente a una cámara matlab detectara un patrón y modificara la intensidad de las luces.

Estuve leyendo y la mejor solución es realizar un  PWM por software, pero la verdad no entiendo mucho la programación de los pic solo básico, quisiera saber si alguien podría colaborarme en esto, es algo así como urgente!

Este es el Codigo en ccs que llevo hasta ahora

#include <18F4550.h> // Definición de registros internos.
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN,NOLVP
#use delay(clock=20000000) // Frecuencia máxima de trabajo 20 Mhz
#use fast_io(A)
#use standard_io(B)
#use standard_io(D)
#include "usb_cdc.h" // Descripción de funciones del USB, entre comillas es porque esta trabajando sobre la misma carpeta
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.

void main() {
   int sal1, sal2;
   unsigned char datoIN;
   usb_cdc_init(); // Configuramos al puerto virtual.
   usb_init(); // Inicializamos el stack USB.
   set_tris_B(0x00); // Configuro el puerto b salida

   while(!usb_cdc_connected())
   {
      OUTPUT_HIGH(PIN_E0);
      OUTPUT_LOW(PIN_E1);
      DELAY_MS(500);
      OUTPUT_HIGH(PIN_E1);
      OUTPUT_LOW(PIN_E0);
   }
   // espera a detectar una transmisión de la PC (Set_Line_Coding).
   
   OUTPUT_HIGH(PIN_E0);
   OUTPUT_LOW(PIN_E1);
 
   sal1=0; //Inicializo Variables alternativas
   sal2=0; //Inicializo Variables alternativas
 
  do{
      usb_task();
         //////////////////////////////////////////////////////
           
      if (usb_enumerated())
      {  // Espera a que el dispositivo sea enumerado por el host.
         OUTPUT_LOW(PIN_E0);
         OUTPUT_HIGH(PIN_E1);
         if(usb_cdc_kbhit())
         { // En espera de nuevos caracteres en el buffer de recepción.
            datoIN = usb_cdc_getc();
           
            if(datoIN == 'a')
            { //¿lo que llegó fué el caracter a = hay movimiento en el salon 1 y esta en el nivel mas alto?
               OUTPUT_HIGH(PIN_B1);
               sal1=1; //si, entonces se prenden las luces del salon 1
            }
            if(datoIN == 'b')
            { // ¿lo que llegó fué el caracter b = hay movimiento en el salon 1 y esta en el nivel 2?
         
            }
            if(datoIN == 'c')
            { // ¿lo que llegó fué el caracter c = hay movimiento en el salon 1 y esta en el nivel 3?
            }
            if(datoIN == 'd')
            { // ¿lo que llegó fué el caracter d = hay movimiento en el salon 1 y esta en el nivel 4?
            }
            if(datoIN == 'g')
            { //¿lo que llegó fué el caracter g = no hay movimiento en el salon 1?
               OUTPUT_LOW(PIN_B1);
               sal1=2;
               //si, entonces se apagaran las luces del salon 1
            }
            if (sal1==1) // Pregunto por variable del salon
            {
            OUTPUT_HIGH(PIN_B2); // Prende Led Indicador
            }
            else
            {
            OUTPUT_LOW(PIN_B2); // Prende Led Indicador
            }           
           }
       }       
   }while (TRUE); // bucle infinito.
}


el caracter a prende las luces , el caracter g apaga las luces y los caracteres b,c,d son las señas para el control de intensidad.

Lo que necesito es implementar el pwm en estos caracteres sobre el pin B0, les agradesco su ayuda!!!
Adjunto el circuito

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: PWM por Software
« Respuesta #1 en: 02 de Diciembre de 2013, 17:40:29 »
Creo que estas equivocado, no necesitas un PWM, necesitas recortar la onda alterna ¿No?, es decir, hacer un dimmer para controlar la W que le llega a la lampara, para eso tienes que controlar el paso por 0 de la onda y despues activar el TRIAC dependiendo de la W que quieras que tenga. El optoacoplador que esta usando no te vale, tiene que ser uno sin cruce por 0, o no usar optoacplador y usar un TRIAC de puerta sensible.

En el foro hay varios DIMMER hechos en los que te puedes basar, no es complicado pero tienes que tener las cosas claras.
« Última modificación: 02 de Diciembre de 2013, 17:59:22 por tapi8 »

Desconectado Macko77

  • PIC10
  • *
  • Mensajes: 6
Re: PWM por Software
« Respuesta #2 en: 02 de Diciembre de 2013, 21:08:35 »
Si el Moc que esta en el diagrama no sirve no cruza por cero, ya lo cambie por un 3020 este si cruza por cero!

Me recomiendas un dimmer o enlace?

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: PWM por Software
« Respuesta #3 en: 03 de Diciembre de 2013, 07:07:37 »
Citar
Si el Moc que esta en el diagrama no sirve no cruza por cero, ya lo cambie por un 3020 este si cruza por cero!

Si, el 3021 creo que es "SIN CRUCE POR 0" cuando la carga es una lampara como en tu caso, puedes cebar el TRIAC directamente con el PIC, tiene que ser un TRIC de "gate sensible".

Aqui tienes uno, con una buena explicacion, el problema para ti es que esta en ensamblador:

http://www.todopic.com.ar/foros/index.php?topic=29205.0

Aqui otro, seguramente el prmero que se hizo en este foro:

http://www.todopic.com.ar/foros/index.php?topic=2246.0

Bueno si despues de mirarlos tienes dudas, pregunta.


 

anything