TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: rivale 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
-
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!
-
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??
-
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!
-
bueno, probare con otro pic, entonces en cualquier pata puedo medir la señal referecniada a tierra?
-
Hola, ya probe de nuevo el DAC, esta es mi configuracion:
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?
-
Dale una leída al manual de referencia del DAC, está bastante completito: http://ww1.microchip.com/downloads/en/DeviceDoc/70211B.pdf
Saludos!
-
no tenia ese documento, solo habia leido la parte del DAC en el datasheet. gracias, le dare una leida
-
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!
-
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
-
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
#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