Go Down

Topic: Cella di fermentazione e gestione caldo/freddo con celle di peltier e ponte H (Read 272 times) previous topic - next topic

ilario

buongiorno, prendendo spunto da una vecchia discussione qui su questo forum, sto implementando una cella di lievitazione che attraverso una cella di peltier possa gestire il caldo ed il freddo a seconda delle esigenze (ed in futuro la gestione dell'umidità).
I componenti hardware sono:
Cella di peltier TEC1-12710
Dissipatore Alpine 11 plus
Ponte H : BTS7960 da 43 A
Alimentatore 12v 30A
Arduino Uno
Sonda di temperatura DS18B20
DHT22 per valutazione dell'umidità

Il codice che gestiva il caldo ed il freddo, SEPARATAMENTE, con un approccio Sign and Magnitude e gestione PWM, è il seguente


situazione SETPOINT < T.Ambiente (FUNZIONE FREDDO)
Code: [Select]

/*
Il programma misura la temperatura tramite il sensore DS18B20 e lo usa come ingresso al PID
L'uscita del PID pilota un circuito H-bridge

Vengono utilizzati i seguenti pin per DS18B20
Pin +5V         -> Alimentazione
Pin GND         -> Alimentazione
Pin Digital 2   -> Linea dati sensore DS18B20

*/

#include <OneWire.h>
#include <DallasTemperature.h>
#include <PID_v1.h>

/* Definizioni globali */

// Il terminale data del sensore è connesso alla porta 2 di Arduino
#define ONE_WIRE_BUS 2

// Imposta la comunicazione oneWire per comunicare
// con un dispositivo compatibile
OneWire oneWire(ONE_WIRE_BUS);

// Passaggio oneWire reference alla Dallas Temperature.
DallasTemperature sensors(&oneWire);

double Setpoint, Input, Output;
                   
int SNS_A   = A0; // current read
int LPWM = 9; // H-bridge leg 1 ->LPWM
int enL = 8; // H-bridge enable pin 1 -> L_EN
int RPWM = 6; // H-bridge leg 2 ->RPWM
int enR = 7; // H-bridge enable pin 2 -> R_EN

/* Impostazione dell'hardware */

//Inizializzazione del PID, impostazione a DIRECT (frigo)
PID myPID_COLD(&Input, &Output, &Setpoint,2,5,1, REVERSE);

void setup()
{

  Setpoint = 15;          //definizione del set point
  Serial.begin(9600);
  Serial.println("Temperatura    PIDout    Corrente\n");

  //turn the PID on
  myPID.SetMode(AUTOMATIC);
  // Start up the OneWire library
  sensors.begin();
  // Configurazione PIN direzione e freno H-bridge

  pinMode(LPWM, OUTPUT);
  pinMode(RPWM, OUTPUT);
  pinMode(enL, OUTPUT);
  pinMode(enR, OUTPUT);
  digitalWrite(enL, HIGH);
  digitalWrite(enR, HIGH);

}

void loop()
{
  sensors.requestTemperatures(); // Invia il comando di lettura delle temperatura
  double temp = sensors.getTempCByIndex(0);  // legge il valore della temperatura e la memorizza nella var. temp.
  Input = temp;              //temperatura passata in ingresso a PID
  myPID.Compute();
 
  digitalWrite(LPWM, LOW);
  analogWrite(RPWM,Output); //PWM con segnale in uscita pari a uscita PID
   
  Serial.print( temp);    // invia i valori alla seriale
  Serial.print("\t");
  Serial.print((Output/255*100));
  Serial.print("\t");
  Serial.print(analogRead(SNS_A));
  Serial.print("\n");

delay (1000);
 
}


per quanto riguarda invece la situazione opposta, SETPOINT > T.ambiente (funzione caldo), il funzionamento prevederebbe il funzionamento inverso del pid e lo scambio dei valori sul ponte H:

Code: [Select]

...
PID myPID_COLD(&Input, &Output, &Setpoint,2,5,1, DIRECT);
...
 
  digitalWrite(LPWM, Output);
  analogWrite(RPWM, LOW);



Ora: come posso gestire il funzionamento completo caldo/freddo considerando i problemi che si potrebbero avere ad esempio:
 - sovraelongazioni durante la stabilizzazione pid che farebbero invertire la polarità;
 - setpoint molto vicino alla temperatura ambiente e cambi repentini di polarità;
 - frequenza del PWM rispetto alla tolleranza della cella di peltier (ho letto che si può modificare);

Un altro requisito, a cose funzionanti, è "l'inseguimento" del punto di rugiada: volendo evitare condense sul dissipatore vorrei poi impostare la temperatura del dissipatore leggermente di sopra di quella temperatura in corrispondenza della quale l'umidità relativa all'interno del box condensa. In loop, valuterei poi sempre questa temperatura, sulla base di quella che via via si abbassa e dell'umidità all'interno della cella.

Successivamente poi vorrei anche poter gestire la riduzione dell'umidità. Credo sia abbastanza semplice poichè sarebbe sufficiente far refrigerare un dissipatore con una seconda cella di peltier sulla quale far condensare appositamente l'umidità e raccoglierla in un contenitore.
L'immissione di umidità avverrebbe tramite un vaporizzatore/atomizzatore gestito in on/off valutando il tutto con un DHT22.
Insomma, tanta carne sul fuoco. Spero che a qualcuno possa interessare in modo tale da "aggiungersi" in questo viaggio..


Etemenanki

...
 - sovraelongazioni durante la stabilizzazione pid che farebbero invertire la polarità;
 - setpoint molto vicino alla temperatura ambiente e cambi repentini di polarità;
 - frequenza del PWM rispetto alla tolleranza della cella di peltier (ho letto che si può modificare);
...
Per i primi due, direi isteresi calibrate sui parametri dell'inerzia termica del sistema, e magari "finestre" di variazione preimpostate (ad esempio, non permettere variazioni troppo veloci impostando una "finestra" massima di pochi gradi in cui far lavorare il PID) ... per la terza cosa intendi esattamente ?

Una cella di peltier fisicamente e' semplicemente una pompa di calore bidirezionale che produce calore extra durante il funzionamento, ma elettricamente e' in pratica niente altro che una serie di giunzioni ... una sorta di resistenza non molto lineare di valore abbastanza basso ... non ha particolari tolleranze o criticita' con i PWM, a parte non esagerare con le frequenze (indicativamente, qualsiasi cosa fra il centinaio di Hz e la decina di KHz non crea problemi) ...

L'unico problema potresti averlo se la cella rimane senza alimentazione ... in quel caso si comporta come un discreto conduttore di calore, in entrambi i sensi ... se ad esempio stai raffreddando (per cui il lato caldo e' parecchio piu caldo di quello freddo, dato che oltre al calore pompato via dal lato freddo deve dissipare anche il calore prodotto dalle giunzioni mentre pompano) e perdi l'alimentazione, il calore ritorna sul lato freddo molto velcemente (e viceversa) ... di solito per ovviare a questo problema si tiene sempre la cella alimentata alla minima corrente di funzionamento per impedire che smetta di funzionare, ma usandola in modo bidirezionale, e pilotata da un ponte, non e' esattamente il sistema migliore ... potresti ovviare alla cosa usando un "grosso" blocco di alluminio o dissipatore per sfruttarne l'inerzia termica, piu un sistema che riduca la tensione applicata alla cella in modo proporzionale (oltre al PWM) man mano che la temperatura ambiente e quella interna si avvicinano, ma e' tutta da provare, e complicherebbe un po la parte hardware e la circuiteria ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

ilario

impostando un valore di thresold ad esempio di 0.5, potrebbe essere utilizzabile un banale codice del genere?

Code: [Select]


...
  sensors.requestTemperatures(); // Invia il comando di lettura delle temperatura
  double temp = sensors.getTempCByIndex(0);  // legge il valore della temperatura e la memorizza nella var. temp.
  Input = temp;              //temperatura passata in ingresso a PID
 
if (Setpoint > (temp + Thresold)){ //se la temperatura impostata è superiore alla temperatura attuale più la soglia, attiva il freddo
 myPID_COLD.Compute();
 digitalWrite(LPWM, LOW);
 analogWrite(RPWM,Output); //PWM con segnale in uscita pari a uscita PID
 }

else if (Setpoint < (temp - Thresold)){  se il setpoint è inferiore alla temperatura attuale meno la soglia, attiva il caldo //CALDO
  myPID_HOT.Compute();
  digitalWrite(LPWM, Output); //PWM con segnale in uscita pari a uscita PID
  analogWrite(RPWM,LOW);
}
else if ( (Setpoint >= (temp - Thresold)) && (Setpont <= (temp+Thresold)) {

//da definire

}
...




la cella comunque non si assesterebbe attorno ad un valore di potenza diverso da zero? in questo modo sarebbe comunque sempre attiva

Etemenanki

Dipende ovviamente da quale tolleranza la tua cella puo sopportare mantenendo la funzione di fermentazione al suo meglio ... ma quello che intendevo, principalmente, e' he in fase di funzionamento, la cella non dovrebbe mai essere lasciata senza alimentazione ... mentre invece se la temperatura richiesta e' pari o molto simile a quella ambiente, invece, la condizione di mancanzaa di alimentazione potrebbe essere desiderabile, perche' in quel modo si comporda da conduttore di calore semplice mettendo in pari dissipatore esterno ed interno ...

Quindi, sempre sapendo le tolleranza possibili, probabilmente uno dei possibili sistemi potrebbe essere una macchina a tre stati ... uno stato, chiamalo riscaldamento, in cui la cella viene mantenuta sempre almeno ad 1 o 2 % del riscaldamento, e poi il pid gestisce il resto del pwm ... uno stato in cui la temperatura e' nella tolleranza di quella esterna, quindi senza cella alimentata, ed uno in cui e' sempre almeno ad 1 o 2 % del raffreddamento, ed il pid gestisce il resto ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

ilario

settando ad esempio il pid con un SetOutputLimits (10, 255) non risolverei il problema dell'alimentazione costante e diversa da zero sulla cella, sia in modalità caldo che freddo?

Etemenanki

Si, ma non se la temperatgura interna e' simile a quella esterna ... perche' rischieresti di continuare ad invertire la polarita' della cella, e questo non la farebbe funzionare correttamente ...

Dato che la cella di Peltier e' in pratica una "pompa di calore" non esattamente ideale (anzi, proprio per nulla ideale), produce a sua volta calore sia quando trasferisce in un senso, sia quando trasferisce nell'altro ... invertendo troppo frequentemente fra "riscalda" e "raffredda", si finirebbe per generare molto piu calore nel sistema ... quindi tocca tenerlo presente quando si progettano sistemi basati sulle celle di peltier ... se il sistema dovesse fare solo una cosa, cioe' solo raffreddare o solo riscaldare, il problema non ci sarebbe (o comunque sarebbe molto piu facilmente gestibile) ...

Personalmente, ti consiglierei di rivedere leggermente il progetto, usando si la cella di Peltier per raffreddare, ma invece un semplice riscaldatore resistivo per riscaldare (potrebbe essere un riscaldatore specifico, ma anche una semplice resistenza "corazzata" avvitata in qualche posizione su un secondo dissipatore interno, anche quello ovviamente con una sua sonda termica) ... in questo modo il programma dovrebbe si gestire si due differenti uscite anziche' una, e tre sonde termiche invece che due, ma per assurdo, ti semplificheresti la vita ... niente ponte h, basterebbero due mosfet ... niente terzo stato del ponte ... niente inversioni di polarita' con conseguenti problemi dalla cella ...

Ti basterebbe una specie di controllo che gestisce il PWM dell cella quando deve raffreddare, esclude tutto quando la temperatura estena e' uguale a quella richiesta all'interno, e gestisce il secondo PWM della resistenza qundo devi riscaldare ... sempre considerando le possibili tolleranze ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

Go Up