Finalmente este es el programa,.. pero no puedo resolver los errores.
# 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 signed b[2]={1,-1};
float e[2], u[2];
//variables ecuacion filtro//
float hn[N]={0.2,0.2,0.2,0.2,0.2};
float xkfir[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 x[],float b[],float y[],int n, float xk)
{
VectorDesplaza(x,N);
VectorDesplaza(y,Nsalida);
x[0]=xk;
y[0]=VectorMult(a+1,y+1,Nsalida-1)+VectorMult(b,x,N);
return y[0];
}
float Filtro (float xkfir[], float ykfir[], float hn[], float adcventrada, int n) //Filtro de media de los ultimos 5 valores
{
VectorDesplaza (xkfir, N);
VectorDesplaza (ykfir, Nsalida);
xkfir[0]=adcventrada;
ykfir[0]=VectorMult(xkfir,hn, Nsalida);
}
float convierte (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 y1=y0+m*(x1-x0);
}
void LoadPWMDuty(float ac)
{
float u;
if(ac>1023)
ac=1023;
if(ac<0)
ac=0;
u=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 _temp;
float _ventrada;
float consigna=ADCBUF0;
float adcventrada=ADCBUF1;
int n;
_temp=convierte(0, 20, 1023, 120, adcventrada);
_ref=convierte(0,0,5,20,consigna);
_ventrada= convierte(0,20,5,120,adcventrada );
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
ek=_ref-_temp;
EcuDif(a,e,b,u,Nsalida,uk); //ecuacion diferencias, salida del dspic
LoadPWMDuty (uk);
}
main()
{
ConfigurarT3(T); // configurar muestreo AD T=2segundos
InitAD(); // Inicia conversión AD
InitPWM(); // Inicia PWM
ADCON1bits.ADON=1;
T3CONbits.TON=1;
while(1){
Idle();
}
}
Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Archivos de programa\Microchip\MPLAB C30\bin\pic30-gcc.exe" -D__dsPIC30F6010__ -c -x c "mplabtest.c" -o"mplabtest.o" -g
mplabtest.c:92: warning: No interrupt vector names defined for unspecified dsPIC30F
mplabtest.c: In function '_T3Interrupt':
mplabtest.c:92: warning: PSV model not specified for '_T3Interrupt';
assuming 'auto_psv' this may affect latency
mplabtest.c: In function '_ADCInterrupt':
mplabtest.c:121: warning: passing argument 3 of 'EcuDif' from incompatible pointer type
mplabtest.c:98: warning: PSV model not specified for '_ADCInterrupt';
assuming 'auto_psv' this may affect latency
Executing: "C:\Archivos de programa\Microchip\MPLAB C30\bin\pic30-gcc.exe" -Wl,"C:\Documents and Settings\Admin\Escritorio\Mplabtest\mplabtest.o",--script="C:\Archivos de programa\Microchip\MPLAB C30\support\dsPIC30F\gld\p30f6010.gld",-L"C:\Archivos de programa\Microchip\MPLAB C30\lib",-o"mplabtest.cof"
C:\Documents and Settings\Admin\Escritorio\Mplabtest\mplabtest.o(.text+0x2fe): In function `main':
C:\Documents and Settings\Admin\Escritorio\Mplabtest\mplabtest.c:135: undefined reference to `ConfigurarT3'
C:\Documents and Settings\Admin\Escritorio\Mplabtest\mplabtest.o(.text+0x300):C:\Documents and Settings\Admin\Escritorio\Mplabtest\mplabtest.c:136: undefined reference to `InitAD'
C:\Documents and Settings\Admin\Escritorio\Mplabtest\mplabtest.o(.text+0x302):C:\Documents and Settings\Admin\Escritorio\Mplabtest\mplabtest.c:137: undefined reference to `InitPWM'
BUILD FAILED: Fri Sep 26 12:19:17 2008