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
13
Embed
Control de Temperatura Por PWM Usando PIC (Pic C CCS)
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
29/7/2014 Progra, Mecatronica y mas: Control de Temperatura por PWM usando PIC (Pic C CCS)
/*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
//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)
{ 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)