Hola.
Hace rato que quería montarme un control de temperatura para mi cautin porque cuando dejaba de soldar un rato siempre quedaba al máximo y eso hace que las puntas se ensucien mucho y quedan negras y casi no duran

... vi por ahí algunos diseños con unos diodos y demás, pero quise hacerlo con un PIC y con control de fase.
El sistema que diseñe tiene como base al PIC12F629, el esquemático:

La board:

puse pulsadores grandes ... porque soy torpe con los dedos

La tarjeta ya terminada:

El funcionamiento es el siguiente:
El sistema tiene dos pulsadores con los que se puede seleccionar entre tres opciones de potencia:
- Pulsador CHANGE: Cada vez que se presione va a cambiar el nivel de potencia entre máximo y medio-bajo.
- Pulsador RESET: Cada vez que se presione el nivel de potencia pasa al mínimo.
y tiene un LED indicador:
- Potencia Máxima: LED encendido continuamente.
- Potencia Media: LED titilante.
- Potencia Mínima: LED apagado.
Para el cruce por cero conecté directamente una resistencia de 1.5M al PIC ... y aunque temeroso
![helado :2]](http://www.todopic.com.ar/foros/Smileys/default/cold.gif)
al medir me pude dar cuenta que iba muy bien:

El código del PIC:
#include<12F629.h>
#fuses INTRC_IO,MCLR,NOBROWNOUT,NOWDT,PROTECT
#use delay(clock=4M)
#zero_ram
#define subida 1
#define bajada 0
#define on output_low
#define off output_high
#define toggle output_toggle
#define GATE pin_a0
#define CHANGE pin_a4
#define LED pin_a1
#define ApagarLED on(LED)
#define EncenderLED off(LED)
struct BytesFase
{
int SetPoint;
short Flanco;
int IntsTimer;
short Estado;
short TLed;
} CtrlFase;
#int_EXT
void ZeroCross_isr(void)
{
if(CtrlFase.Flanco==subida)
{
enable_interrupts(INT_TIMER0);
ext_int_edge(H_TO_L);
CtrlFase.Flanco = bajada;
if(CtrlFase.TLed)
toggle(LED);
}
else
{
enable_interrupts(INT_TIMER0);
ext_int_edge(L_TO_H);
CtrlFase.Flanco = subida;
}
}
#int_TIMER0
void TimeGate_isr(void)
{
CtrlFase.IntsTimer++;
if(CtrlFase.IntsTimer>CtrlFase.SetPoint)
{
on(GATE);
delay_us(150);
off(GATE);
CtrlFase.IntsTimer=0;
disable_interrupts(INT_TIMER0);
}
set_timer0(0);
}
void main(void)
{
setup_comparator(NC_NC_NC_NC);
setup_timer_0(RTCC_INTERNAL | RTCC_8_BIT | RTCC_DIV_1);
ext_int_edge(L_TO_H);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
CtrlFase.Flanco=subida;
CtrlFase.SetPoint=20;
ApagarLED;
while(true)
{
if(input_state(CHANGE))
{
delay_ms(50);
if(input_state(CHANGE))
{
CtrlFase.Estado = !CtrlFase.Estado;
switch(CtrlFase.Estado)
{
case 0:
CtrlFase.SetPoint = 14;
CtrlFase.TLed = 1;
break;
case 1:
CtrlFase.SetPoint = 4;
CtrlFase.TLed = 0;
EncenderLED;
break;
}
}
while(input_state(CHANGE));
}
}
}
Aquí pueden descargar el pdf para imprimir.
Saludos