Go Down

Topic: PID de temperatura aun que no pueda variar la capacidad de refrigeracion? (Read 6973 times) previous topic - next topic

AlexLPD

Hola, buenas pues les cuento, que hace poco vendi un tablero para una camara de refrigeracion con un arduino UNO... Mas... Aqui!!!!

Bueno ps ahora el cliente quiere algo mejor...  :smiley-cool:  :smiley-cool:  :smiley-cool:  :smiley-cool:
Y gracias a la prueba anterior ya se que hay que tener muchos cuidados con algunas cosas;

-Filtro de ruido en fuente de poder
-Los cables de los switches van; vcc---NO---- GND.... para que no haya ruido en un digital read de 0.
-Snubbers para los contactores y varistores para eliminar chispa en contactos de contactores...



Y le vamos a agregar algunas cosillas; entre ellas un menu LCD con MENWIZ para que puedan modificar sus temperaturas directamente del arduino, sin tener que depender de un thermostato de terceros, alarmas por humedad por temperatura, estoy viendo que tanto puedo agregar la supervision de corriente del compresor, y un lector de voltaje...Lo que si... deshielo programables  y un modo nocturno, quizas un sensor de puerta abierta, o presencial para apagar la refrigeracion mientras haya personal dentro, etc.

La duda como el titulo lo indica, es que tanto me conviene ponerle un control PID a pesar de que no puedo variar la capacidad de la refrigeracion, ya que este compresor y sus ventiladores no son inverter ni DC... Ya he visto una libreria que hace muy sencillo implementar el PID.

He visto por ahi la idea del promedio movil y me ha gustado, pero me pregunto si es la mejor manera de leer el amaperaje del compresor... Por que digamos si nominalmente debemos andar entre 11 y 14Amps en el arranque es muy probable que alacance unos 23 -30 en un instante, aunque despues se normalice y como la idea es poner un paro por alta corriente , no quiero que se me este disparando en cada arranque.

Como ven? Que ideas tienen?
Que me recomiendan ?
Y que no me recomiendan?

Les dejo un snip del codigo que todavia esta en proceso... Revise mi post anterior y vaya que he aprendido mucho, muchas gracias a las personas de este foro!!!!

Code: [Select]
// Control camara Jose rodriguez incluye termostato alternador difusor.ino

/*
V.1 Este programa controla la camara de refrigeración mediante la sonda de
temperatura DS 1820. Ademas cuando el ciclo de refrigeracion se encuentra
apagado, el programa mantiene solo un ventilador del difusor encendido para
evitar un aereamiento excesivo de la carne.

V.2 (actual) En esta version se agrega un menu MENWIZ para controlar la temp
de arranque y paro, ademas de un relog para comenzar y parar el modo nocturno
en el cual la refrigeracion una vez detenida, detendra todos los motores del
difusor.

Diseñado y construido por;
Ing. Alejandro Santiago Sevilla.

*/

//--------------------------------LYBRARIES--------------------------------//
#include "Switch.h"
#include <DallasTemperature.h>       //Libreria Ds1820

#include <OneWire.h>
#include <dht.h>                     //DTH
#include <DallasTemperature.h>       //DS1820 LIB


//----------------------------GLOBAL VARIABLES-----------------------------//
byte evap_fan = 0; //var to on and off one of the 4 fans
byte state    = 0; //var to read  the state of the main switch
float  sensor_temp = 0; //var to read the sensor temperature
float  temp_start  = 0; //var to start the refrigeration
float  temp_stop   = 0; //var to stop refrigeration
int    humidity    = 0;

int state_motors [6][4] ={{HIGH, HIGH, HIGH,  HIGH  } , // All ouputs are fliped HIGH = OFF
                         {LOW,  HIGH, HIGH,  HIGH  } ,
                         {HIGH, LOW , HIGH,  HIGH  } ,
                         {HIGH, HIGH, LOW ,  HIGH  } ,
                         {HIGH, HIGH, HIGH,   LOW } ,
                         {LOW,  LOW,  LOW,   LOW } ,   // all evap fans on
                          };




//----------------------------HARDWARE PINS--------------------------------//
const byte solenoid   = 13;          //pin para el control de la solenoide
const byte compressor =12;           //Pin para control del compresor
const byte motors[4] = {8,9,10,11};  //Pines controlar motores del difusor 
const byte ref_led= 5 ;              //Pin para encender el foco de la refrigeracion
const byte def_led= 6 ;              //Pin para encender el foco deshielo
const byte comp_led= 7 ;             //Pin para encender el foco compressor
const byte SW2_pin = 3;              //pin para leer el switchh principal
const byte SW1_pin = 2;              //pin para leer el switchh principal


//------------------------------CONSTUCTORS -------------------------------//
Switch SW1_state = Switch(SW1_pin, INPUT, HIGH);  //Refrigeration On instance
Switch SW2_state = Switch(SW2_pin, INPUT, HIGH);  //Defrost On instance

dht DHT;                             //constructor del objeto DTH11
#define DHT11_PIN 5                   // Pin sensor DTH

#define ONE_WIRE_BUS 2                //Pin for one wire bus
OneWire oneWire(ONE_WIRE_BUS);        //define bus for com protocol
DallasTemperature sensors(&oneWire); //Pass our oneWire reference to DT
DeviceAddress insideThermometer;      //arrays to hold device address


//---------------------------GLOBAL VARIABLES -----------------------------//
void setup() {
Serial.begin(9600);
Serial.println("Starts program");
pinMode(solenoid,   OUTPUT);
pinMode(compressor, OUTPUT);
pinMode(ref_led, OUTPUT);
pinMode(def_led, OUTPUT);

for(byte a; a < 4; a++){
pinMode(motors[a], OUTPUT);

//  we dont inizialited the outputs because will changue the state and
//wil turn on and off quickly the relays.
}


}


//================================VOID LOOP================================//

void loop() {

sensors.requestTemperatures(); // request the temperature from sensor
printTemperature(insideThermometer); // print the data on variable


SW1_state.poll();          //This cheks refrigeration state 
SW2_state.poll();         // cheks defrost state 

if(SW1_state.on()) state = 1;
if(SW2_state.on()) state = 2;
if(! SW1_state.on() && ! SW2_state.on()) state = 3;
else state = 4;
// This will enter a subrutine to
//clean noise or restart program

switch (state) {
    case 1: refrigerationON();
            break;
   
    case 2: defrostON();
            break;
   
    case 3:  allOff();
      break;
   
    case 4: noiseOff();
    break;

    default: allOff();
     
}
}

//===============================SUB ROUTINES===============================//

void refrigerationON(){
/* This fuction will turn on the compressor, and all the fans of the evap,
once the set temperature has been reached, the sistem will leave just one
fan running, alternating the runing fan between cycles */

if (evap_fan = 4) evap_fan = 0; //reboot the cycle of fans
//keeping the cycle from 0 to 3
//(0,1,2,3) to use the fans array

if (sensor_temp >= temp_start) {
digitalWrite(compressor, LOW); //turn on compressor
digitalWrite(comp_led, LOW); //turn on comp led
digitalWrite(solenoid, LOW); //turn  on solenoid valve

for( byte b; b < 4 ; b++){ //turn all the 4 fans on
b = b-1;
digitalWrite(motors[b], state_motors[5][b]);
}
}

if (sensor_temp => temp_stop){
if( evap_fan > 4) evap_fan = 0; //this will keep the arrays from
//start and stop out of the 0 an 5
//keeping just one fun on.

digitalWrite(compressor, HIGH); //turn off compressor
digitalWrite(comp_led, HIGH); //turn off comp led
digitalWrite(solenoid, HIGH); //turn off solenoid valve

for( byte b; b <= 4 ; b++){ //turn just one of the fans on 
digitalWrite(motors[b], state_motors[evap_fan][b]);
}


}




}



void defrostON(){
/* this enable the defrost mode could be call by
manual mode or clock time */

Serial.println(F("Defrost Mode"));
digitalWrite(compressor,  HIGH );
digitalWrite(solenoid, HIGH );
digitalWrite(ref_led,  HIGH );
digitalWrite(comp_led, HIGH);
digitalWrite(def_led, LOW);

for (byte b; b < 4; b++){
digitalWrite(motors[b], LOW);
}
}




 

AlexLPD


surbyte

ALexLPD, crece tu trabajo por lo visto. Te felicito por los avances.
Quote
La duda como el titulo lo indica, es que tanto me conviene ponerle un control PID a pesar de que no puedo variar la capacidad de la refrigeracion, ya que este compresor y sus ventiladores no son inverter ni DC... Ya he visto una libreria que hace muy sencillo implementar el PID.
El tema del PID es fabuloso cuando se danta todas las condiciones para poder usarlo.
Primero establezcamos que tienes los elementos para hacerlo.
EL PID Proporcional Integral Diferencial es un sistema que tiene una planta (tu sistema de refrigeración) un sensor (supongo que alguno que mide temperatura) y basicamente tu estableces un setpoint y el PID intentará minimizar el error presente entre setpoint y valor del sensor en todo momento.
Para ello debe poder hacer AJUSTES sutiles tal vez a traves de un elemento de control. Cual es tu elemento de control? El compresor? Si fuera el compresor, entonces prediendo y apagando el compresor no vas a poder lograr un control PID.
Como no quiero divagar, esperaré a que respondas como controlas la temperatura (si es que estoy bien ubicado con tu variable de control).

AlexLPD

Saludos!

Si efectivamemte mi variable de control es la temperatura y efectivamenteel compresor es el encargado de bajarla, como mencionas de momento el compresor solo tiene dos estados o encendido o apagado, nada mas y solo funciona al 100 de su capacidad.

GO_zalo

en este caso podrías hacer un control tipo fuzzy, yo he obtenido muy buenos resultados con el en hornos en los que se requería un bajo coste (hornos de gas por ejemplo en que el coste entre una válvula todo o nada (que ya existía en la instalación) y una válvula de control es muy grande)

Lo ideal seria que pudieras hacer una prueba de escalón para determinar la función de transferencia del sistema, lo que te evitaría tiempo de prueba y error

surbyte

Puedes ampliar Go_zalo porque estaba por decirle que usara una válvula IP que regulara la presion del compresor pero me sales con Contro Fuzzy Logic y me mataste.

Tengo situaciones similares y no se como mejorar el control, puede ser de ayuda para mi tambien.
Por cierto, resolviste el tema nRF24?

AlexLPD

Vaya ... eso del fuzzy control esta interesantisimo!

Que es una valvula IP @surbyte?

Normalmente te diria que algo asi no se puede... pero ahora que lo pienso es un viejo truco cuando la unidad es mas grande de lo que se requiere... se pone un "puente" de tubo entre la salida de alta presion y la entrada de baja presion...

Es como un resistor que limita la potencia entregada a el curto frio... Poner el tubo, una valvula operada por un servo o algo asi... podria ser posible, incluso podría ser interesarte hacer el experimento.

Gracias!

Estoy viendo un pequeño video de fuzzy logic
Aqui !

AlexLPD

@Go_zalo.... me imagino que una prueba de transferecia a la que te refieres es a conocer el volumen de carne... y comenzar el sistema en una temperatura conocida para ver cuanto tiempo toma llegar a otra temperatura conocida...

Ahora bien... Mi set seria temperatura...

Mis reglas serian; muy frio - medio frio - tibio - medio tibio y caliente
Estas se grafican de 0 a 1 en como en el video, pero para darles una escala se usa algo como;

... muy frio digamos;  0°... caliente 8°

Y las salidas? 


Gracias.
-Alex.

GO_zalo

Las salidas serian encender el compresor y apagarlo al cabo de mas o menos tiempo en función de muy frio..caliente, después esperar un cierto tiempo (de ahí la necesidad de una función de transferencia y de una prueba de escalón) antes de volver a evaluar el estado de las entradas ya que si volvemos a evaluar antes de que la ultima corrección haya tenido efecto pasaremos de muy frío a muy caliente constantemente y si esperamos demasiado els sistema tardara mucho en llegar al SP

No ha habido manera de hacer funcionar los nRF24,

Una válvula IP es un converso de intensidad a presión, pero en este caso no veo viable desmontar el circuito de gas de refrigeración para añadir esta válvula y volver a rellenar el circuito con gas refrigerante.

Alex Lpd lo que comentas es hacer un bypass, se usa habitualmente en la industria en bombas compresores y eyectores, pero debe ser la ultima opción por que es lo enérgicamente menos rentable (aunque por ejemplo para un compresor pequeño o que no este en servicio continuamente sale mas rentable utilizar un bypass que invertir en un variador de frecuencia para el motor)

surbyte

Y pregunto, si agregaras un variador de velocidad al motor del compresor, puede llegar a funcionar. No se que tipo de motor esta usando el compresor de la camara de refrigeración. Si fuera posible variarle la velocidad, tendrías control sobre el caudal de gas, y por lo tanto podrias controlar su capacidad para refrigerar.

Como lo ven Go_zalo y AlexPLD?
Solo aporto ideas. Claro que prenderlo y apagarlo es mas fácil. Yo usaría en ese caso un rele de estado sólido Crydom con la opción de cruce por cero. (no sugiero armarlo porque hablamos de algo comercial y conviene usar cosas probadas y de calidad).

AlexLPD

Así es @Surbyte esa ha sido una idea para solucionar este rollo pero según el foro de refrigeración lo mas que podria hacer con el variador seria quitarle un 20℅ a la capacida... Ya que el compresor no viene preparado para ser usado con variador de velocidad y podria dañarse los devanados si bajamos mas de ese punto o si intentamos ir arriba del 100℅....

Ahora bien en cuanto a lo de fuzzy lógic... La función de transferencia quiero entenderá como la cantidad de frio que es depletada en algún tiempo.... Esa cantidad es conocida por que es así como se selccionan los componentes del sistema. Pero esta función no seria constante.... Por ejemplo si hago la función de transferencia con el.chiller cargado de carne recién llegada será una cosa, si la carne ya esta fría será otra cosa y si por ejemplo sobrecargan la cámara otra  mas diferente... Incluso la capacidad de transferencia de frio de la unidad se ve afectada por la temperatura dentro del chiller.... A menor temperatura menor capacidad.


Me podrías mostrar un ejemplo de el horno que mencionas? Digo si no esta bajo alguna proteccion intelectual.

Si efectivamente un bypass, lo de sacarle y meterle el gas es cosa sencilla usamos un equipo para recuperar el refrigerante y dejar vacio al sistema...  Pero como dices quizás no sea lo mas adecuado....

Alex.

surbyte


AlexLPD

Esa no se me había ocurrido.... Le preguntare al cliente aunque veo dificil q se quiera gastar unos 2000dlrs.

 :smiley-sad-blue:

Igual y solo se puede controlar por temperatura en este ser ahora mismo. Aunque el PID me viene perfecto para unas incubadoras de gallos q pienso hacer y vals darle una vuelta a eso de fuzzy lógica.... Hasta lavadoras venden con eso...y no tenia idea

surbyte

Momento. No sabía que el motor costaba tanto.
Porque cambiar el motor es para sumarle un variador que cuesta otro tanto.
Asi que vamos paso a paso. Analicemos bien si es una solucion viable.

GO_zalo

si la carga cambia cambia la función de transferencia, pero podrías hacer un calculo de la inercia térmica que tiene el sistema cada vez que se pone en marcha el compresor, esperas x tiempo (inferior al tiempo del ciclo) y ves que cambio ha tenido en la variable controlada, con eso te haces a la idea de la carga que tiene el congelador, mas bien de la cantidad de calor que contiene y ajustar tus parámetros para el siguiente ciclo

Go Up