Control de Temperatura Por PWM Usando PIC (Pic C CCS)

13
29/7/2014 Progra, Mecatronica y mas: Control de Temperatura por PWM usando PIC (Pic C CCS) http://hzsquare.blogspot.com/2011/11/control-de-temperatura-por-pwm-usando.html 1/13 Control de Temperatura por PWM usando PIC (Pic C CCS) Control de Temperatura por PWM usando PIC (Pic C CCS) con protección contra cortocircuito. Parto de dos sencillas ideas: Imagen del circuito Imagen de Muestra del Circuito de Control y Potencia en Proto

Transcript of Control de Temperatura Por PWM Usando PIC (Pic C CCS)

29/7/2014 Progra, Mecatronica y mas: Control de Temperatura por PWM usando PIC (Pic C CCS)

http://hzsquare.blogspot.com/2011/11/control-de-temperatura-por-pwm-usando.html 1/13

Control de Temperatura por PWM usando PIC (Pic C CCS)

Control de Temperatura por PWM usando PIC (Pic C CCS) con

protección contra cortocircuito.

Parto de dos sencillas ideas:

Imagen del circuito

Imagen de Muestra del Circuito de Control y Potencia en Proto

29/7/2014 Progra, Mecatronica y mas: Control de Temperatura por PWM usando PIC (Pic C CCS)

http://hzsquare.blogspot.com/2011/11/control-de-temperatura-por-pwm-usando.html 2/13

1. Un MOSFET permite la coducción de corriente de Source a Drain en proporción

directa al voltaje existente en la base, por tanto se dice que el MOSFET es un

dispositivo controlado por voltaje a diferencia del BJT que es controlado por

corriente. (MOSFET)

2. Un microcontrolador puede ser programado para mandar una señal PWM a

frecuencia y DutyCicle variables. Si sabemos que podemos variar el voltaje

promedio de esa señal PWM a la salida del microcontrolador (de 0v a 5v),

amplificando esa señal y mandándola a la base de un MOSFET lograríamos

controlar en cierto rango controlar la corriente que pasa de Source a Drain en el

mismo.

Con las dos ideas anteriores podemos partir para hacer un controlador de corriente,

pero para hacer esto un poco más práctico, si hacemos pasar esta corriente

controlada por una resistencia de carga haríamos que esta se calentara, logrando

ahora un control de la temperatura de la resistencia al variar la corriente que pasa a

través de esta.

Bien, para que todo esto funcione, dividiré el desarrollo del proyecto en dos etapas:

1. Etapa de control

2. Etapa de Potencia (se incluye la protección contra cortos)

Etapa de Control

Material:

4 potenciometros de 1kohm

2 leds

3 resistencias 330 ohms

1 pic16f887

1 pantalla lcd (JHD 162A)

1 LM35 (sensor de Temperatura de Precisión)

Usando un microcontrolador PIC 16f887 lograremos hacer un control del DutyCicle del

PWM conforme a la temperatura. Conforme la temperatura aumenta

el DutyCicle delPWM disminuirá de tal forma que cuando la resistencia llegue a la

temperatura deseada el DutyCicle será 0% por tanto la corriente que pasará a través

de la resistencia será 0A haciendo que la temperatura se mantenga estable en ese

punto, hasta que esta se enfríe y la señal PWM vuelva a polarizar el MOSFET.

29/7/2014 Progra, Mecatronica y mas: Control de Temperatura por PWM usando PIC (Pic C CCS)

http://hzsquare.blogspot.com/2011/11/control-de-temperatura-por-pwm-usando.html 3/13

He aquí el esquemático:

DESCARGA1: Etapa Control ISIS Proteus

Como se muestra en la imagen IMG1 pueden armar el circuito de control de

temperatura y simularlo en Isis Proteus descargando los archivos de DESCARGA1.

Al momento de simularlo pueden:

1. Variar la frecuencia de la señal PWM por medio del potenciómetro conectado a

RA0.

2. Variar la Temperatura por medio del sensor LM35 y ver como el DutyCicle del

PWM disminuye conforme la temperatura se acerca al SetPoint (Temperatura

deseada)

3. Variar el SetPoint de 0ºC a 150ºC por medio del potenciómetro conectado a

RA1.

Codificación en C (Pic C de CCS):

IMG1: Control de Temperatura, Etapa de Control

IMG2: Muestra de la Simulación en Proteus

29/7/2014 Progra, Mecatronica y mas: Control de Temperatura por PWM usando PIC (Pic C CCS)

http://hzsquare.blogspot.com/2011/11/control-de-temperatura-por-pwm-usando.html 4/13

Pantalla muestra del Codigo en PIC C de CCS PCWHD

123456789101112131415161718192021222324252627282930313233343536373839404142

/*Hazael Fernando Mojica GarcíaCarlos Alfredo Alanis GonzálezAdriana Rodríguez LiñánSan Nicolás de los Garza 3/Nov/2011*/ /*Programa de Control de Temperatura con un PICPermite variar el DutyCicle y Frecuencia de una señal PWMque controla la corriente que recibe una resistencia de carga La Temperatura a la que llega dicha resistencia se puede variar de 0 a 150ºC (SetPoint)La frecuencia del PWM va de 0Hz a 1KHz (Teoricamente ya que practicamente nunca baja de 477Hz) INFO:El comportamiento es simple, por medio del sensor LM35 se procede a medir la temperaturasi esta no ha llegado aún a la temperatura deseada (SetPoint) manda un PWM con un DutyCicleproporcional a la diferencia entre la temperatura medida y la deseada, si la diferencia es grandeel DutyCicle tambíen lo será y viceversaAl llegar a la teperatura deseada el Control la mantiene. El circuito está diseñado sólo para calentar no para enfriar por tantosi se elige un SetPoint abajo de temperatura ambiente, el DutyCicle siemprepermanecerá en 0%. */ #include <16f887.h> //Nuestro pic#device adc = 10 //Convertidor AD a 10bits#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP#use delay (clock=8000000) //Fosc=8Mhz#include <lcd.c> //Libreria de la lcd //Declaracion de variables publicasfloat TOC;float Prescaler; //Prototipos de Funcionesvoid Refresh_lcd(float _Frecuencia_, float _DutyCicle_, float _SP_, float

?

29/7/2014 Progra, Mecatronica y mas: Control de Temperatura por PWM usando PIC (Pic C CCS)

http://hzsquare.blogspot.com/2011/11/control-de-temperatura-por-pwm-usando.html 5/13

434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103

float Get_Lectura(int channel);float Relacion_LineaRecta_m(float m, float valorEjeIndep);float Calcula_PR2(float _Frecuencia);void Refresh_PWM_Duty(float _DCValue);void Refresh_PWM_Frec(float _Period2);float Calcula_Value_DC(float _SP_, float _Temp_);float CalculaPendiente (float Xmin, float Ymin, float Xmax, float Ymax); void main(){ //int i = 0; float Value_DC = 0.0; float bits_frecuencia = 0.0; float bits_temperatura = 0.0; float bits_setPoint = 0.0; float bits_dutyCicle = 0.0; float SetPoint = 150.0; //Valor que se desea de Temperatura float DutyCicle = 0.0; float Frecuencia = 0.0; float Temperatura = 0.0; float mFrec = 0.977517106; //Pendiente de la recta para Frecuencia m = (1000 - 0)/(1023 - 0) float mT = 0.65625; //Pendiente de la temperatura m = ( 21 - 0 ) / ( 32 - 0 ) float mVDC = 0.0; //float mDC = 0.000977517065; //Pendiente de la recta para DutCicle m = (1 - 0)/(1023 - 0) float mDC = 0.392156862; //Pendiente de la recta para DutCicle m = (100 - 0)/(255 - 0) float mSP = 0.146627566; //Pendiente de la recta para SetPoint m = (150 - 0)/(1023 - 0) float Period2 = 0.0; float PWMValue = 0.0; float Period2_ = 0.0; //Valor de Period2 inmediato anterior float PWMValue_ = 0.0; //Valor de PWMValue inmediato anterior TOC = 0.000000125; // TOC = 1 / clock = 1 / 8000000 Prescaler = 16.0; //Programar el oscilador interno del pic y usar CCP afecta al PWM //setup_oscillator(OSC_8MHZ|OSC_INTRC); //Programamos oscilador interno del Pic a 8MHZ //setup_oscillator(OSC_8MHZ); set_tris_b(0); //Puerto B como salida output_low(PIN_C2); // Set CCP1 output low setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM lcd_init(); //Inicializamos LCD lcd_putc("Iniciando..."); //"Hola Mundo" //Frecuencia del PWM setup_timer_2(T2_DIV_BY_16, 249, 1); // 500 Hz set_pwm1_duty(500); delay_ms(5); while(1) { output_toggle(PIN_B5); //Parpadeamos Led, output_toggle cambia el estado logico del pin pasado de parametro

29/7/2014 Progra, Mecatronica y mas: Control de Temperatura por PWM usando PIC (Pic C CCS)

http://hzsquare.blogspot.com/2011/11/control-de-temperatura-por-pwm-usando.html 6/13

104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164

//Obtenemos las lecturas del convertidor A/D para cada parametro de entrada (frecuencia, temperatura y setPoint) bits_frecuencia = Get_Lectura(0); bits_temperatura = Get_Lectura(1); bits_setPoint = Get_Lectura(4); //Obtenemos el valor del eje dependienta pasando el valor del eje independiente (bits) y el valor de la pendiente Frecuencia = Relacion_LineaRecta_m(mFrec, bits_frecuencia); SetPoint = Relacion_Linearecta_m(mSP, bits_setPoint); Temperatura = Relacion_Linearecta_m(mT, bits_temperatura); //Calculamos el valor del DC Value_DC = Calcula_Value_DC(SetPoint, Temperatura); mVDC = CalculaPendiente(0, 0, SetPoint, 255);//Calculamos la pendiente bits_dutyCicle = Relacion_Linearecta_m(mVDC, Value_DC); DutyCicle = Relacion_Linearecta_m(mDC, bits_dutyCicle); PWMValue = bits_dutyCicle; Period2 = Calcula_PR2(Frecuencia); if(PWMValue != PWMValue_) {Refresh_PWM_Duty(PWMValue);} if(Period2 != Period2_) {Refresh_PWM_Frec(Period2);} Refresh_lcd(Frecuencia, DutyCicle, SetPoint, Temperatura); PWMValue_ = PWMValue; Period2_ = Period2; delay_ms(10); //Esperamos a lo sonso 250 ms }} //Metodo que calcula y regresa la pendiente para una recta que posee los puntos//(Xmax,Ymax) y (Xmin,Ymin)float CalculaPendiente (float Xmin, float Ymin, float Xmax, float Ymax){ float m = 0.0; float num = 0.0; float den = 0.0; num = Ymax - Ymin; den = Xmax - Xmin; m = num / den; return m;} //Metodo que calcula el valor del DutyCicle que se enviará//No es más que la diferencia entre el valor de temperatura que//se desea (SetPoint _SP_) y el valor de temperatura actual (_Temp_)float Calcula_Value_DC(float _SP_, float _Temp_)

29/7/2014 Progra, Mecatronica y mas: Control de Temperatura por PWM usando PIC (Pic C CCS)

http://hzsquare.blogspot.com/2011/11/control-de-temperatura-por-pwm-usando.html 7/13

165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225

{ float Value_DC = 0.0; Value_DC = _SP_ - _Temp_; if(Value_DC < 0) { Value_DC = 0; } return Value_DC;} //Asigna un nuevo valor de DutyCicle al PWM usadovoid Refresh_PWM_Duty(float _DCValue){ set_pwm1_duty((int)_DCValue);} //Asigna un nuevo valor de frecuencia al PWMvoid Refresh_PWM_Frec(float _Period2){ setup_timer_2(T2_DIV_BY_16, _Period2, 1);} //Calcula el valor del Periodo(PR2) para la frecuencia//pasada de parametrofloat Calcula_PR2(float _Frecuencia){ float _PR2 = 0.0; float div = 0.0; div = _Frecuencia * 4 * TOC * Prescaler; _PR2 = (1 / div) - 1; if(_PR2 < 0.0) { _PR2 = 0.0;} return _PR2;} //Metodo que regresa el valor del eje dependiente para un valor//del eje independiente (valorEjeIndep) de una recta de pendiente m//que pasa por el origenfloat Relacion_LineaRecta_m(float m, float valorEjeIndep){ float Valor = 0.0; Valor = (m * valorEjeIndep); //Calculamos el Valor del eje dependiente return Valor;} //Obitiene una lectura del canal analógico pasado de parámetrofloat Get_Lectura(int channel){ float medicion=0; //variable entera que contendra la medicion del convertidor AD int1 done = 0; //Contendra 1 si el convertidor terminó de convertir setup_adc (adc_clock_internal); //Usando el oscilador interno setup_adc_ports (all_analog); //Todo el puerto analogico como entrada analogica set_adc_channel (channel); //Establecemos el canal de lectura analogica delay_ms(1); //a small delay is required after setting the channel medicion=read_adc (); // Hace conversión AD done = adc_done(); //done = 1 si el convertidor termino de convertir

29/7/2014 Progra, Mecatronica y mas: Control de Temperatura por PWM usando PIC (Pic C CCS)

http://hzsquare.blogspot.com/2011/11/control-de-temperatura-por-pwm-usando.html 8/13

Descarga2: Codigo en C para PIC C de CCS

Con respecto a la codificación cabe aclarar ciertas cosas:

1. Se dejan comentadas ciertas lineas de codigo que no se usaron al final debido a

que causaban errores o no era conveniente usarlas, esto por si alguien que desea

modificar el código no cometa el mismo error.

1. Oscilador Interno: Aún no estoy muy seguro del porque, pero la

linea: //setup_oscillator(OSC_8MHZ|OSC_INTRC); //Programamos

oscilador interno del Pic a 8MHZ Me ocasionó que el PWM se saliera

de control y actuara como loco.

2. Se necesitan hacer calibraciones en la variable mT (linea 67) del programa de

acuerdo a tu circuito y dispositivos (esta variable representa la pendiente que se

forma en la recta Temperatura vs Bits del ADC), es sencillo, sigue estos pasos:

1. Una vez tengas el circuito armado, cambia la linea 135 de codigo en el

programa:

1. Refresh_lcd(Frecuencia, DutyCicle, SetPoint, Temperatura);

2. por: Refresh_lcd(Frecuencia, DutyCicle, SetPoint, bits_temperatura);

2. Compila y programa el PIC

3. Conectalo a VCC (5v) y ponlo a funcionar.

4. Veras que en la pantalla LCD se mostrarán ahora los bits que arroja el

convertidor analógico digital, si estas a Temperatura ambiente

normalmenteno pasan de 45 bits (si pasa de 45 es porque estas a una

temperatura mayor no que este mal ok!!!). T: 45 como se ve en la

simulación en ISISIMG3. A este valor le llamaremos bits_Temperatura

226227228229230231232233234235236237238239240241242243

while(!done) { done = adc_done(); //Mientras no acabe de convertir se seguira ciclando } setup_adc (adc_off); //detenemos al convertidor return medicion; //Regresamos la medicion} //Reasigana los valores en la pantalla lcdvoid Refresh_lcd(float _Frecuencia_, float _DutyCicle_, float _SP_, float{ lcd_putc("\f"); printf(lcd_putc,"F:%4.1f DC:%4.1f", _Frecuencia_,_DutyCicle_); lcd_putc("%"); lcd_putc("\n"); printf(lcd_putc,"SP:%4.1f T:%4.1f", _SP_, _Temperatura_);}

29/7/2014 Progra, Mecatronica y mas: Control de Temperatura por PWM usando PIC (Pic C CCS)

http://hzsquare.blogspot.com/2011/11/control-de-temperatura-por-pwm-usando.html 9/13

5. Mide el voltaje (con un Voltímetro) que te entrega el LM35 y deduce la

temperatura a la que te encuentras. Ejemplo: si dice 0.021V están a 21ºC,

si dice 0.035V estan a 35ºC que calor!!!!. A este valor le

llamaremosTemperatura

6. Haz la división sencilla de de Temperatura entre

bits_Temperatura:Temperatura / bits_Temperatura.

7. Coloca el valor de esa división en la linea correspondiente (linea 66),

así: float mT = Valor_Division;

1. Ejemplo: Para Temperatura = 21ºC y bits_Temperatura = 32,

Valor_División = Temperatura / bits_Temperatura = 0.65625, por

tanto la linea 65 es : float mT = 0.65625;

8. Regresas la linea 135 a su valor original, compilas y Voila!!!!, ya

tienes tu etapa de control lista.

Si no tienes PIC C de CCS puedes descargarlo de aqui:

DESCARGA3: PIC C CCS

Etapa de Potencia

Como he explicado anteriormente esta etapa de potencia es muy sencilla, tomamos

un MOSFET, sabemos que el MOSFET es un dispositivo controlado por voltaje, es

decir, la corriente que pase de Source a Drain será proporcional al voltaje aplicado al

Gate del mismo, sabiendo que el voltaje promedio que entrega un PWM depende de su

DutyCicle donde un DutyCicle de 0% es 0V y uno de 100% es igual al voltaje por el

cual es generado entonces podemos controlar la corriente. Esto lo hace fabuloso para

poder usar un microcontrolador o algún otro dispositivo digital para generar y

manipular esta señal y dado que el Gate del MOSFET está aislado físicamente del

Source y Drain no tendremos que preocuparnos por aislar lo demás.

IMG3: Calibrando el sensor de Temperatura

29/7/2014 Progra, Mecatronica y mas: Control de Temperatura por PWM usando PIC (Pic C CCS)

http://hzsquare.blogspot.com/2011/11/control-de-temperatura-por-pwm-usando.html 10/13

Hablando un poco sobre la Etapa de Potencia y la protección contra cortocircuito:

MATERIAL:

2 resistencias 5Kohm

1 interruptor (push button)

1 relevador

1 transistor 2n3904 (o uno de mayor potencia, nosotros usamos un

MOSFET IRF640)

1 MOSFET IRFZ44

1 Transformador 120V - 24V de 2Amperes

2 Amplificadores Operacionales LM741

Puente de diodos de 4Amper

Una resistencia de Parrilla eléctrica, o regadera eléctrica (corta un pedazo de

aprox unos 10cm y soldale cables para la protoboard)

IMG4: Diagrama de Protección contra Corto (el voltaje de alimentaciónpuede ser cualquier valor, siempre que los componentes lo permitan

se ejemplifica con 12V, para este proyecto se usan 24V)

29/7/2014 Progra, Mecatronica y mas: Control de Temperatura por PWM usando PIC (Pic C CCS)

http://hzsquare.blogspot.com/2011/11/control-de-temperatura-por-pwm-usando.html 11/13

En la imagen IMG5 se aprecia la etapa de potencia completa, estamos emulando el

voltaje promedio entregado por el PWM por medio del potenciómetro arriba a la

derecha, este varía de 0 a 5v y es incrementado hasta 24v por medio de

losamplificadores operacionales que no hacen otra cosa que llevarlo a saturación,

si observamos con atención la salida de estos va directo al gate del MOSFET de

PotenciaIRFZ44, si no se requiere la protección contra cortocircuitos pueden quitarla y

conectar el source del IRFZ44 directo a la salida del lado positivo del capacitor

rectificador, después de los diodos tal como muestra la imagen IMG8.

Como se puede observar en la figura, los 12V están conectados a la bobina del

relevador y esta línea continua hacia el colector del transistor. La salida de nuestro

circuito deberá de estar conectada al polo de nuestro relevador normalmente abierto.

Así en un principio cuando no está polarizado nuestro transistor a la salida tendremos

0V.

Una vez que se presiona el push button el transistor se polariza, cerrando el

IMG5: Esquemático completo de la Etapa de Potencia con Protección contra Cortocircuitos

IMG7: Rectificación de Corriente Alterna

IMG8: Etapa de Potencia sin Proteccion contra Cortocircuitos

Funcionamiento:

29/7/2014 Progra, Mecatronica y mas: Control de Temperatura por PWM usando PIC (Pic C CCS)

http://hzsquare.blogspot.com/2011/11/control-de-temperatura-por-pwm-usando.html 12/13

circuito y la bobina del relevador se magnetizará, conmutando hacia el polo

normalmente abierto, por lo cual ahora tendremos un voltaje a la salida de nuestro

circuito.

Al tener un voltaje en la salida este se realimenta hacia la base del transistor

manteniéndolo polarizado, por lo tanto no es necesario mantener presionado el push

button.

Es importante aclarar que la protección contra cortocircuito solo se realiza

después del relevador. Recordando que un cortocircuito sucede en el momento en que

se cierra un circuito sin ninguna resistencia de por medio, es decir conectar la salida de

nuestro circuito directamente a tierra. Observando la ley de Ohm:

I = V / R

Si la resistencia es igual a 0Ω, la corriente se dispararía hacia infinito.

En el momento que esto sucede, conectar la salida directamente a tierra, la

base de nuestro transistor detecta 0V, por lo tanto se despolariza abriendo

nuevamente el circuito e impidiendo que la bobina del relevador continúe magnetizada,

regresando el polo a normalmente cerrada.

Circuito Completo

IMG: Implementando el circuito

29/7/2014 Progra, Mecatronica y mas: Control de Temperatura por PWM usando PIC (Pic C CCS)

http://hzsquare.blogspot.com/2011/11/control-de-temperatura-por-pwm-usando.html 13/13

Combinando ambas etapas obtenemos el circuito completo:

Esquemático del Circuito Comple