Sei sulla pagina 1di 53

Termorregulacin

http://www.engin.umich.edu/group/ctm/PID/PID.html
http://en.wikipedia.org/wiki/PID_controller
http://www.mne.psu.edu/sommer/me445/ntcnotes.pdf
http://www.ferrotec.com/technology/thermoelectric/

http://einstein.ciencias.uchile.cl

20 de octubre de 2009

Potencia del
calefactor, watt.
Temperatura del
caf, K.
Tiempo

Cp, calefactor
Cp, cafe

dTcafe
dt

dTcalefactor
dt

Tcalefactor Tpieza U calefactor

Tcafe Tpieza Tcalefactor Tcafe

watt

El nivel basal del trazo de la temperatura es la temperatura de la pieza.


El de la potenciales cero.

watt

Potencia del
calefactor, watt.
Temperatura del
caf, K.
Tiempo

Tasa ms llena

Pieza ms fra

Cp

dTcafe
dt

Tcafe Tpieza Tcalefactor Tcafe

watt

Sistema de control con realimentacin negativa

-Vcontrol

Vcontrol V V Vout

R
R
Vcontrol V V Vout
2V Vcontrol Vout

Vout

Vout AV V

Vout

Vcontrol Vout
A 0

2Vout AVcontrol Vout


Vout A 2 AVcontrol

A
Vcontrol Vout
Vcontrol
A 2
Vout si A 2

Vout
Vcontrol

2V

-20 V

-2 V

2V

Potencia = watt
= iV
= V2R-1
= i2R

Potencia
temperatura

Handout.pdf

T
-Tset

5%

-(T-Tset) = -Error

P Error

Traduzco la temperatura
en un voltaje usando un
termistor.
Traduzco el voltaje en
potencia usando un
elemento Peltier.

Potencia negativa?

2 volt

Potencia
temperatura

Elemento de efecto Peltier.


http://www.ferrotec.com/technology/thermoelectric/

Elemento Termo Elctrico, TE, ( efecto Peltier ).

Si invierto el sentido de la corriente invierto el sentido del transporte de calor.

Elemento de efecto Peltier.


http://www.ferrotec.com/technology/thermoelectric/

Elemento de efecto Peltier.


http://www.ferrotec.com/technology/thermoelectric/

T
-Tset

5%

-(T-Tset) = -Error

P Error

2 volt

T
-Tset

10%

-(T-Tset) = -Error

P Error

2 volt

T
-Tset

20%

-(T-Tset) = -Error

P Error

2 volt

T
-Tset

30%

-(T-Tset) = -Error

P Error

2 volt

T
-Tset

50%

-(T-Tset) = -Error

P Error

2 volt

Controlador Proporcional Integral Diferencial, PID.

http://en.wikipedia.org/wiki/PID_controller

30%

P Error
0%
-(T-Tset) = -Error

I Error

2 volt

30%

P Error
10%
-(T-Tset) = -Error

I Error

2 volt

30%

P Error
30%
-(T-Tset) = -Error

I Error

2 volt

30%

P Error
75%
-(T-Tset) = -Error

I Error

2 volt

30%

P Error
100%
-(T-Tset) = -Error

I Error

2 volt

30%

P Error
100%
-(T-Tset) = -Error

2 I Error

2 volt

Controlador Proporcional Integral Diferencial, PID.

http://en.wikipedia.org/wiki/PID_controller

30%

P Error
75%
-(T-Tset) = -Error

I Error
0%

dError
D
dt
2 volt

30%

P Error
75%
-(T-Tset) = -Error

I Error
20%

dError
D
dt
2 volt

30%

P Error
75%
-(T-Tset) = -Error

I Error
45%

dError
D
dt
2 volt

30%

P Error
75%
-(T-Tset) = -Error

I Error
75%

dError
D
dt
2 volt

30%

P Error
75%
-(T-Tset) = -Error

I Error
45%

dError
D
dt
2 volt

Termocontrolador
Termistor

Potencimetro

Demodulador

Arduino
micro
controlador

Amplificador
de potencia

Switch
LCD

Serial port

Fuente de poder

Entrada 220 volt

220
VAC
fase

16 VAC 8A

1.5 A
GND

Tierra
16 VAC 8A
16 VAC 500 mA

220
neutro

GND

16 VAC 500 mA

Fuente de poder no regulada

Vrms

V pico

2
Resistencia de
carga de 1 ohm

Vpico Vrms 2

20V

200 ms

Fuente de poder regulada

16 VAC

7815
+15 V

GND

7809

+9 V
16 VAC

7915

GND

-15 V

4.5

30000

25000

3.5

20000
3
15000
2.5

10000

5000
0

1.5
0

10

20

30

40

50

Temperatura, grados Celsius


SteinhartHart equation
T is the temperature (in Kelvin)
R is the resistance at T (in Ohms)
A, B, and C are the Steinhart-Hart coefficients

1
3

a b ln R c ln R
T

Voltaje, volt

Resistencia R2, ohm

35000

2.3 V

Amplificador del thermistor


5V

1.7-4.1V

3.4-8.2V

-(3.4-8.2V)

0.1-4.9V

Termistor
Al ADC

Vout 2 Vin 3.3


.6 Vout 4.7

Temperatura, grados Celsius

y = temperatura en 0C
x = Salida del ADC / 1000

Analog in pin 2

Salida del ADC


DAC_cuentas = analogRead(thermistor);
temperatura = cuentas_A_grados(DAC_cuentas);

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

Demodulacin de las salidas anlogas ( PWM @ 500 Hz)

analogWrite(5,230);

analogWrite(5,128);

10%

2V
1 ms

analogWrite(5,26);

2V
20 ms

PWM demodulator

PWM channel 5

analogWrite(5,128);
analogWrite(6,0);

analogWrite(5,0);
analogWrite(6,128);
PWM channel 6

2V
20 ms

Amplificador de poder
+15V

+22V
DBX33

70%

Output

Input

+/- 2 A
+/- 6V sobre 3 ohm

70%

DBX34

-22V

Existen amplificadores operacionales de


potencia, por ejemplo LM657
http://www.national.com/mpf/LM/LM675.html

Output

-15V

Input

#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 itoa
char 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 Mide la temperatura

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

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 Determina la temperatura a regular


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

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 1 Controla la temperatura


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

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 Define KP
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 4 Define KI
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 3 Define KD
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

Temperatura, grados Celsius

Prueba del sistema

Tiempo, segundos
Set point

Temperatura controlada Temperatura de la pieza

Potrebbero piacerti anche