TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: borre4 en 06 de Diciembre de 2011, 22:56:56

Título: Ajuste ADC dspic30F4011
Publicado por: borre4 en 06 de Diciembre de 2011, 22:56:56
Hola, buen dia, primero que nada felicidades por el foro. Soy nuevo aqui y tengo una pregunta relacionada a un proyecto que estoy haciendo con el dspic30F4011.
Por el momento solo estoy haciendo la prueba del ADC para ajustar un PWM entre 0 y 3ms y muestro la lectura del ADC en un LCD pero la lectura del ADC siempre
esta cambiando aun cuando el pot esta inmovil y no se cual sea el problema, ya configure el modo de maxima velocidad de muestreo que indica el datasheet respetando minimos de tiempos en Tad y todo lo demas pero a lo mejor estoy dejando por ahi un clavo suelto AAAAAAAAAAA jeje.

Otra pregunta que tengo es que si en #use delay(clock=4000000) eesta bien el valor de 4M aunque tenga PLL16 o debe ser 64M, uso un cristal de 4M

De ante mano muchas gracias

PD: el codigo esta en CCS

Código: [Seleccionar]

#include <30F4011.h>           //EJEMPLO PWM
#device adc=10
#include <math.h>

#FUSES XT_PLL16   //XT Crystal Oscillator mode with 16X PLL
#FUSES PR   //Primary Oscillator
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOPROTECT   //Code not protected from reading
#FUSES NOWDT   //No Watch Dog Timer
#FUSES MCLR  // Master Clear pin enabled

#use delay(clock=4000000)

#define LCD_ENABLE_PIN  PIN_D0                                    ////
#define LCD_RS_PIN      PIN_D2                                    ////
#define LCD_RW_PIN      PIN_D3                                    ////
#define LCD_DATA4       PIN_F1                                    ////
#define LCD_DATA5       PIN_F4                                    ////
#define LCD_DATA6       PIN_F5                                    ////
#define LCD_DATA7       PIN_F6

#include <lcd.c>

#define ADC_CLOCK_INTERNAL 0x0184

int16 p1;
float a;
unsigned int16 duty;

void main()
{  
  
setup_timer1(TMR_DISABLED);
setup_timer2(TMR_INTERNAL | TMR_DIV_BY_8,0xABDF); //periodo de 22ms para servos
setup_compare(2, COMPARE_PWM | COMPARE_TIMER2);
setup_adc_ports(sAN0|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
#asm
mov #0x80E4,w4;
mov w4,0x02A0;
mov #0x0100,w4;
mov w4,0x02A2;
#endasm      
;
setup_spi(FALSE);

//set_tris_B(0x01);
set_tris_D(0x00);
set_tris_F(0x00);

lcd_init();
int i=0;

set_adc_channel(0); // pot 1K
delay_us(10);
while(i==0){

p1=read_adc();
a= (93.75 * p1 / 1023.0);
duty=a * (int16)64;

set_pwm_duty(2,duty);  

lcd_gotoxy(1,1);
printf(lcd_putc,"p1=%4ld",p1); // u,4ld,f
lcd_gotoxy(1,2);
printf(lcd_putc,"duty ms=%4ld",duty);

delay_ms(1);

}
}
Título: Re: Ajuste ADC dspic30F4011
Publicado por: Suky en 06 de Diciembre de 2011, 23:22:04
Hola! Si colocas el PLL a x16, en #use delay(...) debes colocar 64M. Luego, si dices que configuras el Tad según datasheet, y esperas el tiempo de adquisición también según datasheet una posible causa de oscilación es que la impedancia de la señal AC no es la adecuada. No se en un dsPIC30F, pero seguro tiene que ser inferior a 2.5k

Luego, la prueba la realizas sobre una placa impresa o en un protoboard?


Saludos!
Título: Re: Ajuste ADC dspic30F4011
Publicado por: borre4 en 07 de Diciembre de 2011, 02:06:46
Hola Suky gracias por responder, esta conectado un pot de 1k, porque la resistencia maxima es de 5k . Tambien tengo un capacitor de .1uF de ADC a tierra
pero no cambia mucho la respuesta con el.

La prueba la estoy haciendo en un proto pero al hacer la prueba con solo el cristal de 4M y # fuses como XT, sin PLL me hace lo mismo. Alguna otra idea de lo que pueda hacer? Gracias

Saludos
Título: Re: Ajuste ADC dspic30F4011
Publicado por: fram_22 en 07 de Diciembre de 2011, 12:52:21
Tambien checa a  que voltajes estas fijando las referencias de ADC. Si esos pines tiene ruido, tu captura no sera buena
Título: Re: Ajuste ADC dspic30F4011
Publicado por: borre4 en 07 de Diciembre de 2011, 14:07:13
Hola fram las referencias estan a VDD-VSS con un capacitor de 100nF entre ellos.

Es recomendable alimentar por separado las lineas de AVDD y AVSS y de ahi tomar la alimentacion para el pot??

Saludos
Título: Re: Ajuste ADC dspic30F4011
Publicado por: fram_22 en 07 de Diciembre de 2011, 18:33:36
Hola:

Si tu velocidad de muestreo es mayor a 500 ksps ,debes utilizar pines externos para Vref+ y Vref-.
Avdd y Avss van alimentados a la misma fuente, lo que puedes hacer es tratar de rutearlos del modo mas directo a la fuente.
Te anexo un esquematico que tome del dsPIC30F family reference manual. Ahi viene informacion mas detallada.

Espero te sirva de algo.

Recuerda que los capacitores deben tener baja ESR (baja resistencia).
Título: Re: Ajuste ADC dspic30F4011
Publicado por: borre4 en 07 de Diciembre de 2011, 18:51:55
Hola,

La configuracion es para hacer el muestreo con una velocidad de 500ksps, pero tengo 2 preguntas:

1.- Si quiero configurar la velocidad a 1Msps la resistencia maxima permitida cambia a 500 ohms (antes max 5K) ahora tengo que seleccionar los voltajes de referencia Vref- y + pero esos son definidos en el ADCON2 (VCFG) o tienen que ser los pines B0 y B1?? Porque ahi tambien esta el pin analogico AN0 que estoy utilizando para adquirir la señal.

2.-Tengo que seleccionar la resistencia maxima en el ANx por ejemplo para mi caso de 500ksps es de 5k o da igual si tengo un pot de 1k conectado a la entrada?

Saludos
Título: Re: Ajuste ADC dspic30F4011
Publicado por: fram_22 en 08 de Diciembre de 2011, 13:21:41
1.- Si quiero configurar la velocidad a 1Msps la resistencia maxima permitida cambia a 500 ohms (antes max 5K) ahora tengo que seleccionar los voltajes de referencia Vref- y + pero esos son definidos en el ADCON2 (VCFG) o tienen que ser los pines B0 y B1?? Porque ahi tambien esta el pin analogico AN0 que estoy utilizando para adquirir la señal.
Saludos
Generalmente Vref+ y Vref- esta compartidos con otros pines anlógicos. Esto varia de dispositivo a dispositivo pero es comun que sean AN0 y AN1. En ese caso tendras que utilizar otro pin para la lectura de la señal porque estos estaran ocupados en al referencia.

2.-Tengo que seleccionar la resistencia maxima en el ANx por ejemplo para mi caso de 500ksps es de 5k o da igual si tengo un pot de 1k conectado a la entrada?
Saludos

Con que el valor de la resistencia sea inferior a la resistencia maxima esta bien. Yo en lo personal te recomendaria agregar un segidor de voltaje (con un amp op) ya que estos suelen tener una impedancia de salida baja.
Título: Re: Ajuste ADC dspic30F4011
Publicado por: borre4 en 08 de Diciembre de 2011, 13:38:56
Hola,

Gracias por las respuestas, por el momeno estoy revisando el cogido referido a la configuracion del ADC porque encontre unos detalles sobre seleccionar

ADC_CLOCK_INTERNAL
o
ADC_CLOCK_DIV_2|ADC_TAD_MUL_2

estoy viendo el codigo que genera en asm para comparar con datasheet y ver si es ahi donde esta el problema porque cuando conecto el voltimetro para leer
la entrada del analogico no tengo caidas de tension.

Saludos
Título: Re: Ajuste ADC dspic30F4011
Publicado por: borre4 en 08 de Diciembre de 2011, 16:53:03
Hola,

Alguien me podria explicar que significan los capacitores C8-C3 o donde es que los tengo que colocar

De ante mano gracias.

Saludos
(http://)
Título: Re: Ajuste ADC dspic30F4011
Publicado por: fram_22 en 08 de Diciembre de 2011, 18:33:34
son capacitores de desacople. Se utlizan para filtrar la alimentacion, estos se pondrian en las patas de alimentacion del dsPIC, deben estar entre el dsPIC y la alimentacio. Deben estar lo mas cercano posible al dspic.
Título: Re: Ajuste ADC dspic30F4011
Publicado por: borre4 en 08 de Diciembre de 2011, 18:46:24
Y se tienen que colocar todos al mismo tiempo?? o como selecciono cuales necesito??. Por el momento tengo 1 capacitor de 100nF entre VDD y VSS y otro capacitor de 100nF entre AN0 y VSS.

Se tiene que colocar 1 capacitor de por cada par de alimentacion, es decir por cada VSS y VDD o con 1 solo capacitor es suficiente? Gracias

Saludos
Título: Re: Ajuste ADC dspic30F4011
Publicado por: MerLiNz en 08 de Diciembre de 2011, 19:13:29
tienes que conectar 1 condensador por cada entrada de alimentacion, alimentacion analogica (avdd), y usb en caso de que tenga, ademas de otro mas importante aun, un condensador en vcap y vss, creo que era de 10uf. En el datasheet te viene los valores y caracteristicas minimas de alimentacion.
Título: Re: Ajuste ADC dspic30F4011
Publicado por: borre4 en 08 de Diciembre de 2011, 19:29:32

Hola, buen dia

Citar
un condensador en vcap y vss, creo que era de 10uf.

No veo ningun Vcap en el datasheet, sera que el dspic 30F4011 no tiene o cual es Vcap?  je

.....

A lo mejor estoy confundiendo pero en el datasheet no encuentro ningun Tacq ni en los manuales de referencia de la familia 30F, y yo lo consierede como Tsamp, estoy en lo correcto??

Gracias
Título: Re: Ajuste ADC dspic30F4011
Publicado por: MerLiNz en 08 de Diciembre de 2011, 20:04:37
tienes razon, este no lleva vcap, estoy acostumbrado a ver hasta los nuevos de 8bits con vcap asiq pense que este al ser pic30 ya lo tenia tambien, pero se ve que no.

el tacq es el tiempo de adquisicion, en el apartado 20.8 puedes ver la descripcion de este, requisitos... Este tiempo depende de la impedancia de la fuente, leete el apartado y comprenderas mas.
Título: Re: Ajuste ADC dspic30F4011
Publicado por: borre4 en 08 de Diciembre de 2011, 20:48:01
Hola,

el apartado 20.8 menciona la resistencia maxima RSS=5K para no sobrepasar la impedancia, pero en la configuracion automatica menciona que se necesita considerar el tiempo suficiente de adquisicion o al menos asi yo lo entiendo pero no dice cuanto es. ? o como se calcula el tacq para esta familia 30F?

Encontre este ejemplo del 30F4013 (yo manejo el 30F4011) donde menciona el tacq de 1tad cuando se cumple SSRC<2:0> = 111 and SAMC<4:0> = 00001 pero no se si se cumpla lo mismo para el 4011.

asi lo tengo ya configurado y con un pot de 1K en la entrada analogica respetando un tad minimo de 154ns para trabajar hasta 500 ksps y con todas las Vdd conectadas a Vss con un capacitor de 100nF pero sigue oscilando la entrada.
Título: Re: Ajuste ADC dspic30F4011
Publicado por: borre4 en 09 de Diciembre de 2011, 20:22:44
despues de revisar varios parametros el Tad minimo 154ns, mi cristal de 4MHz con PLL16 , tenemos una frecuencia de 64Mhz y trabajamos a 16MIPS y en relacion a la formula

TAD = TCY * (0.5 * (ADCS<5:0> + 1))

Asigno el valor de 4 a ADCS<5:0> para respetar el Tad minimo. Al mismo tiempo mencionan que TSamp minimo es de 1 Tad por lo cual en el programa colocamos las siguientes lineas despues de la libreria del lcd

Código: [Seleccionar]
#define ADC_CLOCK_DIV_5    0x0004
#define ADC_TAD_MUL_1      0x0100

y cambiamos la configuracion del adc por:

Código: [Seleccionar]
setup_adc(ADC_CLOCK_DIV_5|ADC_TAD_MUL_1); //  
lo cual nos da como resultado en asm como:

registro ADCON3 (2A4)=104
registro ADCON2 (2A2)=0
registro ADCON1 (2A0)=80E0

Y asi se cumple SSRC<2:0> = 111 and SAMC<4:0> = 00001 para trabajar a la maxima velocidad de muestreo.....pero sorpresa la lectura sigue oscilando  :(

O estoy haciendo la configuracion incompleta?? Tambien ya probe modificando el Tsamp por 2,4,8,16 y es lo mismo  :? como si no afectara en lo absoluto
Título: Re: Ajuste ADC dspic30F4011
Publicado por: fram_22 en 10 de Diciembre de 2011, 17:10:34
que tan grande es la oscilacion que se presenta?
Título: Re: Ajuste ADC dspic30F4011
Publicado por: borre4 en 11 de Diciembre de 2011, 17:23:55
Hola,

Pues la ultima cifra de la lectura practicamente nunca se estabiliza,es decir que si tenemos un voltaje de 2.5 en la entrada analogica, el valor deberia marcar 512 en teoria pero solo el 5 y el 1 estan fijos y el valor de las unidades nunca es fijo siempre esta cambiando en un rango entre 2 y 4 unidades lo cual no deberia estar pasando....

La pregunta es, si estoy configurando bien el ADC??  :?
Título: Re: Ajuste ADC dspic30F4011
Publicado por: MerLiNz en 11 de Diciembre de 2011, 19:54:29
yo creo que es normal esa oscilacion, estamos hablando de que oscila entre 10-20mv, eso puede ser ruido, puedes poner un esquema electrico?
Título: Re: Ajuste ADC dspic30F4011
Publicado por: borre4 en 11 de Diciembre de 2011, 20:40:55
Hola que tal, adjunto el esquema que estoy utilizando. Como nota, es un dspic30F4011 pero la version de proteus no lo maneja asi que lo coloque en un 16f877 pero es basicamente como esta armado. Tengo un 2do pot en AN1 y esta conectado exactamente igual que el pot de AN0. Por ahora solo leo las entradas analogicas para mostrarlas en el lcd asi como su resta(AN0-AN1).

Todas las Vdd y la AVdd estan conectadas a Vss por medio de un capacitor de 100nF lo mas pegados al dspic. Alguna otra recomendacion?? Gracias

Necesito que esa lectura sea lo mas precisa que se pueda sin oscilaciones . Tambien pongo el codigo que tengo para ver si es que algo anda mal por ahi jee

Código: [Seleccionar]

#include <30F4011.h>           //EJEMPLO PWM
#device adc=10
#include <math.h>

#FUSES XT_PLL16   //XT Crystal Oscillator mode with 16X PLL
#FUSES PR   //Primary Oscillator
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOPROTECT   //Code not protected from reading
#FUSES NOWDT   //No Watch Dog Timer
#FUSES MCLR  // Master Clear pin enabled

#use delay(clock=64000000)

#define LCD_ENABLE_PIN  PIN_D0                                    ////
#define LCD_RS_PIN      PIN_D2                                    ////
#define LCD_RW_PIN      PIN_D3                                    ////
#define LCD_DATA4       PIN_F1                                    ////
#define LCD_DATA5       PIN_F4                                    ////
#define LCD_DATA6       PIN_F5                                    ////
#define LCD_DATA7       PIN_F6

#include <lcd.c>

#define ADC_CLOCK_DIV_5    0x0004
#define ADC_TAD_MUL_1      0x0100
#define ADC_TAD_MUL_5      0x0500

int16 p1,p2,p3;
float a;
unsigned int16 duty;

void main()



setup_timer1(TMR_DISABLED);
setup_timer3(TMR_DISABLED);
setup_timer2(TMR_INTERNAL | TMR_DIV_BY_8,0xABDF); //periodo de 22ms para servos
setup_compare(2, COMPARE_PWM | COMPARE_TIMER2);
setup_adc_ports(sAN0|sAN1|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_5|ADC_TAD_MUL_1); //  |ADC_TAD_MUL_2 INTERNAL DIV_4


set_tris_D(0x00);
set_tris_F(0x00);

lcd_init();
int i=0;

while(i==0){

set_adc_channel(0); // pot1 1k
delay_us(2);
p3=read_adc();
//a= (93.75 * p1 / 1023.0);
//duty=a * (int16)64;

delay_us(3); //entre lectura de canales

set_adc_channel(1); // pot2 1K
delay_us(2);
p2=read_adc();

p1=p3-p2;

/*if(p1>0 && p1<=205){
duty=(int16)2980;}
else if(p1>205 && p1<=410) {
duty=(int16)3083.5;}
else if(p1>410 && p1<=614) {
duty=(int16)3187;}
else if(p1>614 && p1<=820) {
duty=(int16)3290.5;}
else if(p1>820 || p1<0) {
duty=(int16)3394;} */

//set_pwm_duty(2,duty);   

lcd_gotoxy(1,1);
printf(lcd_putc,"p3=%4ld p2=%4ld",p3,p2); // u,4ld,f
lcd_gotoxy(1,2);
printf(lcd_putc,"resta=%4ld",p1); //"duty ms=%4ld",duty

delay_ms(10);

}
}
Título: Re: Ajuste ADC dspic30F4011
Publicado por: MerLiNz en 11 de Diciembre de 2011, 20:48:01
el proteus te lo emula bien no? o te da las oscilaciones en el proteus??

Si te oscila en la realidad seria lo correcto, los potenciometros tienen un % de error, la temperatura les afecta, humedad, ruidos... Vamos que no puedes conseguir un voltaje estable con un potenciometro.
Título: Re: Ajuste ADC dspic30F4011
Publicado por: borre4 en 11 de Diciembre de 2011, 20:52:43
En proteus no se puede simular porque no tiene dspic de la familia 30F solo algunos de la 33F.

Tambien creo que pueden ser los potenciometros, mañana tratare con pots lineales porque no tengo a la mano por el momento. Tambien otro detalle que veo es que cuando cambio la resistencia de un solo pot la lectura del otro pot cambia en unas 4-6 unidades  :shock:
Título: Re: Ajuste ADC dspic30F4011
Publicado por: MerLiNz en 12 de Diciembre de 2011, 10:49:18
si, piensa que las resistencias normales tienen un 5% de error, ademas la temperatura tambien les influye, las hay de 1% quizas con esas te de menos.

Una buena prueba que puedes hacer es colocar un polimetro en la salida del pot, si es un polimetro de precision veras que si varia la tension, con esto ya sabes que el problema es de margen de error y no de tu programa.
Título: Re: Ajuste ADC dspic30F4011
Publicado por: fram_22 en 12 de Diciembre de 2011, 12:27:33
Hola:

Otra forma de descartar el ruido es que pongas un zener de 2.5 V. Este regula el voltaje y el ruido deberia ser mucho meno que con el pot.
Título: Re: Ajuste ADC dspic30F4011
Publicado por: borre4 en 13 de Diciembre de 2011, 14:10:17
Citar
Publicado por: MerLiNz
Insertar Cita
si, piensa que las resistencias normales tienen un 5% de error, ademas la temperatura tambien les influye, las hay de 1% quizas con esas te de menos.

Una buena prueba que puedes hacer es colocar un polimetro en la salida del pot, si es un polimetro de precision veras que si varia la tension, con esto ya sabes que el problema es de margen de error y no de tu programa.

Hola merlinz ya probe con el multimetro a la entrada del analogico y si varia algo el voltaje es minimo, entre 0.0001 y.0008 volts aunque viendolo detalladamente si me puede afectar ya que a la entrada tengo 5 volts y con 10 bits tengo una unidad cada 0.0048828125 volts

Citar
Publicado por: fram_22
Insertar Cita
Hola:

Otra forma de descartar el ruido es que pongas un zener de 2.5 V. Este regula el voltaje y el ruido deberia ser mucho meno que con el pot.

Hola fram me podrias decir en donde conectar el zener?. Va conectado a Vdd desde AN0 asi como el capacitor de 100nF a VSS? Se tiene que sustituir el pot o es un complemento. Gracias
Título: Re: Ajuste ADC dspic30F4011
Publicado por: fram_22 en 13 de Diciembre de 2011, 23:11:08


Hola fram me podrias decir en donde conectar el zener?. Va conectado a Vdd desde AN0 asi como el capacitor de 100nF a VSS? Se tiene que sustituir el pot o es un complemento. Gracias

Checa el esquema que te anexo. El valor de la resistencia es para limitar la corriente del zener, esta dependera de la potencia del mismo.
Título: Re: Ajuste ADC dspic30F4011
Publicado por: borre4 en 14 de Diciembre de 2011, 00:27:30
hola,

intentare lo del zener gracias
Título: Re: Ajuste ADC dspic30F4011
Publicado por: fram_22 en 14 de Diciembre de 2011, 00:47:29
ok espero sirva de algo!
Título: Re: Ajuste ADC dspic30F4011
Publicado por: Alber_pic en 04 de Enero de 2014, 07:11:16

Hola , este post es de hace unos años pero no veo como acaba el asunto de la oscilación.

He tenido ese problema hace pocos dias. En mi caso la oscilación( muy pequeña, 1 o 2 bit sobre 10bit)  coincidia con la frecuencia del cuarzo.

Tengo un pin (PWM) con una F = 10khz. que ataca un transmisor y la frecuencia de salida del TX tiene residuos de la F del cristal.

No lo tengo resuelto aún pero supongo que si coloco unas resistencias y unos condensadores a modo de filtro pasa bajos algo debe filtrar.

Como no sabia como solucionarlo hice una rutina que en lugar de guardar y manipular un solo valor del ADC lo hacia con dos valores : ADC_max y ADC_min y con eso me fuí apañando.

Saludos