Termorregulación
20 de octubre de 2009
http://en.wikipedia.org/wiki/PID_controller
http://www.mne.psu.edu/sommer/me445/ntcnotes.pdf
http://www.ferrotec.com/technology/thermoelectric/
http://www.engin.umich.edu/group/ctm/PID/PID.html
http://einstein.ciencias.uchile.cl
Potencia del calefactor, watt.
Temperatura del café, K.
cafecalefactorpiezacafecafe TTTTdt
dTcafeCp , watt
calefactorpiezacalefactorcalefactor UTTdt
dTcalefactorCp , watt
Tiempo
El nivel basal del trazo de la temperatura es la temperatura de la pieza. El de la potenciales cero.
Tasa más llena Pieza más fría
Potencia del calefactor, watt.
Temperatura del café, K.
cafecalefactorpiezacafecafe TTTTdt
dTCp watt
Tiempo
-Vcontrol Vout
Sistema de control con realimentación negativa
VVAVoutRVV
RVV outcontrol
outcontrol VVVV
outcontrol VVV 2
20 outcontrol
out
VVAV
outcontrolout VVAV 2
controlout AVAV 2
controlout VAA
V2
outcontrol VV
2A si outcontrol VV
2 V -20 V 2 V-2 V
Handout.pdf
Potencia = watt= iV= V2R-1
= i2RPotenciatemperatura
2 volt
-TsetT
-(T-Tset) = -Error P Error
5%
¿Potencia negativa? Elemento de efecto Peltier.http://www.ferrotec.com/technology/thermoelectric/
Potenciatemperatura
Traduzco la temperatura en un voltaje usando un termistor.
Traduzco el voltaje en potencia usando un elemento Peltier.
Elemento de efecto Peltier.http://www.ferrotec.com/technology/thermoelectric/
Si invierto el sentido de la corriente invierto el sentido del transporte de calor.
Elemento Termo Eléctrico, TE, ( efecto Peltier ).
Elemento de efecto Peltier.http://www.ferrotec.com/technology/thermoelectric/
2 volt
-TsetT
-(T-Tset) = -Error P Error
5%
2 volt
-TsetT
-(T-Tset) = -Error P Error
10%
2 volt
-TsetT
-(T-Tset) = -Error P Error
20%
2 volt
-TsetT
-(T-Tset) = -Error P Error
30%
2 volt
-TsetT
-(T-Tset) = -Error P Error
50%
http://en.wikipedia.org/wiki/PID_controller
Controlador Proporcional Integral Diferencial, PID.
-(T-Tset) = -Error
P Error
ErrorI
30%
0%
2 volt
-(T-Tset) = -Error
P Error
ErrorI
30%
10%
2 volt
-(T-Tset) = -Error
P Error
ErrorI
30%
30%
2 volt
-(T-Tset) = -Error
P Error
ErrorI
30%
75%
2 volt
-(T-Tset) = -Error
P Error
ErrorI
30%
100%
2 volt
-(T-Tset) = -Error
P Error
ErrorI2
30%
100%
2 volt
http://en.wikipedia.org/wiki/PID_controller
Controlador Proporcional Integral Diferencial, PID.
-(T-Tset) = -Error
P Error
ErrorI
30%
75%
dtdError
D
0%
2 volt
-(T-Tset) = -Error
P Error
ErrorI
30%
75%
dtdError
D
20%
2 volt
-(T-Tset) = -Error
P Error
ErrorI
30%
75%
dtdError
D
45%
2 volt
-(T-Tset) = -Error
P Error
ErrorI
30%
75%
dtdError
D
75%
2 volt
-(T-Tset) = -Error
P Error
ErrorI
30%
75%
dtdError
D
45%
2 volt
Fuente de poder
Arduinomicrocontrolador
Termistor
Potenciómetro
LCDSwitch
Demodulador
Amplificadorde potencia
Termocontrolador
Serial port
Entrada 220 volt
1.5 A
220 VACfase
220 neutro
Tierra
16 VAC 8A
16 VAC 8A
16 VAC 500 mA
16 VAC 500 mA
GND
GND
Fuente de poder no regulada
2pico
rms
VV
2rmspico VV
1 2
20V
200 ms
3
Resistencia de carga de 1 ohm
Fuente de poder regulada
16 VAC
16 VAC
GND
7815
7809
7915
+15 V
+9 V
-15 V
GND
Steinhart–Hart equationT is the temperature (in Kelvin) R is the resistance at T (in Ohms) A, B, and C are the Steinhart-Hart coefficients
Temperatura, grados Celsius
Res
iste
ncia
R2,
ohm V
oltaje, volt
3lnln1
RcRbaT
2.3 V
Amplificador del thermistor
Termistor
5 V
1.7-4.1V 0.1-4.9V
Al ADC
3.4-8.2V -(3.4-8.2V)
3.32 inout VV
7.46. outV
Salida del ADC
Tem
pera
tura
, gr
ados
Cel
sius
y = temperatura en 0Cx = Salida del ADC / 1000
DAC_cuentas = analogRead(thermistor); temperatura = cuentas_A_grados(DAC_cuentas);
Analog in pin 2
float cuentas_A_grados(int count){ double a = 51.191000000; //Parametros para V del thermistor de 10k double b= -0.0585000000; // unido a un resistencia de 7 kohm a +5 volt double c = 0.0000300000; // multiplicado por 2 double d =-0.0000000200; // menos 3.3 volt. double mil = 1000.0000; double dcount; double dcountN; double dresult; double dresult1;double dresult2; double dresult3;
float resultado; dcount =(double) count; dcount = dcount/mil; dresult1 = b*dcount; dcountN = dcount *dcount; dresult2 = dcountN*c; dcountN = dcountN *dcount; dresult3 = dcountN*d; dresult = a + dresult1 + dresult2 + dresult3; resultado = (float) dresult; return resultado;}
Analog in pin 2
10% 2V
20 ms2V
1 ms
Demodulación de las salidas análogas ( PWM @ 500 Hz)
analogWrite(5,128);
analogWrite(5,26);
analogWrite(5,230);
PWM demodulator
PWM channel 5
PWM channel 6
2V
20 ms
analogWrite(5,128);analogWrite(6,0);
analogWrite(5,0);analogWrite(6,128);
Amplificador de poder+22V+15V
-15V -22V
InputOutput
DBX33
DBX34
70%
70%
+/- 2 A+/- 6V sobre 3 ohm
Input
Out
put
Existen amplificadores operacionales de potencia, por ejemplo LM657http://www.national.com/mpf/LM/LM675.html
#include <LCD4Bit.h>#include <stdlib.h>#define thermistor 2#define potentiometer 3#define calentar 5#define enfriar 6
LCD4Bit lcd = LCD4Bit(2);// select the I/O pin for Digital Dispay
char S1[4]; // String S1 para itoachar S2[16] = " Funcion ";int funcion = 0;float temperatura = 25;float tempset = 25 ;long t;float KP=25; float KI=25; float KD = 5;float lasterror=0; float integral=0; float diferencial = 0;
void setup() { lcd.init(); lcd.clear(); lcd.cursorTo(1,0); lcd.printIn("Hola!"); Serial.begin(1200); Serial.println("Termostat"); lcd.clear(); pinMode(3,INPUT); lcd.cursorTo(2,0); lcd.printIn(S2); lcd.printIn(itoa(funcion,S1,10)); analogWrite(enfriar,0); analogWrite(calentar,0); delay(1000);}
void loop() { int DAC_cuentas; while (digitalRead(3)==LOW) { analogWrite(enfriar,0); analogWrite(calentar,0); funcion = funcion + 1; if (funcion >= 6 ) funcion = 0; lcd.cursorTo(2,0); lcd.printIn(S2); lcd.printIn(itoa(funcion,S1,10)); delay (1000); } switch (funcion) {
Digital pin 3
Digital pin 3
case 0: { lcd.cursorTo(0,5); lcd.printIn(" "); while (digitalRead(3)==HIGH) { DAC_cuentas = analogRead(thermistor); temperatura = cuentas_A_grados(DAC_cuentas); display_float(temperatura,1,0); delay(1000); } break; }
Digital pin 3
Case 0 Mide la temperatura
float cuentas_A_grados(int count){ double a = 51.191000000; //Parametros para V del thermistor de 10k double b= -0.0585000000; // unido a un resistencia de 7 kohm a +5 volt double c = 0.0000300000; // multiplicado por 2 double d =-0.0000000200; // menos 3.3 volt. double mil = 1000.0000; double dcount; double dcountN; double dresult; double dresult1;double dresult2; double dresult3;
float resultado; dcount =(double) count; dcount = dcount/mil; dresult1 = b*dcount; dcountN = dcount *dcount; dresult2 = dcountN*c; dcountN = dcountN *dcount; dresult3 = dcountN*d; dresult = a + dresult1 + dresult2 + dresult3; resultado = (float) dresult; return resultado;}
Analog in pin 2
void display_float(float datum, int fila, int columna){ int enteros; int decimas; int i; i = (int) 10*datum ; //Cast operator enteros= i/10; decimas = i% 10; lcd.cursorTo(fila,0+columna); if (enteros<10) lcd.printIn(" "); lcd.printIn(itoa(enteros,S1,10)); lcd.cursorTo(fila,2+columna); lcd.printIn("."); lcd.cursorTo(fila,3+columna); lcd.printIn(itoa(decimas,S1,10)); Serial.print(enteros); Serial.print("."); Serial.print(decimas); Serial.print(" "); }
case 1: { while (digitalRead(3)==HIGH) { tempset = omni(tempset); if (tempset <= 5.0) tempset = 5.0; if (tempset >= 50.0) tempset = 50.0; display_float(tempset,1,5); delay(100); } break; }
Digital pin 3
Case 1 Determina la temperatura a regular
float omni(float parameter) { int i; int j; i = analogRead(potentiometer); delay(50); j = analogRead(potentiometer); if (j > i+1) parameter = parameter -1; if (j < i-1) parameter = parameter +1; if (parameter > 100) parameter = 100; if (parameter < 0) parameter = 0; return (parameter); }
5Kohm Analog in pin 3
case 2: { integral = 0.0; while (digitalRead(3)==HIGH) { DAC_cuentas = analogRead(thermistor); temperatura = cuentas_A_grados(DAC_cuentas); display_float(temperatura,1,0); display_float(tempset,1,5); controla(temperatura,tempset,KP,KI,KD); t = t +1; Serial.print(t); display_float(temperatura,1,0); display_float(tempset,1,5); delay(1000); } break; }
Digital pin 3
Case 1 Controla la temperatura
void controla(float Tmedida, float Tset, float Kp, float Ki, float Kd) { float error; int potencia; error =(Tmedida - Tset); integral = (integral + error)/10; if ( integral >1000) integral = 1000; if ( integral <-1000) integral = -1000; diferencial = 10*(error-lasterror); lasterror = error; potencia =(int) Kp*error + Ki*integral + Kd*diferencial; sacawatts(potencia); }
void sacawatts( int watts) { int signo; int maxwatts = 255; signo = watts; if (watts <0) watts = -watts; if (watts > maxwatts) watts = maxwatts; lcd.cursorTo(2,1); if (watts <= 100) lcd.printIn(" "); if (watts <= 10) lcd.printIn(" "); lcd.printIn(itoa(watts,S1,10)); lcd.printIn(" "); lcd.cursorTo(2,0); if(signo > 0) { analogWrite(enfriar,watts); analogWrite(calentar,0); lcd.printIn("-"); } else { analogWrite(enfriar,0); analogWrite(calentar,watts); lcd.printIn("+"); } }
case 3: { while (digitalRead(3)==HIGH) { lcd.cursorTo(2,0); lcd.printIn("KP = "); lcd.printIn(itoa(KP,S1,10)); lcd.printIn(" "); KP = omni(KP); delay(100); } break; }
Digital pin 3
Case 3 Define KP
case 4: { while (digitalRead(3)==HIGH) { lcd.cursorTo(2,0); lcd.printIn("KI = "); lcd.printIn(itoa(KI,S1,10)); lcd.printIn(" "); KI = omni(KI); delay(100); } break; }
Digital pin 3
Case 4 Define KI
case 5: { while (digitalRead(3)==HIGH) { lcd.cursorTo(2,0); lcd.printIn("KD = "); lcd.printIn(itoa(KD,S1,10)); lcd.printIn(" "); KD= omni(KD); delay(100); } break; } }
Digital pin 3
Case 3 Define KD
Tem
pera
tura
, gr
ados
Cel
sius
Tiempo, segundos
Prueba del sistema
Set point Temperatura controlada Temperatura de la pieza
Top Related