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

#1
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!
 

Adjuntos

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

:D:D:D


# 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();
}
}
 
Arriba