# Control de la temperatura de un horno en lenguaje C sobre dsPIC



## learnelectronic (Sep 23, 2008)

Hola compis! Porfin encuentro un foro que quizas pueda ayudarme y resolver unas dudas, puesto que se muy poco de programacion y necesito implementar el control en lazo cerrado de un sistema en lenguaje C sobre dsPIC.

El sistema trata de controlar la temperatura de un horno, calentandolo mediante un resistencia y obteniendo su temperatura mediante una sonda.

 La resistencia de calentamiento se activa mediante una señal PWM que gobierna un amplificador/generador de corriente, segun la relacion:
 0Amperios=0%duty
20Amperios=100%duty.

La sonda de temperatura se comporta como una resistencia variable en funcion de la temperatura, segun una cierta relacion.

Debido al ruido de este sensor se decide aplicar a la medida de temperatura un filtro digital de media, utilizando los 5valores mas recientes de la señal.

La consigna de temperatura se genera mediante un potenciometro, correspondiendo el minimo del mismo a una consigna de 20ºC y el maximo a una consigna de 120º.
La señal analogica de referencia y la señal analogica del sensor se muestrean con un periodo de 2segundos.

GRacias a quien pueda ayudarme aunq sea un minimo! SOlo necesito pistas para poder arrancar, ayundenme!


----------



## learnelectronic (Sep 25, 2008)

Lo he resuelto, no esta perfecto, pero si alguien entiende que me ayude a corregirlo. Gracias a todooooos por leerme!




# include <p30f6010.h>

# define T 2  //periodo de muestreo para las señales analogicas//
# define N 5
# define Nsalida 5


float _ref;
float _temp;
int Vcc=10;
int R1=100;

//variables ecuacion en diferencias del regulador//
float ek;
float ek1=0;
float uk;
float uk1=0;
float a[2]={0.51, 0.5};
int b[2]={1,-1};


//variables ecuacion filtro//
float hn[N]={0.2,0.2,0.2,0.2,0.2}
float xk[N];
float ykfir[Nsalida];

//Funciones para implementacion de la ecuacion de diferencias//

void VectorCero(float x[],int n)
{
	int i;
	for(i=0;i<n;i++)
		x_=0.0;
}

void VectorDesplaza(float x[],int n)
{
	int i;
	for(i=n-1;i>0;i--)
		x=x[i-1];
}

float VectorMult(float b[],float u[],int n)
{
	int i;
	float yk;
	for(i=0;i<n;i++)
		yk+=b*u;
	return yk;
}

float EcuDif(float a[],float u[],float b[],float y[],int n)
{
	VectorDesplaza(u,n);
	VectorDesplaza(y,n);
	uk[0]=uk;
	yk[0]=VectorMult(a+1,y+1,n-1)+VectorMult(b,u,n);
	return y[0];
}

float Filtro (float xk[], ykfir[], float hn[], float _temp)	//Filtro de media de los ultimos 5 valores
{
	VectorDesplaza (xk);
	VectorDesplaza (ykfir);
	xk[0]=_temp;
	ykfir[0]=VectorMult(xk,hn);
}


float convierteseñal (float x0, float y0, float x1, float y1, float x)   // graficas lineales, uso la expresion de la pendiente
{
	float m;
	m= ( y1 -y0)/(x1-x0);
	return yo+m*(x-x0)
}




void LoadPWMDuty(float ac)
{
	if(ac>1023)
		ac=1023;
	if(ac<0)
		ac=0;
	uk=ac*10/1023-5;
}


void _ISR _T3Interrupt(void)
{
	IFS0bits.T3IF=0;				// limpiar bandera interrupción
	ADCON1bits.ASAM=1;				// iniciar conversión
}

void _ISR _ADCInterrupt()
{
	float RPT100;

	float _ventrada;
	float _temp;

	float adcventrada;


	adcventrada=ADCBUF1;

	_ventrada=convierte(0, 0, 1023, 5, adcentrada);
	_temp=convierte(0, 20, 1023, 120, adcentrada);



	IFS0bits.ADIF=0;   //limpo bandera
	ADCON1bits.ASAM=0;  //detengo muestreo



	RPT100=(Vcc*R1/_ventrada)-R1;	//calculo el valor de RPT100
	_temp=(RPT100-R1)/40;		//calculo el valor de la temperatura

	Uk=_ref-_temp;			
	EcuDif(a,ek,b,ek1,uk, uk1);	//ecuacion en diferencias para la salida del dspic

	ykfir[]= Filtro (float xk[], float hn[], float _temp)

	LoadPWMDuty ();


}




main()
{
	VectorCero (ykfir, Nsalida);
	VectorCero (yk, Nsalida);
	VectorCero (uk, Nsalida);
	ConfigurarT3(T);		// configurar muestreo AD T=2segundos
	InitAD();			// Inicia conversión AD
	InitPWM();			// Inicia PWM
	ADCON1bits.ADON=1;
	T3CONbits.TON=1;
	while(1){

		Idle();
	}
}_


----------



## piratex (Mar 28, 2009)

Buen trabajo, una consulta ¿Que compilador estas utilizando? ¿Que oscilador y configuracion de este estas usando?


----------



## learnelectronic (Mar 29, 2009)

trabaje con el mplab, la frec del oscilador no recuerdo exactamente, pero creo q puse 780Hz


----------

