control de temperatura por pwm usando pic (pic c ccs)
TRANSCRIPT
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