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



## dinoelectro (Oct 14, 2011)

Este proyecto fue desarrollado en el mes de junio del 2007, recuerdo que estaba muy necesitado de dinero en esos días, y un amigo y cliente me encargo realizar este trabajo, no tenía ni la más cojonuda idea de cómo realizarlo, el reto era terminarlo en una semana, lo conseguí en tres días… les cuento esto porque desde ese día aprendí que los malos momentos te obligan a ser mejor.

Este trabajo se utilizó para controlar la iluminación de una estancia mediante un computador, en función a la luz que incide en un luxómetro que se comunicaba con el PC vía RS232. Lo que más adelante me sirvió como parte de la tesis para graduarme como ingeniero… agradezco pues, a los malos tiempos que son los que me han dejado la enseñanza más valiosa…


----------



## MVB (Oct 14, 2011)

Disculpa la pregunta.
Se puede controlar la intensidad de cada una de las 16 lamparas independientemente o la intensidad des la msima para las 16?

saludos


----------



## cristian_elect (Oct 15, 2011)

Hace unos años me hice uno de 8 canales independientes y funciona con el sonido de un micrófono con  un micro atmega8.
Lo que más trabajo me costo hacer son la secuencias según el sonido.



Ya no seguí con ese proyecto por que aparecieron los leds en luces de discotecas.


----------



## Fogonazo (Oct 15, 2011)

MVB dijo:


> Disculpa la pregunta.
> Se puede controlar la intensidad de cada una de las 16 lamparas independientemente o la intensidad des la msima para las 16?
> 
> saludos



El Dimmer es de 4 canales, se debe poder regular la intensidad en cada canal (Supongo), y a ese canal se le puede conectar 4 lámparas, 1 o 10.

En el primer esquema del archivo PDF los opto-aisladores se encuentran conectados al revés.


----------



## MVB (Oct 15, 2011)

```
tmr0 
bcf intcon,t0if  ; limpio la bandera 
movlw b'00001111'; disparo los triacs 
movwf porta
```

Por ese codigo hago la pregunta. No veo que en ninguna parte se manejen los canales por separado.


----------



## dinoelectro (Oct 15, 2011)

MVD no se puede regular el brillo de las lamparas individualmente,... seria interesante mejorarlo,  
lo que si es facil ampiarlo hasta 8 o 16 canales disparando mas triacs por el puerto C y puerto D 

tmr0 
bcf intcon,t0if  ; limpio la bandera 
movlw b'11111111'; disparo los triacs del puertoc y del puertod
movwf portc
movwf portd

si puedes mejorarlo o tienes una sugerencia me comunicas por favor... saludos cordiales



Fogonazo dijo:


> El Dimmer es de 4 canales, se debe poder regular la intensidad en cada canal (Supongo), y a ese canal se le puede conectar 4 lámparas, 1 o 10.
> 
> En el primer esquema del archivo PDF los opto-aisladores se encuentran conectados al revés.



Hola fogonazo a que te refieres con eso de que estan al reves??, ese PCB lo construi y funciona correctamente.

las patillas 3 y 5 del MOC3021 no son necesarias asi que debes romperlas para que puedas soldarlos en la tarjeta (si usas los PCBs que he subido, claro, jeje) saludos


----------



## MVB (Oct 15, 2011)

Hola
A lo que se refiere fogonazo es que los MOC3021 de la imagen que adjunto asten conectados al revés, es decir, la parte izquierda debe ir a la derecha y viceversa.

En cuanto a lo de los canales, creo que es mucho mas útil poder controlar las intensidades por separado, aunque por supuesto la programación de este es mucho mas complicada.
La sugerencia es esa, si aun estas trabajando en el proyecto has que los canales se puedan controlar individualmente, usando los timers en una forma correcta se puede lograr.

Saludos.


----------



## dinoelectro (Oct 16, 2011)

Este dimer como lo dije antes sirvió para controlar el nivel de iluminación de un cuarto.. en funcion de la luz que incide en un luxometro. Fue útil para ese propósito, no se vio la necesidad de control independiente de cada lampara (se requería un nivel de iluminación uniforme en toda el área...) 

Saludos


----------



## Fogonazo (Oct 16, 2011)

El aporte es bueno y esta bien documentado, y además sirve, eventualmente, para luego ampliar y/o mejorar.


----------



## dinoelectro (Oct 22, 2011)

Bueno amigos del foro, comparto con ustedes la ultima actualizacion del firmware para este dimmer de cuatro canales con control ON-OFF independiente.

Este nuevo sistema ofrece mayor resolucion en el control de brillo de las lamparas y ademas el usuario podra decidir cuando encender o apagar cada canal.

todo el codigo esta echo en lenguaje C (PIC CCS)

saludos cordiales.


----------



## Yobtox (Dic 25, 2011)

te pasaste brod el proyecto esta buenisimo gracias por el aporte lo estoy inplementando el circuito luego te hago conoser mis avanses.....saludos


----------



## dinoelectro (Dic 25, 2011)

gracias yobox... si estas pensando implementar el circuito te recomiendo uses el codigo realizado en PIC CCS por que esta mas completo que el de ensamblador... desde ya te deseo exito!!!


----------



## 0002 (Dic 25, 2011)

Hermano, ¡un proyecto enorme! , creo que cuano haga mi casa tendré unos cuantos de estos por ahi y por alla .

Saludos.


----------



## george.manson.69 (Dic 26, 2011)

Excelente Proyecto! acabo de verlo! y espero que no dejes de hacer proyectos!! 
Yo intentare hacer lo mismo pero regular cada uno de las lamparas  salu2!!


----------



## dinoelectro (Dic 28, 2011)

george.manson.69 dijo:


> Excelente Proyecto! acabo de verlo! y espero que no dejes de hacer proyectos!!
> Yo intentare hacer lo mismo pero regular cada uno de las lamparas  salu2!!



esto de regular el brillo de cada lampara independientemente una de la otra es algo coimplicado de hacer... estoy dseguro de que se puede lograr.. pero yo no me puesto en la tarea, sinceramente ...

gracias george por tu interes!!!


----------



## edmundo2009 (Ene 16, 2012)

excelente aporte muy buena modificacion felicidades


----------



## dinoelectro (Ene 17, 2012)

gracias edmundo, si te interesa mas sobre iluminacion y domotica sigue este link

https://www.forosdeelectronica.com/f24/sistema-adquisicion-control-datos-18f2550-68547/

saludos cordiales!!!!


----------



## Yobtox (Ene 18, 2012)

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.


----------



## dinoelectro (Ene 18, 2012)

gracias Yobtox por mejorar este sistema... yo estaria muy interesado de chequear ese programa ¿puedes subirlo al foro o enviarme por correo??? 

este proyecto es uno de los mas complicados e interesantes que he realizado, y ahora con todas esas mejoras que has echo me quedado mas facinado aun.. gracias otra vez amigo


----------



## 0002 (Ene 18, 2012)

Que lo suba, que lo suba!! , interesante  los cambios que le realizaste yobtox, sobre todo lo de controlar los triacs con control angulo de fase de la señal de disparo 

Saludos.


----------



## 666Volts (Abr 7, 2012)

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


----------



## dinoelectro (Abr 7, 2012)

gracias 666volts!!! .. espero nos cuentes como va quedando tu dimmer.. saludos!!!


----------



## Yobtox (Abr 7, 2012)

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


----------



## josephvalle (Abr 9, 2012)

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


----------



## dinoelectro (Abr 9, 2012)

Yobtox dijo:


> 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 



josephvalle dijo:


> 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


----------



## josephvalle (Abr 9, 2012)

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


----------



## SERGIOD (Ago 8, 2012)

Yobtox dijo:


> 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  al pin 16 del microprocesador


----------



## Calopato (Oct 8, 2012)

Yobtox dijo:


> 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)...
> ...



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


----------



## miguelfgp (Oct 13, 2012)

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


----------



## dinoelectro (Oct 13, 2012)

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


----------



## miguelfgp (Oct 13, 2012)

gracias, si tome eso en cuenta aca son 60Hz lo que pasa es que yo lo programe con C18 y pues segun yo mi simulacion esta bien aqui la adjunto haber si alguien me puede decir si estoy bien o tengo algun error, por cierto gracias por el aporte
Ver el archivo adjunto New folder.rar


----------



## dinoelectro (Oct 14, 2012)

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!!


----------



## miguelfgp (Oct 14, 2012)

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?


----------



## dinoelectro (Oct 15, 2012)

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.


----------



## josemaX (Oct 15, 2012)

Para 230V esa resistencia de 1-5M sería válida o es necesario mas valor? Gracias.


----------



## miguelfgp (Oct 15, 2012)

sale muchas gracias cambiare eso y vere que tal funciona


----------



## dinoelectro (Oct 15, 2012)

deberas conectar desde 5-10M y si la frecuencia es de 50Hz el cristal tendra que ser de 20MHz


----------



## nf mv (Oct 15, 2012)

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..)

---------

```
#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...


----------



## josemaX (Oct 16, 2012)

dinoelectro dijo:


> deberas conectar desde 5-10M y si la frecuencia es de 50Hz el cristal tendra que ser de 20MHz



Muchas gracias.


----------



## dinoelectro (Oct 16, 2012)

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


----------



## nf mv (Oct 16, 2012)

Ok gracias dino, voy a ver como lo arreglo, lo de los 8 bit es xq cada dimmer usa 4combinaciones 0% 30% 60% 100%,
Y tengo 255(xq la 00000000 no la uso) 255/4=dimmer que puedo comandar por el bus de 8bits.. Dps cuando este en la compu veo q hacer y te consulto talvez..
Gracias!!
Un saludo..


----------



## dinoelectro (Oct 16, 2012)

ahora entiendo, vas a controlar dos dimers independientes con un solo PIC... es un buen reto, exito en el proyecto companero


----------



## nf mv (Oct 16, 2012)

hola dino.. estuve intentando comprender tu programa para poder modificarlo a mis necesidades.
tengo varias dudas, aca te dejo tu codigo y mis dudas marcadas en cada parte que no entiendo:
-----
#include <16F877A.h>
#FUSES NOWDT, HS, NOPUT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT
#use delay(clock=16000000)
int1 flanco=1;
int dly=100;  _*----1-¿esto significa que dly comienza en 100, o sea puede comenzar en 255 o 254(luz off)?*_
#int_EXT
void  EXT_isr(void) 
{
	output_a(0b00000000);
	if (flanco==1)
	{
	ext_int_edge(h_to_l);
	set_timer0(255-dly);
	while(get_timer0()>0);     //espera hasta que timer0 se desborde
	flanco=0;
	output_a(0b00001111);
	}
	else 
	{
	set_timer0(255-dly);
	while(get_timer0()>0);     //espera hasta que timer0 se desborde
	ext_int_edge(l_to_h);
	flanco=1;
	output_a(0b00001111);
	}
}
void main()
{
	set_tris_a(0x00);   ----_*2-¿necesito configuar los port aca, o puedo hacerlo #byte trisA=(.nro.)?*_
	set_tris_b(0xff);
	enable_interrupts(global);
	enable_interrupts(int_ext | l_to_h);
	setup_timer_0(rtcc_internal | rtcc_div_128 | rtcc_8_bit);//prescalador 1:128 TMR0 desbordara cada 8ms   ----*3-Aca no entiendo nada!je ¿como sería para 50Hz?*

	while(true)
	{
	if(input(pin_b1)==0)
		{
		 dly++;
		 if (dly==255) dly=254; //no puede pasar de 255   ----_*4-¿xq no puede ser 255, que es realmente el 0% de luz?*_

		}
	if(input(pin_b2)==0)
		{
		 dly--;
		 if (dly==0) dly=1;     //no puede bajar a cero   ----_*5-¿idem anterior, dly=0 es luz al 100%, esta mal?*_

		}
	delay_ms(25);       		//demora antirebote   ----_*6-¿el valor 25 es por algo en especial o solo es un tiempo pequeño "x", no me queda claro el por que de este delay?*_
	}
}
------
voy a enloquecer, más dudas! 
7-¿La INT EXT solo interrumpe enla parte de "void  EXT_isr(void)"? o sea ¿lo que esta dentro de "Void main()" se ejecuta a la par?
8-¿para 50hz de linea podre usar lo 4mhz internos del pic o es indispensable que use 20mhz cristal externo?
9-¿flanco 1 y 0 son los semiciclos positivo y negativo verdad?
Bueno perdón por ser tan molesto, e ignorante, es que hace poco que empece con esto de los pic y con el lenguaje c, soy nuevo en todo y ademas me encuentro en un "mal tiempo" y necesito mejorar mis ingresos ya.. 
me senti muy identificado con tus frases "_(...)desde ese día aprendí que los malos momentos te obligan a ser mejor._" je..
si me contestas las 9 preguntas me salvas la vida!jajaj
un abrazo!
gracias...


----------



## dinoelectro (Oct 17, 2012)

voy a tratar de aclarar tus dudas nf mv. empezare desde el principio

1. Afirmativo, puede empezar en 255, luz OFF
2. no es necesario que configures el puerto A, pero te recomiendo que lo dejes tal como esta
3. lo que hago es configurar el timer para que se desbore cada 8ms, en caso de que la red sea de 50Hz el timer debera desbordarse cada 10ms para ello necesitaras un cristal de 20Mhz.
4. afirmativo, el valor 255 es lampara off. en un codigo mas actualizado que subi, si llega hasta 255
5. idem al anterior
6. si no hubiera ese delay el codigo se ejecutaria tan rapido que seria imposible controlarlo con los botones atenuar/iluminar. es como hacer una pausa para que las cosas no ocurran tan rapido...(quita ese delay y observa en simulacion lo que ocurre)
7.cada vez que el voltaje cruza por cero, el pic entra en interrrupcion es decir en "Void EXT_isr(void).. mientras tanto ejecuta lo que esta en main()
8.yo creo que si puedes utilizar el cristal interno de 4 mhz... pero tendrias que cambiar la configuracion del timer0. (habria que ver...)
9.flanco=1 es un bit que indica que el cruce por cero ocurre cuando el volataje alterno va en aumento, es decir cruza negativo a positivo
flanco0=0 es lo contrario cuando el voltaje pasa desde positivo a negativo

espero que te haya ayudado.. no dudes en preguntar, saludos!!


----------



## dinoelectro (Oct 18, 2012)

muchos me han preguntado si se puede tener mas de un dimmer en un solo PIC; la respuesta es si; yo personalmente he controlado hasta seis dimmers con un solo PIC.

esta ves voy aportar con este ejemplo en el cual controlo dos dimmers completamente individuales el uno del otro; con un pic 18F4550.

saludos! companeros


----------



## nf mv (Oct 19, 2012)

Hola amigo dino.. como va? eh estado con poco tiempo, pero aca la sigo luchando con adaptar tu dimer a 50hz de red.. jeje
esta es tu configuracion para el timer0:
setup_timer_0(rtcc_internal | rtcc_div_128 | rtcc_8_bit);//prescalador 1:128 TMR0 desbordara cada 8ms
Y esta es la que me quedaria a mi con osc interno de 4mhz:

setup_timer_0(rtcc_internal | rtcc_div_64 | rtcc_8_bit);// me da 16,3ms y necesito 10ms...

a ver si mi razonamiento esta bien.. el dly de tu programa va de 0 a 255, o sea 255=16,3ms(en mi caso).
que tal si no lo dejo llegar a 255 y lo corto en 157, .... (regla de tres):
                                                                                              16,3ms---255
                                                                                              10ms  --- x
y "x" es aproximadamente 157
bueno te pongo parte del codigo (el resto es igual al tuyo); estoy entre 2 opciones y no se cual seria correcta, si es q la hay!je
1-si el dly va de 255 a 0 seria asi:
---

```
setup_timer_0(rtcc_internal | rtcc_div_64 | rtcc_8_bit);// desborda cada 16,3ms
    while(true)
    {
    if(input(pin_b1)==0)
        {
         dly++;
         if (dly==255) dly=255; //no puede pasar de 255
        }
    if(input(pin_b2)==0)
        {
         dly--;
         if (dly==98) dly=98;//xq(255-157=98) hasta los dly=98 varío 10ms si bajo mas agrego                 tiempo!
        }
    delay_ms(25);               //demora antirebote
    }
```
----
1-si el dly va de 0 a 255 seria asi:
----

```
setup_timer_0(rtcc_internal | rtcc_div_64 | rtcc_8_bit);// desborda cada 16,3ms
    while(true)
    {
    if(input(pin_b1)==0)
        {
         dly++;
         if (dly==157) dly=157; //hasta dly=157 pasan 10ms de los 16,3ms q cuenta el timer en total, si llegara a 255
        }
    if(input(pin_b2)==0)
        {
         dly--;
         if (dly==0) dly=0;//
        }
    delay_ms(25);               //demora antirebote
    }
```
----
que opinas???
un gran saludo.!!


----------



## dinoelectro (Oct 19, 2012)

entiendo que el desborde del timer0 ocurre cada  16ms y tu lo estas recortando para que se desborde cada 10ms,  tiene mucha  logicalo que estas haciendo.. habria que ver la simulacion  

otra opcion es cargar un valor al timer0 para que no empiece desde cero utilizando la instrucion:

set_timer0(value); //esta instruccion deberia ir en la rutina de interrupcion
                         //asi el dly varia desde 0 a 255 y no pierdes resolucion
                         //suerte!!


----------



## dinoelectro (Oct 21, 2012)

hola nf mv.. observa este error en tu codigo:

if(input(pin_b2)==0)
        {
         dly--;
  if (dly==0) dly=0;// // esto esta mal, ya que la proxima vez que decremente ira a 255... lo correcto seria:           

 if (dly==255) dly=0;

o tambien

 if (dly==0) dly=1;


----------



## nf mv (Oct 21, 2012)

hola dino ya lo solucione.. ahora tengo otros problemas pero creo que son del circuito, ahora no estoy en mi pc, pero despues si queres subo el programa completo.. en la simulacion de proteus isis anda bien, pero al grabar el pic y armar el circuito no funciono...! cosas que pasan.. je

if(input(pin_b2)==0)
{
dly--;
if (dly==0)
dly++;
}
bueno, estamos en contacto, despues te cuento como me fue..
un saludo..!


----------



## Ojitos (Feb 2, 2013)

Hola dinoelectro, muchas gracias por tu aporte, me sirvio bastante

Te comento una duda, ojala puedas ayudarme.

Realize tu dimmer pero quiero controlarlo con rs232, entonces agregue la int_RDA y con gets(); recibo el comando, despues la variable dly la cargo con el dato y WUALA, el brillo cambia, entonces mi problema es que si continuo mandando datos, la 3, 4, 5 o a veces desde la segunda vez en pic se "traba", crees que sea el problema por la programacion, o que sea algo fisico en el circuito?

De antemano, gracias !!


----------



## panchoreyes (Sep 26, 2013)

hola estuve probando la idea de #nf-mv para utilizar este dimmer con 50 hz y 220 volt, pero la simulacion se me da un tanto inestable, hay alguien que haya probado la idea de dinoelectro pero con la frecuencia antes mencionada? si es asi agradeceria su ayuda.


----------



## dinoelectro (Sep 27, 2013)

Para una frecuencia de red de 50Hz el desborde debe ser cada 10ms, se recomienda utilizar un cristal de 20 mhz.  asi que deberas cambiar la configuracion del timer.  en realidad no recuerdo como es la configuracion, pero si programas en PIC CCS puedes utilizar el "Wizard" asi el compilador te generara el codigo de configuracion automaticamente.

saludos


----------



## panchoreyes (Oct 10, 2013)

disculpa de nuevo, cual es la formula que ocupaste para calcular el desborde cada 8ms, me la puedes explicar por favor? mi otra interrogante es al implementar el circuito donde conecto el neutro de la red? porque la fase va con la resistencia al pic, pero la red?
 de antemano gracias..


----------



## Limako (Oct 10, 2013)

como conecto de la red electrica al pic? tengo que saber cual de los dos cables es la fase, coger este, y ponerle la resistencia y de ahi al pic? o tambien tengo que coger el neutro y unirlo a los 0V de mi fuente de 5?


----------



## dinoelectro (Oct 10, 2013)

la una fase va conectado al PIN B0 (por medio una resistencia cuyo valor varia entre 1M a 6M) la otra fase a la tierra del PIC.


----------



## djpusse (Nov 11, 2013)

Hola gente, compre una placa DMX hecha de 9 canales para hacer un dimmer (la compre porque no se programar) lo que quiero hacer es fabricar la placa de drivers-triacs para la linea alta tension, tengo pensada hacerla tal cual posteo el amigo dinoelectro con los opto aisladores o opto acopladores como quieran llamarlo, el tema es el siguiente.

quiero ponerle un pote para cada canal entre la controladora DMX y el opto para poder usarla tambien sin DMX, ahora bien, puede funcionar haciendo la parte del pote como muestra en la figura 4 del datasheet del opto? (http://pdf.datasheetcatalog.com/datasheet/QT/MOC3021.pdf) el pote lo pondria en lo que en el datasheet marca una fuente para variar el voltaje, y a la vez conectar el opto a la placa DMX (la placa dmx tiene driver irfz44n para la salida - salida 12v) esto me puede traer algun problema como que rompa los irf de la controladora o que al darle con el dmx rompa el transistor 2n3904?

Saludos y gracias.


----------



## dinoelectro (Nov 21, 2013)

djpusse dijo:


> quiero ponerle un pote para cada canal entre la controladora DMX y el opto para poder usarla tambien sin DMX, ahora bien, puede funcionar haciendo la parte del pote como muestra en la figura 4 del datasheet del opto? (http://pdf.datasheetcatalog.com/datasheet/QT/MOC3021.pdf) el pote lo pondria en lo que en el datasheet marca una fuente para variar el voltaje, y a la vez conectar el opto a la placa DMX (la placa dmx tiene driver irfz44n para la salida - salida 12v) esto me puede traer algun problema como que rompa los irf de la controladora o que al darle con el dmx rompa el transistor 2n3904?
> 
> Saludos y gracias.



NO es tan sencillo compañero, tienes que construirte un receptor DMX a base de microcontrolador, la conexion directa entre el Potenciometro y los optoacopladores no te funcionara..

saludos!


----------



## djpusse (Dic 3, 2013)

Hola, eh conectado los opto moc 3020 a la placa dmx que compre y a un triac bt 136 todo bien pero no funciona como yo quiero, varia la intensidad y todo de la lampara el tema es que desde que comienza a encender la lampara titila cuando llega a 255 la consoa dmx deja de titilar y enciende bien al maximo, el problema esta en la placa dmx porque me prestaron un dimmer bheringer y hice la prueba de desconectarle la controladora dmx que trae original y conectarle la mia y hace exactamente lo mismo o sea que el circuito del opto y triac que yo hice esta bien. el dimmer bheringer tambien trabaja con los moc 3020 pero con otro triac mas potente el bta25-600b

por otro lado la placa dmx que compre tiene irfz44n como driver de salida, no se si ese sera el problema, tambien hice la prueba de conectarle un led en paralelo al led del opto y el led anda perfecto no titila para nada varia la intensidad a la perfeccion.

alguien me puede dar una mano?
Gracias


----------



## dinoelectro (Dic 4, 2013)

Repito: tienes que construirte un receptor DMX a base de microcontrolador, la conexion directa entre el controlador DMX y los optoacopladores no te funcionara..

mas informacion aqui:

https://www.forosdeelectronica.com/f24/aporte-vumetro-controlado-dmx512-108536/


----------



## djpusse (Dic 11, 2013)

dinoelectro es que lo que compre es un receptor DMX a base de ATMEGA8515 16PU1309, puede que me halla expresado mal. 

ya me canse de hacer pruebas y no me funcionan,  la placa dmx que compre tiene irfz44n como driver de salida, no se si ese sera el problema pero al conectarle un led en uno de sus canales de salida dimeriza a la perfeccion.

se solucionaria si en vez de usar un optoacoplador utilizo un transformador para aislar la placa dmx de la red electrica?


----------



## dinoelectro (Dic 12, 2013)

djpusse dijo:


> dinoelectro es que lo que compre es un receptor DMX a base de ATMEGA8515 16PU1309, puede que me halla expresado mal.
> 
> ya me canse de hacer pruebas y no me funcionan,  la placa dmx que compre tiene irfz44n como driver de salida, no se si ese sera el problema pero al conectarle un led en uno de sus canales de salida dimeriza a la perfeccion.
> 
> se solucionaria si en vez de usar un optoacoplador utilizo un transformador para aislar la placa dmx de la red electrica?



... no en realidad el problema no se solucionaria ya que dimerizar lamparas de corriente alterna es diferente que dimerizar LEDS que trabajan con corriente continua.(si deseas hacer funcionar a tu receptor DMX, te recomiendo comprar las cintas de LED RGB que funcionan con 12 voltios de corriente continua son potentes y la posibilidad de efectos que puedes realizar es muy amplia)
saludos!


----------



## djpusse (Dic 12, 2013)

No no, lo que quiero hacer es un dimmer para manejar lamparas alogenas de 1000w, el led lo puse para ver si funcionaba mi placa


----------



## dinoelectro (Dic 12, 2013)

djpusse dijo:


> No no, lo que quiero hacer es un dimmer para manejar lamparas alogenas de 1000w, el led lo puse para ver si funcionaba mi placa



Habria que ver si venden receptores DMX para cargas de corriente alterna, de no ser asi tendrias que construirlo a base de un microcontrolador, lo cual requiere que tengas conocimientos avanazados en programacion..


----------



## djpusse (Dic 12, 2013)

que otra forma tengo de activar un triac sin un optoacoplador y sin cargarme la receptora dmx?

alguien debe saber porque se me presento este problema, tendra algo que ver el optoacoplador que tiene detector de cruce por cero y se me este de sincronizando todo?


----------



## reyvilla (Mar 27, 2014)

Hola. Me he leído todo, muy buen trabajo a los aportes que han realizado por acá.
Yo estuve experimentando, aún lo hago con un dimmer controlado con PIC en serie que está en el foro.
Aún quedó pendiente por subir unos avances, pero he estado algo ocupado con otros proyectos.

Ahora estoy con un proyecto que me solicitaron y he avanzado bastante, se trata de un control de ambiente de 24 bombillos de 50W de halógeno con distintos arreglos, mínimo 2 y máximo 6.
El punto es que he logrado hacer dos dimmer independientes, vi que lo demostraron y que si es posible.
Yo lo realicé y vi que también es posible con un solo PIC, en mi caso utilicé el 12F675 que es mi favorito para hacer pruebas.

Ahora, en mi caso utilizo PICBasic Pro, el código lo basé en puras interrupciones, una externa y una interna con el TMR0.
La externa "INT" la utilizo como detector del cruce por cero al igual que el circuito propuesto acá.
Ahora, esa interrupción la utilizo para activar la interrupción por desbordamiento del TMR0, al mismo momento desactivo por 8ms aproximadamente la interrupción externa y empiezo a temporizar para llegar al punto de activación del TRIAC, o sea el que fue elegido previamente.
Una vez terminado los 8ms, desactivo la interrupción del TMR0 y activo de nuevo la interrupción externa.
Esto sería una breve explicación de como lo estoy realizando yo.

Mi circuito funciona de momento en simulación proteus.
Pretendo ponerlo en físico para el día de mañana y por la experiencia que tengo sé que un porcentaje bien alto que la mayoría de las simulaciones al montarlas en físico me funcionan muy similar a la simulación.
Según mi análisis del sistema que realicé pudiera tener un máximo de bombillos que se puedan dimerizar individualmente, tales que no perturben los 8ms.

Por otro lado, mi circuito no utiliza MOC, va directo al TRIAC a través de una resistencia, por lo cual eso me dio unas dudas, yo utilizo un pulso de activación en vez de un PWM.
Ya que no me funcionó en el proteus lo tendría que hacer en la practica con un PWM para ver que tal funciona.
El pulso que yo utilizo es de unos cuantos µs y lo voy moviendo a través de los 8 ms.
Lo que vi en la simulación con la anchura del pulso, fue que el TRIAC se activa apenas sale el pulso y me quedó bastante la duda, ya que según las características del TRIAC, una vez activado se desactiva solo, por lo cual no tendría sentido aplicarle un PWM directo por lo que el MOC debe influir con esto.

Por ahora les dejo una imagen de las señales y espero puedan ayudarme con las dudas y a su vez me gustaría seguir aportando al foro con mis avances.

Saludos


----------



## vrainom (Mar 27, 2014)

reyvilla dijo:


> Por otro lado mi circuito no utiliza MOC va directo al triac a través de una resistencia y por lo cual me eso me dio unas dudas. Yo utilizo un pulso de activación en ves de un pwm ya que no me funciono en el proteus tendría que hacer en la practica con un pwm a ver que tal funciona. El pulso que yo utilizo es de unos cuantos us y lo voy moviendo a través de los 8ms. Lo que vi en la simulación con la anchura del pulso fue que el triac se activa apenas sale el pulso y me quedo bastante la duda ya que según las características del triac una vez ativado se desactiva solo lo cual no tendría sentido aplicarle un pwm directo por lo que el moc debe influir con esto. Por ahora les dejo una imagen de las señales y espero puedan ayudarme con las dudas y a su vez me gustaría seguir portando al foro con mis avances...saludos



Saludos. Sería más fácil leerte si dividieras tu mensaje en párrafos 

Respecto a conectar el triac directamente al uc, te recomiendo que lo hagas a través de un transistor, porque dependiendo del triac que uses, y supongo que serán uno o más de alta potencia para alimentar 24 bombillos de 50w, cada triac necesita hasta 50ma en compuerta para activarse. Y efectivamente, sólo necesita un pulso, o si la carga es inductiva un tren de pulsos corto para activar.

Ahora, dependiendo del triac, también depende del cuadrante en el que va a operar mejor, generalmente es en el cuadrante III, en el que le tienes que aplicar a la compuerta un pulso negativo relativo a M2.


----------



## reyvilla (Mar 27, 2014)

Hola muchas gracias por los comentarios estare pendiente, el triac es el BTB08, son 5 en total los que voy a usar, con un maximo de 6 bombillos de 50W por triac con un consumo de 300W osea 2.72Amp. segun mis calculos corrijan si me equivoco. Lo del la corriente de compuerta o "Igt" efectiamente es de 50mA por lo cual agrdezco mucho tu comentario y utilizare un 2N222A superficial.

Ahora en el caso del transistor tendría que invertir la señal de salida?
Esto por que funcionaria siempre con 5V sobre la compuerta lo cual debo mantener desactivado enviando 5V al 2N2222A.

Y por ultimo en caso de querer hacerlo mas sencillo a nivel de programación con un moc con detección por cruce por cero y una PWM no pudiera hacer lo mismo y me ahorraría la detección de cruce por cero simplemente enviando un pulso indiferentemente de la posición de la onda funcionaria?


----------



## reyvilla (Abr 2, 2014)

Hola compañeros les dejo un vídeo de mis avances, logre dimmear 5 bombillos cada uno por separado y en grupo de 2 3 y los 5 al mismo tiempo y logrando subir la intensidad de uno mientras otro baja su intensidad al mismo tiempo. 

Pero a pesar de eso el sistema tiene un problema que aveces funciona bien y otras no la mayoría de las veces no logra hacer la secuencia bien en el vídeo se ve que se apaga de repente y al parecer es tanto en la simulación como en la practica.

Si tienen alguna idea de que puede estar ocasionando eso díganme sus sugerencias para mejorarlo...saludosss

PD: Lo curioso es que no pareciera tratarse de un reset del pic ya que a pesar de apagarse los bombillos al volver encenderse se ve que sigue en el mismo punto de la secuencia.


----------



## dinoelectro (Abr 3, 2014)

Buen trabajo reyvilla...... espero soluciones ese pequeño desperfecto en el firmware. Quisiera ayudarte pero en este momento mi trabajo me lo impide te deseo suerte y gracias por compartir


----------



## reyvilla (May 1, 2014)

Hola compañeros de nuevo por acá ya logre solucionar el problema  les dejo un vídeo, aun estoy haciendo un documento para dejarle mejor explicado como logre hacerlo igual espero sus comentarios...saludoss


----------



## Meta (May 1, 2014)

Hola:

Aquí hay otra menera de hacerlo.






Fuente:
http://txapuzas.blogspot.com.es/2010/06/regulador-de-potencia-por-triac-para.html

Saludo.


----------



## dinoelectro (May 2, 2014)

Magnifico trabajo reyvilla  espero ansioso el documento que estas preparando... 

talvez ahora puedas activar las luces en funcion de la señal de sensor de luz o con la musica... ¿que planes tienes ahora ya que has logrado dimerizar las 5 lamparas?

Una preguntas mas... ¿los pines del PIC los aislaste con optoacopladores o se conectan directamente al gate de los TRIAC?


----------



## reyvilla (May 2, 2014)

Hola bueno ya termine de hacer el documento es formato PDF, la verdad lo hice lo mas entendible y sencillo posible según yo , espero me den sus sugerencias al respecto les dejo aparte el código con una simulación del control de un triac no creo que tengan problemas para agregar los demás ya que el código es bien sencillo y cualquier duda yo les apoyo por acá.

Con respecto a tus dos preguntas amigo dinoelectro pretendo termina el proyecto pendiente que tenia con lo del control remoto y la dimmer en serie ya empezare con eso y apenas lo termine les coloco otro vídeo y las conexiones es directa a G del triac a travez de unas resistencias de 330ohm o 470ohm...esperos sus comentarios saludosss

PD: La red snubber no hace falta si utilizan el BTB16.


----------

