Super Dimmer, hasta 16 lámparas con un solo PIC

Muy buen aporte. Excelente redacción y descripción del proceso. Tomé el código como base para implentarlo en un 16F628A a 4Mhz.

Saludos
 
Muy bien amigos... Despues de un largo reseso y desconectado del mundo cibernetico me vuelvo a conectar a la red.
Aqui os dejo lo q antes mencione el dimmer con control de grados bueno es algo simple pero espero q les sirva como ref. (el programa esta echo en basic con el pic 16f877a y no uso ningun timer solo logica matematica) :d
 

Adjuntos

  • Dimmer_X.rar
    140.8 KB · Visitas: 555
muchas gracias por tus aportes son de muyy buena utilidad para los codigos de mas complicacion voy a probarlo ya que recien soy nuevo en este foro que es muy muy bueno para nosotros los principiantes
 
Muy bien amigos... Despues de un largo reseso y desconectado del mundo cibernetico me vuelvo a conectar a la red.
Aqui os dejo lo q antes mencione el dimmer con control de grados bueno es algo simple pero espero q les sirva como ref. (el programa esta echo en basic con el pic 16f877a y no uso ningun timer solo logica matematica) :d

gracias Yobtbox... pense que te habias olvidado jejeje!!!!! ahora mismo lo reviso (y)

muchas gracias por tus aportes son de muyy buena utilidad para los codigos de mas complicacion voy a probarlo ya que recien soy nuevo en este foro que es muy muy bueno para nosotros los principiantes

aqui estamos para apoyarnos unos a otros josseph.. saludos
 
pues en verdad te agradesco mucho por tu aporte dinoelectro justo estoy luchando con un codigo de interrupcion que no me sale en nada cual modifico pero estoy echandole haber si me sale
 
Muy bien amigos... Despues de un largo reseso y desconectado del mundo cibernetico me vuelvo a conectar a la red.
Aqui os dejo lo q antes mencione el dimmer con control de grados bueno es algo simple pero espero q les sirva como ref. (el programa esta echo en basic con el pic 16f877a y no uso ningun timer solo logica matematica) :d

el pin 1 del moc a donde va conectado :confused: al pin 16 del microprocesador :eek:
 
Dino electro el proyecto que implementaste me cayo como anillo al dedo pues estaba buscando algunas ideas para hacer proyectos q reflejen lo avanzado en una materia q llevo en La U. llamada Electronica de potencia pa culminar el semestre... pues en si la teoria ya lo havia estudiado con gran detalle las formas de disparar un triacs y sus formas de onda pues ya lo tenia clara la idea pero me qedaba algunas dudas q qedaron despejadas al leer el documento anexado atu proyecto pues lo llegue a entender mejor q en la U. jajaj...
Asi q hise algunos pequeños cambios en el programa como mostrar en un lcd el porcentaje de la tencion manejada por los triacs y mostrar el estado de los botones(on /off) en pantalla lcd
cabe recalcar q la funcion de on/off lo realise con un solo boton, pues nesecitaba optimisar los botones ya q controle todo el circuito por un sencillo circuito de Radio frecuencia con los
(CI. Tx2b y Rx2b)...
otro peqeño cambio q realise fue q el circuito funcione como control de fase de la señal osea disparar el triacs en un angulo determinado 15grados 30 grados 90 grados...etc con un teclado matricial y lcd..
todo lo escribo como comentario a modo de agedecerte por el aporte...
subire algunas fotos y videos del proyecto ya funcionando.
El proyecto no lo subo pues m parece q no tiene muchos cambios q el original pues si algen m lo pide gustoso lo subire al foro. saludos foreros. :D

Yobtox que tal??? Gente del foro un saludo y muchas gracias en especial a raul por este aporte tan buenisimo en verdad!!! Espero retribuir esa gentileza de su parte con mi dimmer que estoy diseñando!!! Tengo en mente visualizar el porcentaje de potencia y los grados tal como lo hizo yobtox!!! y si es posible acoplar un teclado matricial para sustituir los pulsadores, que seria genial si llega a concretarse!!! no se si puedan darme una mano!!! Estudio mecatronica y estoy programando en c con el ccs!!! seria genial si puedieras subir tu arreglo con el lcd!! esta en C!! gracias desde ya
 
para el dimmer tiene que ser exclusivamente el moc3021? es que yo estoy utilizando un moc3011 y un triac 6075A y no funciona bien el dimmer solo me varia del 10 al 50% y luego ya me manda al 100% y ando buscando x q no me funciona el dimmer lo realice basandome en el de este tema y la simulacion si me da bien todo pero al conectarlo fisicamente no me sale correctamente
 
puedes utilizar el MOC3011 y el 6075A también

el dimmer que se programo en PIC C funciona correctamente, el que esta programado en ASM tiene algunas falencias.. otra cosa que tienes tener en cuenta que esta pàra funcionar en una red de 60 Hz.
pero si en tu pais la corriente electrica es de 50Hz deberas hacer algunos ajustes
 
hola miguel.. puedo ver en la simulacion que las ondas estan perdiendo sincronia, esto se debe principalmente a que has colocado un circuito detector de cruce por cero externo. esto no es necesario debido a que la deteccion de cruce por cero la realiza el propio PIC; lo único que necesitas es colocar una resistencia de 1M entre la corriente alterna y el pin B0. Muchos piensan que la corriente alterna destruira al PIC, pero eso no es cierto. revisa la nota AN521 de microchip "AC Power line interfacing"


te dejo el codigo de un dimmer que programe recientemente, observa en la simulacion que las ondas no pierden sincronia. saludos!!
 

Adjuntos

  • 6.Dimmer.rar
    64.1 KB · Visitas: 369
a ok, muchas gracias pero se supone que deberia ser igual que si utilizara lo que dice la an521 no? ya que el circuito que tengo yo pues tambien detecta cruce por cero con la interrupcion del RB0 para mandar el retardo, entonces se podria decir que mi circuito detector de cruce por cero no este bien hecho? por cierto que pasa si tomo un transformador de 12 v y luego le pongo una resistencia menor para luego conectar al pin RB0 del pic? en base a la nota an521, tambien si tomo la senal directo con todo el voltaje no le pasa nada al probar en un protoboard?
 
no es necesario el transformador(prefiero compro una resistencia y no un transformador).. tampoco es necesario ese optoacoplador que has colocado; es mas por lo que veo en simulacion el circuito optoacoplado te esta dando transiciones falsas.

utiliza solo una resistencia entre 1 a 5M y no te compliques tanto.
 
Última edición:
hola gente!!!
necesito ayuda con este programita en C q hice, el PIC C Compiler lo compila y todo, pero no anda como espero..
se trata de un dimmer que adopta 4 posiciones: 0%(off), 30%, 60%, y 100%(on); este mismo es controlado por un "bus" de 8cablecitos que adoptan 256 valores(combinaciones= nros binarios de 8bit) y cada posicion de dimmer se activa con una combinacion distina:
OFF= 1decimal = 00000001
30%=2decimal = 00000010
60% = 3 dec = 00000011
ON= 4 decim = 00000100

el tema es que para recibir estas señales ocupo todo el PORT_B y no puedo usar una iterrupcion externa en el programa, asi que el pase por cero lo intente entrar por RA0; RA1 va al TRIAC. RA2 es ON con un micro swicht, y RA3 es OFF con un micro sw.
les dejo el codigo a ver que opinan:

(escribi todo el codigo, pero la parte de dimmer que quiero corregir es la que esta con rojo.. y despues transfiero la correccion al resto..)

---------
Código:
#include<16f628a.h>
#fuses  INTRC_IO,NOWDT,NOPUT,NOPROTECT,NOMCLR
#byte TRISB = 0x86
#byte port_b=6
#use standard_io(b)
#byte port_a=5
#byte TRISA = 00001101
#use delay(internal=4000000)

void main()
{       
   port_b_pullups(FALSE);
   
   while(true) ///esto repite todo el programa para leer siempre
   {
   
   ///1 decimal "on"
   
   while(input(pin_b0) && !input(pin_b1) && !input(pin_b2) && !input(pin_b3)
      && !input(pin_b4) && !input(pin_b5) && !input(pin_b6) && !input(pin_b7) || input(pin_a2))
   {
      int i; 
   //10%
 for ( i=0 ; i<17 ; i++ ) //en cada bucle for pasan siempre 10 ms
  { 
  if (!input(pin_a0))
   delay_ms (9);
   output_high(pin_a1);
         while(true)
         {
         if (!input(pin_a0))
         break;
         }
   output_low(pin_a1);
  } 
  //20%
  for ( i=0 ; i<17 ; i++ ) //en cada bucle for pasan siempre 10 ms
  { 
  if (!input(pin_a0))
   delay_ms (8);
   output_high(pin_a1);
         while(true)
         {
         if (!input(pin_a0))
         break;
         }
   output_low(pin_a1);
  }
  //30%
    for ( i=0 ; i<17 ; i++ )
  { 
  if (!input(pin_a0))
   delay_ms (7);
   output_high(pin_a1);
         while(true)
         {
         if (!input(pin_a0))
         break;
         }
   output_low(pin_a1);
  }
  //40%
    for ( i=0 ; i<17 ; i++ ) //en cada bucle for pasan siempre 10 ms
  { 
  if (!input(pin_a0))
   delay_ms (6);
   output_high(pin_a1);
         while(true)
         {
         if (!input(pin_a0))
         break;
         }
   output_low(pin_a1);
  }
  //50%
    for ( i=0 ; i<17 ; i++ ) //en cada bucle for pasan siempre 10 ms
  { 
  if (!input(pin_a0))
   delay_ms (5);
   output_high(pin_a1);
         while(true)
         {
         if (!input(pin_a0))
         break;
         }
   output_low(pin_a1);
  }
  //60%
    for ( i=0 ; i<17 ; i++ ) //en cada bucle for pasan siempre 10 ms
  { 
  if (!input(pin_a0))
   delay_ms (4);
   output_high(pin_a1);
         while(true)
         {
         if (!input(pin_a0))
         break;
         }
   output_low(pin_a1);
  }
  //70%
    for ( i=0 ; i<17 ; i++ ) //en cada bucle for pasan siempre 10 ms
  { 
  if (!input(pin_a0))
   delay_ms (3);
   output_high(pin_a1);
         while(true)
         {
         if (!input(pin_a0))
         break;
         }
   output_low(pin_a1);
  }
  //80%
    for ( i=0 ; i<17 ; i++ ) //en cada bucle for pasan siempre 10 ms
  { 
  if (!input(pin_a0))
   delay_ms (2);
   output_high(pin_a1);
         while(true)
         {
         if (!input(pin_a0))
         break;
         }
   output_low(pin_a1);
  }
  //90%
    for ( i=0 ; i<17 ; i++ ) //en cada bucle for pasan siempre 10 ms
  { 
  if (!input(pin_a0))
   delay_ms (1);
   output_high(pin_a1);
         while(true)
         {
         if (!input(pin_a0))
         break;
         }
   output_low(pin_a1);
  }
   //100%
   output_high(pin_a1); ///on
   }
   
    ///2 decimal "dimmer 30%"
   
   while(!input(pin_b0) && input(pin_b1) && !input(pin_b2) && !input(pin_b3)
      && !input(pin_b4) && !input(pin_b5) && !input(pin_b6) && !input(pin_b7))
   {
      while(true) ///...para que se repita el on tiempo off tiempo...
      {
   if (!input(pin_a0)) ///si pin_a0 esta en low se esperan (x)mili segundos y se pone high pin_a1
   delay_ms (7);
   output_high(pin_a1); ///30%
         while(true) ///se lee el pin_a0 hasta que vuelve a estar low y todo comienza de vuelta desde el otro while true!
         {
         if (!input(pin_a0))
         break;
         }
    output_low(pin_a1);
   if(input(pin_b0) && !input(pin_b1) && !input(pin_b2) && !input(pin_b3)
      && !input(pin_b4) && !input(pin_b5) && !input(pin_b6) && !input(pin_b7))
      break; ///si se lee otro comando reconocido entonces terminar el while! (1 decimal)
   if(input(pin_b0) && input(pin_b1) && !input(pin_b2) && !input(pin_b3)
      && !input(pin_b4) && !input(pin_b5) && !input(pin_b6) && !input(pin_b7))
      break; ///si se lee otro comando reconocido entonces terminar el while! (3 decimal)
   if(!input(pin_b0) && !input(pin_b1) && input(pin_b2) && !input(pin_b3)
      && !input(pin_b4) && !input(pin_b5) && !input(pin_b6) && !input(pin_b7))
      break; ///si se lee otro comando reconocido entonces terminar el while! (4 decimal)
      } ///...para que se repita el on tiempo off tiempo...
   }
   
    ///3 decimal "dimmer 60%"
    
   while(input(pin_b0) && input(pin_b1) && !input(pin_b2) && !input(pin_b3)
      && !input(pin_b4) && !input(pin_b5) && !input(pin_b6) && !input(pin_b7))
   {
      while(true) ///...para que se repita el on tiempo off tiempo...
      {
   if (!input(pin_a0)) ///si pin_a0 esta en low se esperan (x)mili segundos y se pone high pin_a1
   delay_ms (4);
   output_high(pin_a1); ///60%
         while(true) ///se lee el pin_a0 hasta que vuelve a estar low y todo comienza de vuelta desde el otro while true!
         {
         if (!input(pin_a0)) ///capas que este while esta al pedo... no se..
         break;
         }
   output_low(pin_a1);
   if(input(pin_b0) && !input(pin_b1) && !input(pin_b2) && !input(pin_b3)
      && !input(pin_b4) && !input(pin_b5) && !input(pin_b6) && !input(pin_b7))
      break; ///si se lee otro comando reconocido entonces terminar el while! (1 decimal)
   if(!input(pin_b0) && input(pin_b1) && !input(pin_b2) && !input(pin_b3)
      && !input(pin_b4) && !input(pin_b5) && !input(pin_b6) && !input(pin_b7))
      break; ///si se lee otro comando reconocido entonces terminar el while! (2 decimal)
   if(!input(pin_b0) && !input(pin_b1) && input(pin_b2) && !input(pin_b3)
      && !input(pin_b4) && !input(pin_b5) && !input(pin_b6) && !input(pin_b7))
      break; ///si se lee otro comando reconocido entonces terminar el while! (4 decimal)
      } ///...para que se repita el on tiempo off tiempo...
   }
   
   ///4 decimal off
   
   while(!input(pin_b0) && !input(pin_b1) && input(pin_b2) && !input(pin_b3)
      && !input(pin_b4) && !input(pin_b5) && !input(pin_b6) && !input(pin_b7) || input(pin_a3))
   {
   int i; 
   //90%
 for ( i=0 ; i<17 ; i++ ) //en cada bucle for pasan siempre 10 ms
  { 
  if (!input(pin_a0)) ///si pin_a0 esta en low se esperan (x)mili segundos y se pone high pin_a1
   delay_ms (1);
   output_high(pin_a1); ///9 ms
         while(true) ///se lee el pin_a0 hasta que vuelve a estar low y todo comienza de vuelta desde el otro for()!
         {
         if (!input(pin_a0)) ///capas que este while esta al pedo... no se..
         break;
         }
   output_low(pin_a1);
  } 
  //80%
  for ( i=0 ; i<17 ; i++ ) //en cada bucle for pasan siempre 10 ms
  { 
  if (!input(pin_a0)) ///si pin_a0 esta en low se esperan (x)mili segundos y se pone high pin_a1
   delay_ms (2);
   output_high(pin_a1); ///8 ms
         while(true) ///se lee el pin_a0 hasta que vuelve a estar low y todo comienza de vuelta desde el otro for()!
         {
         if (!input(pin_a0)) ///capas que este while esta al pedo... no se..
         break;
         }
   output_low(pin_a1);
  }
  //70%
    for ( i=0 ; i<17 ; i++ ) //en cada bucle for pasan siempre 10 ms
  { 
  if (!input(pin_a0)) ///si pin_a0 esta en low se esperan (x)mili segundos y se pone high pin_a1
   delay_ms (3);
   output_high(pin_a1); ///7 ms
         while(true) ///se lee el pin_a0 hasta que vuelve a estar low y todo comienza de vuelta desde el otro for()!
         {
         if (!input(pin_a0)) ///capas que este while esta al pedo... no se..
         break;
         }
   output_low(pin_a1);
  }
  //60%
    for ( i=0 ; i<17 ; i++ ) //en cada bucle for pasan siempre 10 ms
  { 
  if (!input(pin_a0)) ///si pin_a0 esta en low se esperan (x)mili segundos y se pone high pin_a1
   delay_ms (4);
   output_high(pin_a1); ///6ms
         while(true) ///se lee el pin_a0 hasta que vuelve a estar low y todo comienza de vuelta desde el otro for()!
         {
         if (!input(pin_a0)) ///capas que este while esta al pedo... no se..
         break;
         }
   output_low(pin_a1);
  }
  //50%
    for ( i=0 ; i<17 ; i++ ) //en cada bucle for pasan siempre 10 ms
  { 
  if (!input(pin_a0)) ///si pin_a0 esta en low se esperan (x)mili segundos y se pone high pin_a1
   delay_ms (5);
   output_high(pin_a1); ///5 ms
         while(true) ///se lee el pin_a0 hasta que vuelve a estar low y todo comienza de vuelta desde el otro for()!
         {
         if (!input(pin_a0)) ///capas que este while esta al pedo... no se..
         break;
         }
   output_low(pin_a1);
  }
  //40%
    for ( i=0 ; i<17 ; i++ ) //en cada bucle for pasan siempre 10 ms
  { 
  if (!input(pin_a0)) ///si pin_a0 esta en low se esperan (x)mili segundos y se pone high pin_a1
   delay_ms (6);
   output_high(pin_a1); ///4ms
         while(true) ///se lee el pin_a0 hasta que vuelve a estar low y todo comienza de vuelta desde el otro for()!
         {
         if (!input(pin_a0)) ///capas que este while esta al pedo... no se..
         break;
         }
   output_low(pin_a1);
  }
  //30%
    for ( i=0 ; i<17 ; i++ ) //en cada bucle for pasan siempre 10 ms
  { 
  if (!input(pin_a0)) ///si pin_a0 esta en low se esperan (x)mili segundos y se pone high pin_a1
   delay_ms (7);
   output_high(pin_a1); ///3 ms
         while(true) ///se lee el pin_a0 hasta que vuelve a estar low y todo comienza de vuelta desde el otro for()!
         {
         if (!input(pin_a0)) ///capas que este while esta al pedo... no se..
         break;
         }
   output_low(pin_a1);
  }
  //20%
    for ( i=0 ; i<17 ; i++ ) //en cada bucle for pasan siempre 10 ms
  { 
  if (!input(pin_a0)) ///si pin_a0 esta en low se esperan (x)mili segundos y se pone high pin_a1
   delay_ms (8);
   output_high(pin_a1); ///2ms
         while(true) ///se lee el pin_a0 hasta que vuelve a estar low y todo comienza de vuelta desde el otro for()!
         {
         if (!input(pin_a0)) ///capas que este while esta al pedo... no se..
         break;
         }
   output_low(pin_a1);
  }
  //10%
    for ( i=0 ; i<17 ; i++ ) //en cada bucle for pasan siempre 10 ms
  { 
  if (!input(pin_a0)) ///si pin_a0 esta en low se esperan (x)mili segundos y se pone high pin_a1
   delay_ms (9);
   output_high(pin_a1); ///1ms
         while(true) ///se lee el pin_a0 hasta que vuelve a estar low y todo comienza de vuelta desde el otro for()!
         {
         if (!input(pin_a0)) ///capas que este while esta al pedo... no se..
         break;
         }
   output_low(pin_a1);
  }
  //0%
   output_low(pin_a1); ///off
   }
   }
}

---------

ojala puedan ayudarme !
gracias...
 
Última edición por un moderador:
hola nf mv, no lo tomes a mal pero veo en tu codigo demaiado enredo para un simple dimersito.

te aconsejo que utilices la interrupcion por externa por PIN RB0, tu bus de datos puede pasar al puerto A

0000 -0%
0001 -10%
0010 -20%
0011 -30%
0100 -40%
0101 -50%
0110 -60%
0111 -70%
1000 -80%
1001 -90%
1010 -100%

viste con 4 bits puedes controlar perfectamente tu dimer
 
Última edición:
Atrás
Arriba