lunes, 19 de octubre de 2026

Control de ventilación en un CPD con PIC16F876: el proyecto completo

Control de ventilación en un CPD con PIC16F876: el proyecto completo


Este es un proyecto que hice en la Universidad en una de las asignaturas. La verdad que me pareció muy interesante, pues combinada múltiples partes. Planificación de funcionamiento, diseño, programación y simulación.
He decidido compartir todo mi desarrollo para poder echar un cable a electrónicos que lo necesiten, así que aquí os lo dejo.
En la primera parte comenzaremos con el enunciado del programa y posteriormente el desarrollo del proyecto.

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:

  1. Microcontrolador: se usará un PIC16F876 con cristal de 12 MHz.
  2. Alimentación: la tensión de alimentación del microcontrolador estará en el intervalo [4,5 V – 5,5 V].
  3. 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].
  4. 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.
  5. 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.
  6. 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.
  7. 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?

Obviamente solo me pidieron el desarrollo del proyecto "sobre papel", cómo se podría implementar,  cálculos e ideas de mejora. 
Yo le quise dar un extra, así que hice los esquemáticos en Proteus, y simulación del código del programa. Así como las comprobaciones con el osciloscopio virtual del simulador.

Así que dividí el proyecto en las siguientes fases:
  1. Resumen y especificaciones solicitadas, así como soluciones y componentes a utilizar. Incluyendo cálculos.
  2. El diagrama de funcionamiento del sistema para implementar en el PIC.
  3. Cálculos previos a la programación (Fosc, TMR1, TMR2, TPWM) y cálculos adicionales para el funcionamiento.
  4. Simulación en Proteus
  5. 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.

Tramo 1 Temperatura(20 a 25ºC) 





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.

 

 *Bueno como siempre me despido de esta entrada y espero que os haya servido de ayuda. En caso de algún error o ideas de mejora siempre son recibidas para podernos ayudar entre todos.

En caso de necesitar el código o el HEX, me podéis escribir sin problema.



No hay comentarios:

Publicar un comentario