Hola a tod@s,
Estoy haciendo por gusto un pequeño proyecto, en el que se controla la temperatura de un horno industrial para hacer cositas de ceramica, que es una de mis pasiones aparte de la electronica.
Como entradas al PIC, tendria un sensor de temperatura (un termopar para 1200 grados) que lleva una tarjeta intermedia que me saca un voltaje de 0 a 5 voltios proporcional a la temperatura.
Tambien tengo que poner un teclado, y un display LCD para intriducir los diferentes parametros de temperatura vs tiempo, entre otros parametros.
Y como salidas, aunque a priori lo mas facil es montar una salida PWM que varie el duty cycle de las resistencias electricas del horno, hay que tener en cuenta que estas van alimentadas en alterna, por lo que a un regulador de potencia hecho con un TRIAC le he adaptado un potenciometro digital para que modificando el valor del trimmer obtenga una mayor o menor potencia de calefaccion. De esta forma si pongo el potenciometro digital a 0, practicamente alimento las resistencias a 0 voltios, y si lo pongo a tope, las alimento a la tension de la red electrica. El potenciometro digital esta comunicado al PIC por SPI.
Ademas, varios parametros de configuracion del horno (por ejemplo la calibracion del termopar, o las rampas de temperatura vs tiempo) quiero guardarlas en la EEPROM para que al quitar la alimentacion se queden guardadas y no tener que introducirlas por el teclado cada vez que quiero hacer una hornada nueva.
El control de la temperatura ha de ser muy preciso, por lo que he pensado en controlarlo mediante metodo PID. Por eso, X veces por segundo he de medir la temperatura, hacer una serie de calculos, y modificar el valor del potenciometro digital a traves del protocolo SPI.
Hasta aqui todo muy facil, porque se puede hacer mediante un programa sencillo que al arrancar lea los valores de la EEPROM, permita modificarlos mediante el teclado y el LCD si se desea, y que posteriormente al apretar un boton ponga a funcionar el ciclo temperatura-tiempo seleccionado hasta que se acabe. Es decir, que hacerlo de forma secuencial es algo muy facil.
Pero el problema es que muchas veces, a mitad de una hornada aparece la necesidad de modificar parametros. Por ejemplo, es facil que con determinado tipo de arcillas estes subiendo o bajando la temperatura muy rapidamente y que acabes con todas las piezas rotas por contracciones o expansiones bruscas. Por eso, quiero hacer el programa para que en tiempo real puedas modificar todos los parametros.
Es decir, que digamos que hay que realizar en paralelo varias tareas a la vez. Por un lado permitir el manejo del teclado y la pantalla LCD (para modificar datos o grabarlos en la EEPROM), y por otro lado hacer X veces por segundo el ciclo de control PID (lo ya comentado de leer la temperatura, hacer una serie de calculos, y finalmente modificar la salida del potenciometro digital).
Mis conocimientos de programacion son bastante justos, y a primera vista parece que lo mas facil es simplemente hacer el programa para manejar el teclado y el LCD (usaria la tecnica polling, osea leer el estado del puerto B en el que conectaria el teclado con las resistencias pull-up conectadas, en un bucle cerrado, y cuando detecte la pulsacion de una tecla, hacer lo que tenga que hacer, que puede ser mostrar otra cosa en el LCD, o grabar un dato modificado en la EEPROM, por ejemplo). Entonces ajustando la interrupcion por desbordamiento del TIMER0, hago que cada cierto tiempo el programa deje de hacer lo que estaba haciendo, y pase a ejecutar la funcion de control PID.
Mi pregunta es la siguiente: Si uso esta tecnica que comento (que es a primera vista lo que parece mas logico y facil de hacer), ¿no existe el problema de que por ejemplo al producirse la interrupcion y el programa pase a ejecutar la funcion de control PID, se quede a medias lo que estaba haciendo y haya problemas? Por ejemplo, imaginaros que estoy justo en un momento determinado mandandole al display informacion, y a mitad se produzca la interrupcion. En ese caso supongo que saldrian cosas raras por el display, o directamente no haria nada al haberse interrumpido la transmision. ¿No?
Una opcion seria anular las interrupciones mientras estoy mandando informacion al display, y una vez acabado de mandarla volver a activarlas. Pero entonces tendria el problema de que el tiempo que pasa entre cada vez que se efecuta la funcion de control PID ya no tiene porque ser constante, por lo que el calculo de la parte integral y derivativa del control PID es mucho mas dificil de hacer.
¿Como orientariais la programacion del PIC en este proyecto? ¿Recomendais alguna forma de actuar? ¿Quiza hay informacion sobre programacion de este tipo en algun libro o documento que se pueda conseguir facilmente?
Desde ya muchas gracias por todas las respuestas.