Control de temperatura de una estufa eléctrica con PICAXE



Se plantea el siguiente proyecto:

Controlar la temperatura de una estufa eléctrica con una termocopla tipo K, donde uno pueda “setear la temperatura” por medio de un potenciómetro y un relé cambie sus velocidades de conmutación para calentar o hacer que se enfríe la plancha metálica.

Entendiendo el problema:
  • La plancha de metal estará fría desde su conexión.
  • Con un potenciómetro se indicará la temperatura deseada
  • Al momento de conectarla el sistema empezara a hacer que el relé interrumpa con tiempos de intervalo para calentar la plancha de metal.
  • Cada vez que se esté acercando a la temperatura deseada el relé debe interrumpir más rápido y cuando llegue a dicha temperatura detendrá su conmutación.
  • El PICAXE debe medir con ADC las muestras de la termocopla y asi controlar las temporizaciones, yo hice esto conectando la termocopla a mi multímetro midiendo temperatura y comparándola con la lectura de PICAXE.


Debes ver es el comportamiento de una termocopla tipo K.

Así que haremos los siguientes circuitos, siento en este caso el circuito de muestreo el más importante:

Control por relé


Circuito digital para PICAXE


Circuito de muestreo de termocopla



Ahora debemos usar un tema que ya habíamos visto en PICAXE con interrupciones, solo que en vez de hacer interrupción por cambio de pin, haremos interrupción por timer.

Con este simple código podemos calcular los tiempos en ticks para la ejecución del timer según cada tiempo y variación de la temperatura, solo es cuestión de simularlo y ver los resultados en :


Symbol PERIODO_TIEMPO = 50000   'número de microsegundos entre interrupciones
Symbol FRECUENCIA = 8 'frecuencia de operacion del picaxe
Symbol TIEMPO_TICK = 256 / FRECUENCIA
Symbol TICKS_PRECARGADOS = PERIODO_TIEMPO / TIEMPO_TICK
Symbol VALOR_PRECARGADO = 0 - TICKS_PRECARGADOS
Symbol PRECARGA = VALOR_PRECARGADO & $FFFF
‘Resultados:
'1s = 20728
'95ms = 35849
'90ms = 37411
'85ms = 38974
'80ms = 40536
'75ms = 42099
'70ms = 43661
'65ms = 45224
'60ms = 46786
'55ms = 48349
'50ms = 49911
'45ms = 51474
'40ms = 53036
'35ms = 54599
'30ms = 56161
'25ms = 57724
'20ms = 59286
'15ms = 60849
'10ms = 62411
'5ms = 63974

Teniendo dos lectura analogas, la del potenciometro y la de la salida del circuito de instrumentación. Y con estos cálculos de tiempo los agregamos a nuestro programa final:

output c.4,c.5,b.6 'salida a relé
b1 = 0
b10 = 0
w7 = 20728

                SetIntFlags $80, $80
                timer = $FFFF
                SetTimer w7
               
ae:
                readadc c.3,b0 'lectura de valor analogico del potenciometro
                readadc c.1,b2 'lectura de valor analogico de amplificador de instrumentacion de la termocopla
                'sertxd(#b11,"- ",#b2,13,10)
                'pause 100
                if b2 < 10 then
                               pwmout c.5,99,80 '24° temperatura ambiente
                endif
                if b2 > 10 and b2 < 21 then
                               pwmout c.5,99,120 '70° temperatura
                endif
                if b2 > 20 and b2 < 30 then
                               pwmout c.5,99,145 '90° temperatura
                endif
                if b2 > 29 and b2 < 60 then
                               pwmout c.5,99,160 '140° temperatura
                endif
                if b2 > 59 and b2 < 71 then
                               pwmout c.5,99,220 '200° temperatura
                endif
                if b2 > 70 and b2 < 96 then
                               pwmout c.5,99,300 '250° temperatura
                endif
                if b2 > 95 then
                               pwmout c.5,99,350 '300° temperatura
                endif
goto ae


interrupt:
                b11 = b0 - b2
                if b2 > b0 or b11 < 15 then
                               b10 = 1
                               b5 = 0
                               high b.6
                               low b.5
                endif
                if b0 > b2 and b11 > 14 then
                               b10 = 0
                               b5 = b0 - b2
                               high b.5
                               low b.6
                endif
               
                if b10 = 0 then
                               toggle c.4, b.0
                endif
                if b10 = 1 then
                               low c.4
                endif

                if b5 > 9 and b5 < 20 then
                               b10 = 0
                               w7 = 63974 '5ms interrupcion
                endif
                if b5 > 20 and b5 < 30 then
                               b10 = 0
                               w7 = 59286 '10ms interrupcion
                endif
                if b5 > 30 and b5 < 50 then
                               b10 = 0
                               w7 = 53036 '20ms interrupcion
                endif
                if b5 > 50 and b5 < 70 then
                               b10 = 0
                               w7 = 49911 '30ms interrupcion
                endif
                if b5 > 70 and b5 < 90 then
                               b10 = 0
                               w7 = 40536 '40ms interrupcion
                endif
                if b5 > 91 then
                               b10 = 0
                               w7 = 20728 '50ms interrupcion
                endif

                SetIntFlags $80, $80
                timer = $FFFF
                SetTimer w7 '50ms interrupcion
return

Aspectos a tomar en cuenta al armar un banco de capacitores



Aunque en la web encontramos muchos documentos de normas y aspectos técnicos de bancos de capacitores, nunca nos explican el armado, en este breve post intentaré resaltar algunos de los detalles más básicos que debemos de pensar a la hora de poner en marcha un banco de capacitores simple.



  • Piensa en una caja espaciosa, que te de chance de trabajar libremente y donde puedas agregar cada componente eléctrico de potencia correctamente.
  • Debes de pensar en la ventilación del banco, generalmente se le ponen dos rejillas de ventilación con filtros, para evitar que entre polvo al banco. A una de esas rejillas le colocas un ventilador que se alimenta con 110V o 220V para expulsar el aire.
  • Lo más común es utilizar un banco de capacitores en delta, donde ya en un solo case, se encuentra el arreglo interno de los capacitores, así solo conectamos las tres terminales a cada fase, es importante que este arreglo cuente con resistencias internas de descarga.
  • Para arranque del banco de capacitores un simple botón de giro y un contactor pueden servir. Es importante colocar indicadores luminosos así sabrás si tu banco está en línea o no.
  • Debemos pensar en dos tipos de protecciones, de fase y trifásica, las protecciones de fase serán fusibles que protegerán cada fase del banco de capacitores y la trifásica protegerá el arreglo completo, es importante poner estas protecciones según nuestros cálculos de corrientes de fases y corriente de capacitor.
  • Tendrás dos tipos de calibre de conductor a utilizar, calibres 12 o 14 para toda tu circuitería de control (la que activa y desactiva contactores, indicadores luminosos, ventiladores, etc.) y la que soportará la carga que induce el capacitor en la red, generalmente es un calibre grande como un 8 o 6, depende de tu cálculo y del capacitor que se use.
  • Evita hacer empalmes, procura que tu montaje sea lo más íntegro posible. Ordena tu cableado con cinchos plásticos.
  • Aterriza el case a tierra y todos los componentes que así lo pidan.
  • Cuida las llaves de la caja ya que son plásticas en su mayoría, es bueno tener una en uso y otra guardada por si se quiebra esa.

Chip calendario (DS1307) + PICAXE



Este post lo dedico a la programación y configuración de la hora para el Circuito Integrado DS1307.

DS1307

Es un IC de reloj en tiempo real, el que funciona con una pequeña circuitería y una batería CS2032 de 3V. Funciona con comunicación I2C, provee de: segundos, minutos, horas, día, fecha, mes y año. Está programado automáticamente para meses inferiores a 31 días y años bisiestos. El reloj puede funcionar en formado de 12 o 24 horas con indicador de AM y PM.

La circuitería es:



Los pines son:



  • X1 y X2: Pines de conexión para un cristal estándar de 32.768kHz. El circuito oscilador interno está diseñado para trabajar a una carga capacitivo de 12.5pF. X1 es la entrada al oscilador y puede ser conectado opcionalmente con un oscilador externo, la salida del oscilador interno es X2.
  • VBAT: fuente de alimentación de respaldo, puede ser una batería de litio de 3V.
  • Ground: Tierra
  • SDA (Serial Data Input/Output): SDA  es la entrada de información por el protocolo I2c, este pin es colector abierto así que debe colocarse una Resistencia pull-up a VCC.
  • SCL (Serial Clock Input): Es la entrada del protocolo I2C del pulso de reloj para sincronizar los datos.
  • SQW/OUT (Square Wave/Output Driver): Cuando está en 1 lógico, la SQW/OUT saca una de las ondas cuadradas (1Hz, 4kHz, 8kHz, 32kHz). Este pin es colector abierto así que debe colocarse una Resistencia pull-up a VCC
  • VCC: 5V


Código para ver y programar la hora con PICAXE:

Los pines de comunicación al DS1307 con el PICAXE, son los pines dedicados para I2C, SDA y SCL.

 symbol segundos = b0
symbol minutos = b1
symbol horas = b2
symbol dia = b3
symbol fecha = b4
symbol mes = b5
symbol ano = b6
symbol control = b7

i2cslave %11010000, i2cslow, i2cbyte 'configura para la dirección del chip calendario
output b.2
input c.0,b.0,b.1,b.2 'pulsadores para configurar segundos, minutos, horas y activar el modo de moficación de hora

main:
    if pinc.0 = 0 then 'switch para grabar la hora
        pause 300
        readi2c 0,(segundos,minutos,horas,dia,fecha,mes,ano) 'lee la hora del reloj
        if pinc.0 = 1 then
        do 'ciclo para escoger los segundos, minutos y la hora
            if pinb.0 = 0 then
                pause 200
                segundos = segundos + $01
                if segundos > $09 and segundos < $11 then
                    segundos = $10
                endif
                if segundos > $19 and segundos < $21 then
                    segundos = $20
                endif
                if segundos > $29 and segundos < $31 then
                    segundos = $30
                endif
                if segundos > $39 and segundos < $41 then
                    segundos = $40
                endif
                if segundos > $49 and segundos < $51 then
                    segundos = $50
                endif
                if segundos > $59 then
                    segundos = $00
                endif
            endif
            if pinb.1 = 0 then
                pause 200
                minutos = minutos + $01
                if minutos > $09 and minutos < $11 then
                    minutos = $10
                endif
                if minutos > $19 and minutos < $21 then
                    minutos = $20
                endif
                if minutos > $29 and minutos < $31 then
                    minutos = $30
                endif
                if minutos > $39 and minutos < $41 then
                    minutos = $40
                endif
                if minutos > $49 and minutos < $51 then
                    minutos = $50
                endif
                if minutos > $59 then
                    minutos = $00
                endif
            endif
            if pinb.2 = 0 then
                pause 200
                horas = horas + $01
                if horas > $09 and horas < $11 then
                    horas = $10
                endif
                if horas > $19 and horas < $21 then
                    horas = $20
                endif
                if horas > $23 then
                    horas = $00
                endif
            endif
            sertxd(#horas,":",#minutos,":",#segundos,13,10)
            if pinc.0 = 0 then
                pause 200
                writei2c 0,(segundos,minutos,horas,dia,fecha,mes,ano,control)'graba la hora en el chip calendario
                goto main
            endif
        loop
        endif
    endif
    readi2c 0,(segundos,minutos,horas,dia,fecha,mes,ano) 'lee la hora del reloj
    sertxd(#horas,":",#minutos,":",#segundos,13,10) 'despliega la hora en la terminal
goto main