Control de ventilación en un CPD con PIC16F876: el proyecto completo
El contexto: por qué un CPD necesita "aire a medida"
Un CPD (Centro de Proceso de Datos) es básicamente una sala llena de RACKs de servidores trabajando sin parar, y donde hay procesadores trabajando… hay calor. Mucho calor. Para mantenerlo a rayo se usan los CRAC (Computer Room Air Conditioner), unidades de aire acondicionado específicas para salas de servidores, que crean los clásicos pasillos fríos (por donde entra el aire que respiran los servidores) y pasillos calientes (por donde expulsan el aire calentado).
El proyecto parte de un problema real: los CRAC por sí solos no siempre consiguen llevar el aire frío hasta el final de los pasillos. La solución propuesta es añadir ventilación adicional dirigida mediante la incorporación de 2 CRAC, y aquí viene lo interesante: un ventilador bajo cada pasillo frío, instalado en el suelo técnico, que empuja el aire frío justo donde hace falta.
La lógica de control: la gráfica Temperatura / Velocidad
El ventilador no gira a una velocidad fija: su potencia se ajusta según la temperatura de los pasillos calientes adyacentes, de modo que su comportamiento se ajusta a la gráfica. Cada pasillo frío tiene dos pasillos calientes adyacentes, y cada pasillo caliente dispone de 2 sondas de temperatura. La temperatura a compensar se considera la media aritmética de las 4 medidas.
Esa media se traduce en velocidad de giro siguiendo una curva Temperatura/Velocidad (T/V):
El cerebro: un microcontrolador, no un PC
Para gobernar cada ventilador se propone un microcontrolador (un chip programable de toda la vida, sin sistema operativo ni nada parecido) capaz de capturar el valor de dichas temperaturas y generar una señal PWM que controle la velocidad de giro de su motor de corriente continua, siguiendo la curva T/V antes mencionada.
Requisitos funcionales del proyecto
Aquí va la lista oficial de requisitos, que es donde está la "chicha" técnica:
- Microcontrolador: se usará un PIC16F876 con cristal de 12 MHz.
- Alimentación: la tensión de alimentación del microcontrolador estará en el intervalo [4,5 V – 5,5 V].
- Sondas de temperatura: cada sonda entrega una tensión de salida en el intervalo [0 V, 4 V], directamente proporcional a la temperatura ambiente en [0 °C, 100 °C].
- Salida PWM: una vez calculada la media de las 4 temperaturas, se generará una señal PWM cuyo ciclo de trabajo (respecto al período de la señal) es igual al % de potencia obtenido en base a la curva T/V.
- Referencia del conversor AD: la tensión de referencia Vref = 4 V se consigue de la tensión de alimentación gracias a un circuito de adaptación. La tensión de referencia negativa será GND.
- Muestreo: las 4 señales analógicas de las sondas han de muestrearse cada 100 períodos PWM. Tanto la lectura de los canales analógicos como la cuenta del tiempo de muestreo se implementarán obligatoriamente mediante interrupciones.
- Generación PWM: la señal PWM la proporciona el PIC mediante uno de los módulos CCP en modo PWM. La frecuencia de la señal será, en kHz, el resultado de sumar 1 al último número de tu DNI (o documento equivalente), siempre que se garantice una resolución mínima de 10 bits en la señal PWM.
El "kit de parámetros" de un vistazo
| Parámetro | Valor |
|---|---|
| Microcontrolador | PIC16F876 |
| Cristal | 12 MHz |
| Alimentación | 4,5 – 5,5 V |
| Salida de sondas | 0 – 4 V (proporcional a 0 – 100 °C) |
| Vref (AD) | 4 V (Vref− = GND) |
| Muestreo | Cada 100 períodos PWM (obligatoriamente por interrupciones) |
| PWM | Módulo CCP en modo PWM, resolución mínima 10 bits |
| Frecuencia PWM | (última cifra del DNI + 1) kHz |
| Curva T/V | 10% hasta 20 °C · 30% a 40 °C · 60% a 60 °C · 100% a partir de 80 °C |
¿Por qué estos requisitos son tan interesantes?
Cada requisito esconde una decisión de diseño digna de análisis. El Vref de 4 V es una joya: coincide exactamente con el máximo de las sondas (0–4 V), de modo que el conversor A/D aprovecha todo su rango: 0 V → 0 °C y 4 V → 100 °C, sin desperdiciar ni un bit. El muestreo cada 100 períodos PWM obliga a "casar" dos tiempos de reloj distintos (y por eso exigen interrupciones, nada de bucles de espera improvisados). Y la condición de los 10 bits de resolución limita las frecuencias PWM elegibles: no vale cualquier kHz de tu DNI, solo los que el datasheet del PIC permita con esa resolución a 12 MHz.
___________________________________________________________________________________
¿Cómo lo haremos?
- Resumen y especificaciones solicitadas, así como soluciones y componentes a utilizar. Incluyendo cálculos.
- El diagrama de funcionamiento del sistema para implementar en el PIC.
- Cálculos previos a la programación (Fosc, TMR1, TMR2, TPWM) y cálculos adicionales para el funcionamiento.
- Simulación en Proteus
- Conclusiones finales.
1.
Resumen
de especificaciones solicitadas y consideraciones previas
a.
Resumen
de especificaciones y requisitos para tener en cuenta
·
Microcontrolador-> PIC16F876 con frecuencia
de cristal 12MHz
·
Tensión de alimentación del micro [4.5,5.5V]
·
Sonda de temperatura debe proporcionar una señal
de salida [0,4V], proporcional a [0ºC,100ºC].
·
Se calcula media de 4 sondas de temperatura, y
se generará salida PWM en función de la curva T/V para controlar los
ventiladores.
·
Frecuencia de PWM de 1KHz, según la condición
impuesta.
b.
¿Qué
elementos y componentes electrónicos usar?
Microcontrolador:
El microcontrolador a emplear será
el PIC16F876, este es un microcontrolador de 8 bits de la familia de Microchip
Technology, con un encapsulado de 28 pines.
Cuenta con arquitectura RISC y
memoria Flash reprogramable. Ofrece módulos periféricos integrados como ADC,
PWM, Timers (TMR0,TMR1 y TMR2), y comunicación serial (UART, SPI, I2C).
Es ampliamente utilizado en
aplicaciones embebidas de tamaño medio debido a su versatilidad, bajo costo y
facilidad de uso con compiladores. En este caso utilizaremos el software MPLAB
X IDE 5.35 y el compilador XC8 para la creación del algoritmo y simulación.
Además, como punto extra, he realizado un esquemático en PROTEUS 8.5 para realizar una simulación adicional más real que la que podemos hacer con MPLAB
Sensores de temperatura:
En el enunciado de la práctica se
indica que debemos utilizar 4 sensores de temperatura para la monitorización de
temperatura, sin dar más detalles.
Existen infinidad de sensores que
se podrían implementar, pero en mi caso en varios proyectos personales he
utilizado el clásico sensor de temperatura LM35, así que esa fue mi
elección.
Información de este sensor:
El sensor de temperatura LM35 es ligero,
fiable, compacto y sencillo de utilizar.
·
Encapsulado To92, con 3 pines Vcc(+5Vdc), GND y
Vout.
·
Vout, nos proporciona una salida de tensión
analógica, lineal con una pendiente de 10mV/ºC.
·
Rango de tensión de salida desde 0 Voltios(0ºC)
a 1.5 Voltios(150ºC).
·
Rango de medida de -55ºC a 150ºC.
·
Bajo consumo: inferior a 60uA
·
Alta precisión, ±0.5°C a 25°C.
Circuito de adaptación:
Como requisito, se pide que los
sensores de temperatura nos proporcionen una salida de 0-4 voltios. Como el
LM35 nos proporciona una tensión de salida de 0 a 1.5 voltios, es necesario
hacer un circuito de adaptación de niveles.
Mi idea, sería utilizar el
amplificador Operacional MCP6001 configurándolo como amplificador
no inversor.
Realizando unos sencillos
cálculos obtengo la ganancia que necesito y posteriormente los valores óptimos
de las resistencias para dicha configuración.
En las siguientes imágenes se
puede ver un ejemplo de la simulación en la adaptación de niveles.
La primera imagen, muestra como inyecto una tensión de
0Voltios obteniendo a la salida del Operacional 0 voltios.
En la segunda imagen, se establece la tensión máxima de
salida del sensor (1Voltio para 100ºC) y obtenemos una señal de salida de 4
voltios que conectaremos a nuestra entrada analógica del PIC.
Mi idea del Esquemático electrónico del sistema:
2. Diagrama de funcionamiento del sistema de refrigeración en el Micro
3. Cálculos realizados
previos a la programación
a. Tiempos y periodos a calcular
Frecuencia Oscilación = 12MHz
b.
Tiempos
y configuración de PWM.
Frecuencia PWM = 1KHz (Según la condición especificada)
Necesitamos comprobar que la frecuencia de la señal PWM
garantiza una resolución mínima de 10bits en la misma.
Tiempo para 10bits-> 1024 pasos-> 1024 x 0,333 us =
341,33 us
Se cumple 341,33us
< 1000us(1ms)
Es posible garantizar una resolución mínima de 10bits para
una señal PWM de 1KHz y un XT de 12MHz.
i.
Configuración
TMR2
El registro CCP1 para la generación de PWM, utiliza TMR2
para su temporización, por tanto, necesitaremos calcular el valor de PR2 en
función de los requisitos establecidos.
c.
Temporización
o muestreo
Según especificación, las 4 sondas de temperatura serán
muestreadas cada 100 periodos PWM, así que necesitaremos un modo de
temporización, para ello utilizaremos TMR1.
Como bien sabemos TMR1 en el PIC16F876 tiene una resolución de 16 bits, y visto que necesitamos una temporización elevada(100ms) necesitamos emplear un preescaler de 8.
d.
Cálculos
adicionales para el funcionamiento del algoritmo
Bien, en este momento, tenemos calculado y configurado: el
tiempo de muestreo o temporización, PWM&TMR2, configurado ADC.
Podríamos “tener preparado” la mayoría de los cálculos para hacer
la lectura de los voltios convertidos a bits que nos arrojan los sensores. Pero
necesitamos hacer una conversión de esos bits a una magnitud física que
entendamos.
Se nos ha facilitado la siguiente gráfica de conversión de
temperatura medida vs % de potencia de control para el ventilador.
Por tanto, para adaptar el modo de control a nuestro código
PRIMERO he optado por realizar 2 tablas de conversión.
Tabla 1:
Conversión grados-> Escala de resolución ADC(10bits)
|
Grados ºC |
Resolución(10bits) |
|
0 |
0 |
|
10 |
102 |
|
20 |
205 |
|
30 |
307 |
|
40 |
410 |
|
50 |
512 |
|
60 |
615 |
|
70 |
719 |
|
80 |
819 |
|
90 |
921 |
|
100 |
1024 |
Con esta tabla estoy haciendo una equivalencia del rango de
temperatura(0-100ºC) con el equivalente a la resolución de 10bits. Además,
sabemos que el sensor LM35 nos da una salida analógica de 10mv/ºC.
Tabla 2:
Registro una
comparación y equivalencia de grados-> % Pot. Ventilador
Así me iré aproximando a los valores que necesitaré para
escribir el DuttyC.
|
Grados ºC |
% |
Valor bits |
|
0 |
20 |
205 |
|
10 |
23 |
235 |
|
20 |
27 |
265 |
|
30 |
30 |
307 |
|
40 |
34 |
350 |
|
50 |
44 |
450 |
|
60 |
56 |
575 |
|
70 |
72 |
737 |
|
80 |
100 |
1023 |
|
>80 |
100 |
1023 |
Visto que tenemos una gráfica exponencial y debido a la
complejidad de insertar todos los puntos de la gráfica, opté por lo siguiente.
·
En primer lugar, pensé en dividir la temperatura
en tramos y aplicar una potencia fija al ventilador para todo ese rango. No
sería correcto, ya que, si la temperatura esta en el límite superior del tramo
y aplicamos una potencia al ventilador inferior a la necesitada, se produciría
un sobrecalentamiento y funcionamiento ineficiente. De igual manera, si
la temperatura está en el límite inferior y aplicamos una potencia de
ventilador máxima para ese rango, tendríamos un consumo en exceso de energía.
·
Solución aplicada.
o
He dividido la temperatura en segmentos,
apoyándome en la tabla 1.
§ 1º
Tramo Temperatura-> Para 0≤x≤20ºC
§ 2º
Tramo Temperatura-> Para 20≤x≤39ºC
§ 3º
Tramo Temperatura-> Para 39≤x≤53ºC
§ 4º
Tramo Temperatura-> Para 53≤x≤66ºC
§ 5º
Tramo Temperatura-> Para 66≤x≤72ºC
§ 6º
Tramo Temperatura-> Para 72≤x≤80ºC
§ 7º
Tramo Temperatura-> Para >80ºC
o
Para obtener la potencia del ventilador, he
realizado una función para cada intervalo mediante aproximación por segmentos
lineales. Apoyándome en la tabla 2 y los cálculos adicionales.
4. Funciones adicionales al programa
Terminado y comprobado el funcionamiento del programa, pensé
en posibles implementaciones adicionales.
o
Registro de Alarmas e indicación visual del
funcionamiento del sistema. Dependiendo de la temperatura leída, activaremos
unas determinadas salidas del puerto B.
o
Usamos la salida RB0 para una indicación visual
(led verde), del funcionamiento Óptimo del sistema.
o
La salida RB1, nos dará una salida óptima
adicional, mediante un LED Rojo. Nos Indicará un Warning de temperatura
elevada.
o
RB2, actuará también como salida y mediante un
Buzzer transistorizado, nos dará un aviso acústico, indicando TEMPERATURA MUY
ELEVADA.
o Comprobación de funcionamiento de las sondas parejas, realizando una comparación entre su medida. Si existe una disparidad elevada entre ellas, nos dará una alarma adicional de posible fallo de sonda, activando señal óptica+ acústica. (sin terminar de implementar)
5. Simulación en Proteus
Además de realizar las simulaciones del programa en MPLAB X, pensé usar Proteus para probar su funcionamiento, cargando el *.hex en el PIC virtual.
Nota: En estas simulaciones, apliqué una VREF de 1Voltio
en vez de 4V. Motivo… mi versión del software al intentar simular con los
operacionales me daba errores, así que opté por hacer la simulación con los
elementos justos.
Midiendo una temperatura de 20 grados en los 4 sensores.
Se puede ver la salida PWM en CCP1 capturada por el
analizador lógico, con un porcentaje de dutty en torno al 20%.
Medida de una temperatura de 75 grados en los 4 sensores.
Se puede ver la diferencia en la salida PWM en CCP1
respecto a la prueba en el primer rango de temperaturas.
Conclusiones:
Según las pruebas aplicadas en el funcionamiento, no he
encontrado fallos en el funcionamiento. Si he tenido fallos al simular en MPLAB X y Proteus en varias ocasiones. Entiendo que la gestión de las interrupciones
sobre la capa de Windows y el propio software no sean las condiciones más
favorables.
Quedaría pendiente implementar más funciones adicionales al
sistema para tener un sistema más completo, como la comprobación de sondas de
temperaturas defectuosas que mencioné anteriormente.
Incluso un sensor de corriente que leyera la corriente
consumida por el ventilador y si detectara un consumo bajo de corriente, el PIC
leyera una señal de entrada digital o analógica (del sensor) para registrar y
enviar un aviso de la avería de ventilador.
En caso de necesitar el código o el HEX, me podéis escribir sin problema.





















No hay comentarios:
Publicar un comentario