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