Autor Tema: como funciona el DAC del 33fj128?  (Leído 4789 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
como funciona el DAC del 33fj128?
« en: 23 de Mayo de 2011, 22:54:48 »
Hola a todos, estoy haciendo un filtro, y tengo duda de como sacar la señal filtrada, para el ADC le puse sus voltajes de entrada a 5V y -5V para que le pueda meter una senoidal con ciclo positivo y negativo.

ahora mi duda es, como hago para que pueda sacar la misma senoidal por el DAC, no entiendo muy bien como sacar la señal

vi en el datasheet que cada canal tiene 3 salidas, DAC1RM,DAC1RP,DAC1RN, tengo configurado el DAC para que el formato sea un entero no signado.

si le pongo 0 al registro del DAC veria 0V, o veria un valor negativo?

pero no entiendo entre que pines veria la senoidal?, si me pudieran explicar para que son estos 3 pines del DAC.

Espero me aclaren esas dudas.

Muchas gracias de antemano


"Nada es imposible, no si puedes imaginarlo"

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: como funciona el DAC del 33fj128?
« Respuesta #1 en: 24 de Mayo de 2011, 12:09:07 »
Hola! Cuando dices que "le puse sus voltajes de entrada a 5V y -5V" te refieres a Vref+ y Vref-? Si es así posiblemente lo hayas quemado  :? Vref+ puede estar entre AVss + 2.5V y AvddV, y Vref- entre AVss y AVdd-2.5V. La diferencia entre ambos no puede ser mayor a 3.6V y tu le has puesto 10V!


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: como funciona el DAC del 33fj128?
« Respuesta #2 en: 24 de Mayo de 2011, 13:16:36 »
me refiero a Avss y Avdd, en uno puse el negatico y en otro el negativo. pero tengo +3 y -3, dije que 5 por la costumbre de la logica de 5V.

lo que no se es donde podria sacar la señal de "alterna" del dac, entre que pines? DAC1RM,DAC1RP,DAC1RN??
"Nada es imposible, no si puedes imaginarlo"

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: como funciona el DAC del 33fj128?
« Respuesta #3 en: 24 de Mayo de 2011, 13:23:40 »
me refiero a Avss y Avdd, en uno puse el negatico y en otro el negativo. pero tengo +3 y -3, dije que 5 por la costumbre de la logica de 5V.

lo que no se es donde podria sacar la señal de "alterna" del dac, entre que pines? DAC1RM,DAC1RP,DAC1RN??

También, lo quemaste! O paso susto  :mrgreen: Tiene que estar entre Vss-0.3V y Vdd+0.3V. Tabla 30-41 del datasheet o ADC MODULE SPECIFICATIONS

Después según recuerdo, DAC1RM entrega un valor medio, DAC1RP el valor cargado en el DAC y DAC1RN invierte lo de DAC1RP. O sea, trabajando correctamente con la señal de entrada entre 0 y 3.3V como corresponde, puedes transformar esa señal en código en AC quitandole el offset y trabajando con variables signadas.

Saludos!
« Última modificación: 24 de Mayo de 2011, 13:28:28 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: como funciona el DAC del 33fj128?
« Respuesta #4 en: 24 de Mayo de 2011, 13:31:19 »
bueno, probare con otro pic, entonces en cualquier pata puedo medir la señal referecniada a tierra?
"Nada es imposible, no si puedes imaginarlo"

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: como funciona el DAC del 33fj128?
« Respuesta #5 en: 24 de Mayo de 2011, 22:55:07 »
Hola, ya probe de nuevo el DAC, esta es mi configuracion:
Citar
void config_dac()//configuracion del DAC
{
   DAC1CONbits.FORM = 0;      //EL FORMATO ES COMO UN ENTERO NO SIGNADO
   DAC1CONbits.DACFDIV = 0;   //DIVISOR DEL RELOJ POR CERO
   DAC1STATbits.LOEN = 1;      //SE ACTIVAN LAS SALIDAS POSITIVA Y NEGATIVA DEL CANAL IZQUIERDO   
   DAC1STATbits.ROEN = 1;      //SE ACTIVAN LAS SALIDAS POSITIVA Y NEGATIVA DEL CANAL DERECHO
   DAC1CONbits.DACEN = 1;      //SE ACTIVA EL DAC   

}

asi tengo mi configuracion, y dentro del main vario el registro DAC1RDAT, pero no veo ninguna variacion en el pin correspondiente.

me falta configurar algo?
"Nada es imposible, no si puedes imaginarlo"

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: como funciona el DAC del 33fj128?
« Respuesta #6 en: 24 de Mayo de 2011, 23:01:31 »
Dale una leída al manual de referencia del DAC, está bastante completito: http://ww1.microchip.com/downloads/en/DeviceDoc/70211B.pdf


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: como funciona el DAC del 33fj128?
« Respuesta #7 en: 24 de Mayo de 2011, 23:07:45 »
no tenia ese documento, solo habia leido la parte del DAC en el datasheet. gracias, le dare una leida
"Nada es imposible, no si puedes imaginarlo"

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: como funciona el DAC del 33fj128?
« Respuesta #8 en: 24 de Mayo de 2011, 23:14:53 »
En los datasheet de los micros de 16-bits y 32-bits no dice nada, muy poca info, hay que leerse los manuales de referencia. http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2573

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: como funciona el DAC del 33fj128?
« Respuesta #9 en: 24 de Mayo de 2011, 23:20:02 »
pues a leer se ha dicho! muchas gracias por la informacion, pense que el datasheet me daria las respuestas, pero por lo visto no. jeje

"Nada es imposible, no si puedes imaginarlo"

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: como funciona el DAC del 33fj128?
« Respuesta #10 en: 25 de Mayo de 2011, 17:17:04 »
Hola de nuevo, ya estube tratando con el DAC, pero no logro que funcione, conecto mi multimetro entre tierrra y el pin de DAC1RDAT, y siempre me da un voltaje de 1.6 V, adjunto mi codigo por  si me pueden decir en que estoy mal

Citar
#include <p33fj128gp802.h>
#define    FCY      40000000UL                           //SE DEFINE EL FCY, LA VELOCIDAD DE 40MIPS PARA LA LIBRERIA DE RETARDOS
#include <libpic30.h>
#include <dsp.h>
_FOSCSEL(FNOSC_PRIPLL);                                 //SE SELECCIONA EL OSCILADOR PRIMARIO CON PLL
_FOSC(FCKSM_CSDCMD & IOL1WAY_OFF & OSCIOFNC_ON & POSCMD_HS);   //FCKSM_CSDCMD -> SE DESACTIVAN EL RELOG DE SWITCHEO Y EL DE MONITOR
                                                //IOL1WAY_OFF  -> SEDESACTIVA LA CONFIGURACION PARA REMAPEAR LAS ENTRADAS O SALIDAS
                                                //OSCIOFNC_ON  -> LOS PINES DE OSC2 SE USARAN COMO PINES DIGITALES Y NO COMO ENTRADA PARA RELOJ
                                                //POSCCMD_HS   -> SE SELECCIONE UN OSCILADRO DEL TIPO HS(PARA PONER UN CRISTAL DE 10MHz)      
_FWDT(FWDTEN_OFF);                                    //SE DESACTIVA EL WDT
_FGS(GSS_OFF);                                       //SE DESHABILITA LA PROTECCIION DE CODIGO

unsigned int cont=0,yn=0;
int flag=0;

//---------------------------------------------------------
/*RUTINAS DE INTERRUPCION*/
void __attribute__((interrupt, no_auto_psv))_DAC1RInterrupt(void)//FUNCION DE INTERRUPCION DEL DAC, CANAL DERECHO
{
   IFS4bits.DAC1RIF = 0; /* Clear Right Channel Interrupt Flag */

}
void __attribute__((interrupt, no_auto_psv))_DAC1LInterrupt(void)//FUNCION DE INTERRUPCION DEL DAC, CANAL DERECHO
{   
   
   IFS4bits.DAC1LIF = 0; /* Clear Right Channel Interrupt Flag */

}
void __attribute__((__interrupt__,__no_auto_psv__)) _ADC1Interrupt(void)   //funcion de interrupcion DEL ADC
{
   IFS0bits.AD1IF = 0;                                 //SE BORRA LA BANDERA DE INTERRUPCION DEL CONVERTIDOS
   TMR3=0XFFF0;   
   yn=ADC1BUF0;
   DAC1RDAT=yn;
   flag=1;
}
void __attribute__((__interrupt__,__no_auto_psv__)) _T1Interrupt(void)   //funcion de interrupcion DEL TIMER 1
{
   IFS0bits.T1IF=0;                                 //SE BORRA LA BANDERA
   TMR1=0X0000;                                    //SE INICIA EL CONTADOR   
   //AD1CON1bits.SAMP=0;      
   //while(AD1CON1bits.SAMP==0);
   /*cont++;
   if(cont==610)
   {
      if(PORTBbits.RB15==0) LATBbits.LATB15=1;
      else LATBbits.LATB15=0;
      cont=0;
   }*/

}
//-------------------------------------------
/*FUNCIONES DE CONFIGURADCION*/
void config_osc(void)//configuracion de los modulos a usar
{
   //CONFIGURACION DEL RELLOJ PARA QUE TRABAJE A 40MIPS QUE ES LO MAXIMO CON OSC EXTERNO DE 10MHz
   CLKDIVbits.PLLPRE = 0;                              //N1=2 -> 10/2 = 5MHz < 8MHz
   PLLFBDbits.PLLDIV = 30;                              //M=32 -> 5*32 = 160MHz < 200 MHz = FVCO(ESTE SE USA PARA EL DAC)
   CLKDIVbits.PLLPOST = 0;                              //N2=2 -> FOSC = 160/2 = 80MHz
                                                //FOSC=FIN(M/(N1.N2)) = 10(32)/(2*2)=80MHZ --->  FCY=FOSC/2=40MIPS
   
   AD1PCFGL = 0x0000;                                 //SE ESCOGE EL CANAL 0 COMO ANALOGICO Y TODOS LOS DEMAS COMO DIGITALES                                                
   TRISB=0X0000;
}
void config_adc()
{
//CONFIGURACION DEL ADC
   AD1PCFGL = 0x0000;                                 //A)ESCOGER LOS CANALES ANALOGICOS -> SOLO EL PONPCFG0 SERA ANALOGICo
   AD1CON2bits.VCFG = 7;                              //B)SELECCIONAR LOS VOLTAJS DE REFERENCIA; AD1CON2<15:13> -> AVDD - AVSS      
   AD1CON3bits.ADCS = 0X00;                           //C)SE ESCOJE EL RELOJ DE CONVERSION AD AD1CON3<7:0>, CON TAD = TCY
   AD1CON2bits.CHPS = 0;                              //D)SE DETERMINAN CUANTOS S/H CANALES SE USAN AD1CON2<9:8> Y
   //AD1PCFGL<15:0>, SOLO SE USA EL CANAL 0
   AD1CON1bits.SSRC = 2;//aca puedo escoger que sea por timer   //E)SELECCIONAR LA SECUENCIA DE MUESTREO AD1CON1<7:5> Y AD1CON3<12:8> -> el timer 3inicia la conversion
   //AD2CON3bits.SAMC  SOLO SE USA SU EL SSCRC ESTAN EN 111
   AD1CON1bits.FORM = 0;                              //F)SELECCIONAR COMO SE PRESENTAN LOS RESULTADOS DE LA CONVERSION EN EL BUFFER AD1CON1<9:8>, LA SLIDA SERA DEL TIPO INT
   AD1CON1bits.ADON = 1;                              //G)SE ENCIENDE EL CONVERTIDOR
   //configuraciones adicionales
   AD1CON1bits.AD12B = 1;                              //se escoge la configuracion a 12bits   
    AD1CON1bits.ASAM = 1;                              //EL  MUESTREO INICIARA CUANDO SE PONGA EN 1 EL BIT "SAMP"
   AD1CON1bits.SAMP = 0;                              //se limpia el bit de muestreo
   AD1CON1bits.DONE = 0;                              //se limpia el bit de status de la conversion
   AD1CON3bits.ADRC = 0;                              //SE ESCOGE EL RELOJ DERIVADO DEL SISTEMA DEL RELOJ
   AD1CHS0bits.CH0SA = 0;                              //SE ESCOGE AN0 COMO ENTRADA DEL CANAL 0
   IPC3bits.AD1IP = 7;                                 //LE ASIGNO LA PRIORIDAD MAS ALTA A LA INTERRUPCION POR ADC
   IFS0bits.AD1IF = 0;                                 //SE BORRA LA BANDERA DE INTERRUPCION DEL CONVERTIDOS
   IEC0bits.AD1IE = 1;                                 //SE HABILITA LA INTERRUPCION POR ADC*/
   //configuracion del timer 3 para que active la conversion del adc
   T3CONbits.TCS = 0;                                 //EL TIMER FUNCIONA CON EL RELOJ INTERNO FCY      
   T3CONbits.TCKPS = 0;                              //PREESCALA DE 1
   T3CONbits.TGATE = 0;                              //SE DESACTIVA EL GATE POR ACUMULACION
   T3CONbits.TSIDL = 0;                              //EL MODULO CONTINUA SU OPERACION EN MODO IDLE
   T3CONbits.TON = 1;                                 //SE ACTIVA EL TIMER
   TMR3 = 0XFFF0;                                    //SE INICIA EL CONTADOR
   
}
void config_dac()//configuracion del DAC
{
   //me falta cconfigurar el dac
   //EL TIEMPO MAXIMO DE MUESTREO ES DE 100KHz EL TIEMPO SE CALCULA EN BASE AL FVCO
   //DACOSC = FVCO/DACFDIV/256
   PMD3bits.DAC1MD = 0;                              //SE ASEGURA QUE EL ""MODULE DISABLE CONTROL" DEL DAC ESTE EN 0
   DAC1STATbits.LOEN = 1;                              //SE DESACTIVAN LAS SALIDAS POSITIVA Y NEGATIVA DEL CANAL IZQUIERDO   
   DAC1STATbits.ROEN = 1;                              //SE ACTIVAN LAS SALIDAS POSITIVA Y NEGATIVA DEL CANAL DERECHO
   
   ACLKCONbits.SELACLK = 0;                            //SE SELECCIONA EL OSCILADOR PRIMARIOC COMO RELOJ PARA EL DAC   
   ACLKCONbits.ASRCSEL = 1;                            //SE SELECCIONA EL OSCILADOR PRIMARIOC COMO RELOJ PARA EL DAC
   ACLKCONbits.AOSCMD = 0B01;                            //SE SELECCIONA EL OSCILADOR PRIMARIOC COMO RELOJ PARA EL DAC
   DAC1STATbits.RITYPE = 0;                            //INTERRUPCION SI FIFO NO ESTA LLENO EN CANAL DERECHO   
   DAC1STATbits.LITYPE = 0;                           //INTERRUPCION SI FIFO NO ESTA LLENO EN CANAL IZQUIERDO
   DAC1CONbits.AMPON = 0;                              //EL AMPLIFICADOR SE DESACTIVA EN MODO SLEEP
   DAC1CONbits.FORM = 0;                              //EL FORMATO ES COMO UN ENTERO NO SIGNADO
   DAC1CONbits.DACFDIV = 0x06;                           //DIVISOR DEL RELOJ POR CERO, VALOR POR EL QUE SE MULTIPLICA FVCO(ESTE DEBE SER MENOR A 25.6MHz)
   DAC1DFLT = 0X8000;                                 //SE LE DA EL VALOR POR DEFAULT PARA EL VALOR MEDIO
   IFS4bits.DAC1RIF = 0;                              //SE BORRA LA BADERA DE INTERRUPCION POR CANAL DERECHO
   IEC4bits.DAC1RIE = 1;                              //SE ACTIVA LA INTERRUPCION POR CANAL DERECHO
   IFS4bits.DAC1LIF = 0;                              //SE BORRA LA BADERA DE INTERRUPCION POR CANAL DERECHO
   IEC4bits.DAC1LIE = 1;                              //SE ACTIVA LA INTERRUPCION POR CANAL IZQUIERDO
   DAC1CONbits.DACEN = 1;                              //SE ACTIVA EL DAC   

}
void config_T1()
{
//Configuracion del timer1
   T1CONbits.TCS = 0;                                 //EL TIMER FUNCIONA CON EL RELOJ INTERNO FCY      
   T1CONbits.TCKPS = 0;                              //PREESCALA DE 1
   T1CONbits.TGATE = 0;                              //SE DESACTIVA EL GATE POR ACUMULACION
   T1CONbits.TSIDL = 0;                              //EL MODULO CONTINUA SU OPERACION EN MODO IDLE
   T1CONbits.TON = 1;                                 //SE ACTIVA EL TIMER
   TMR1 = 0;                                       //SE INICIA EL CONTADOR
   PR1 = 0XFFFF;
   //Configuracion de la interrupcion por timer 1
   INTCON1bits.NSTDIS = 1;                              //SE DESAHABILITAN LAS INTERRUPCIONES ANIDADAS
   IPC0bits.T1IP = 7;                                 //LE ASIGNO LA PRIORIDAD MAS ALTA A LA INTERRUPCION POR TIMER1
   IFS0bits.T1IF = 0;                                 //SE BORRA LA BANDERA DE INTERRUPCION DEL TIMER1
   IEC0bits.T1IE = 1;                                 //SE HABILITA LA INTERRUPCION POR TIMER 1
}
//--------------------------------
/*FUNCION PRINCIPAL*/
int main(void)
{
   config_osc();
   config_adc();
   config_dac();
   //config_T1();
   while(1)
   {
   };

   
};



el adc si funciona bien, ya lo cheque debuggueando con el pickit, pero el dac no varia el voltaje, veo en el registro del dac1rdat que nunca varia no se porque
"Nada es imposible, no si puedes imaginarlo"


 

anything