filtro

download filtro

If you can't read please download the document

Transcript of filtro

#include // Incluye la libreria del dsPIC30F4013. _FOSC(CSW_FSCM_OFF & XT_PLL16); // Usamos oscilador // externo de 7.3728 MHZ, // multiplicado por 16, obtenindo un // reloj interno a 117.9648 MHZ. _FWDT(WDT_OFF); // Watchdog timer disabled._FBORPOR(PBOR_OFF & MCLR_EN); // Brown-out reset disabled, // MCLR reset enabled._FGS(CODE_PROT_OFF); float VIK,VIK1,VIK2,VOK,VOK1,VOK2; // Variables de entrada y salida.float COEF1,COEF2,COEF3,COEF4,COEF5; // Constantes asociadas a la ecuacin en difernecias.float TEMP1,TEMP2,TEMP3,TEMP4,TEMP5; // Manejo temporal del datos. unsigned int Vobin8; unsigned int Vobin;unsigned int Dato;float factor1; /////////////////////////////////////////////////////////////////////////////////////// RUTINA PARA INICIALIZAR EL CONVETIDOR ANALGICO-DIGITAL CON "AN8" COMO ENTRADA. /////////////////////////////////////////////////////////////////////////////////////// void ADC12_INI(){ ADCON1=0x0000; // FORM=0 dato es entero sin signo // ASAM=0 (inicia muestreo cuando este bit // sea habilitado). ADCHS=0x0008; // canal de entrada es PB8/AN8. ADCON3=0x0008; // Muestreo manual con reloj interno = 8 TCY. 152.586ns ADCON2=0x0000; ADCON1bits.ADON=1; // convertidor A/D on} //////////////////////////////////////////////////////////////////////// RUTINA PARA TRANSMITIR POR EL CONVERTIDOR D/A LA Vo(k) OBTENIDA. ////////////////////////////////////////////////////////////////////////void Transmite(void){ Vobin=12.8*(VOK+10); Vobin8=(Vobin>>2); LATB=Vobin8; //Entregamos al puerto B el dato que ira al DAC } main(){ ADPCFG=0XFEFF; // Puerto B (RB0-RB7) estn // estn en modo digital, con excepcin del bit RB8 que // esta en modo analgico Vi(k) // ADC12_INI(); // Inicializa el convertidor A/D. TRISBbits.TRISB0=0; TRISBbits.TRISB1=0; TRISBbits.TRISB2=0; TRISBbits.TRISB3=0; TRISBbits.TRISB4=0; TRISBbits.TRISB5=0; TRISBbits.TRISB6=0; TRISBbits.TRISB7=0; TRISBbits.TRISB8=1; // Configura el bit RB8 como entrada para poder leer el // canal AN0 del convertidor A/D /* Condiciones Iniciales del Filtro */ VIK = 0.0; // Vi(k) = 0.0 VIK1 = 0.0; // Vi(k-1) = 0.0 VIK2 = 0.0; // Vi(k-2) = 0.0 VOK = 0.0; // Vo(k) = 0.0 VOK1 = 0.0; // Vo(k-1) = 0.0 VOK2 = 0.0; // Vo(k-2) = 0.0 /* Declaracion de Coeficientes de la Ecuacion en Diferencias */ COEF1 = 0.7157374; COEF2 = 1.4314748; COEF3 = 0.7157374; COEF4 = 1.3489677; COEF5 = 0.5139818; factor1=.078431372; //y[n]=0.7157374*x[n]+1.4315748*x[n-1]+0.7157374*x[n-2]-1.348967*y[n-1]-0.5139818*y[n-2] /* Inicio de un Loop infinito. */ for(;;) { ADCON1bits.SAMP=1; // Inicia muestreo del A/D. Delay_1us(); // Tiempo para que se valide el muestreo ADCON1bits.SAMP=0; // Empieza la conversin while(!ADCON1bits.DONE); // Acabo la conversin A/D? Dato=ADCBUF0; // Lee el convertidor A/Dy lo almacena en la variable dato. VIK=(factor1*Dato)-10; //Convertimos a [V] /* Armado de la ecuacin en diferencias */ TEMP1=COEF1*VIK; TEMP2=COEF2*VIK1; TEMP3=COEF3*VIK2; TEMP4=COEF4*VOK1; TEMP5=COEF5*VOK2; VOK=TEMP1+TEMP2+TEMP3-TEMP4-TEMP5; Transmite(); // Transmite Dato por el convertidor D/A // Actualizacin de entradas y salidas para la prxima iteracin. VIK2=VIK1; // Vi(k-1)------------>Vi(k-2) VIK1=VIK; // Vi(k)-------------->Vi(k-1) VOK2=VOK1; // Vo(k-1)------------>Vo(k-2) VOK1=VOK; // Vo(k)-------------->Vo(k-1) Delay_50us(); }}