TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: modelo75 en 23 de Marzo de 2005, 10:27:00
-
Hola
Estoy trabajando con el A/D en 10 bit de un 16f876, segun entiendo esto me da 1024 valores entre 0 y 5V. Mi problema es medir una tension que varia entre 2.5v y 3.5v. Para utilizar los 1024 valores tendria que utilizar la Vref, es asi?? Ahora el pin Vref+ tendria que tener 3.5v y el vref- 2.5V?? Si utilizo el canal 0, entonces como seria la configuracion:
setup_adc_ports(RA0_ANALOG,RA3_RA2_REF); ???
cualquier ayuda es bienvenida
gracias
-
Efectivamente, para tener mayor precisión puedes usar las tensiones de referencia +Vref y -Vref de 3,5v y 2,5v respectivamente.
Si lo haces de esta manera, te recomiendo que uses reguladores de referencia tipo ref02 para que la conversión sea precisa y no te generen problemas de ruido los bites de menos peso.
Suerte!
-
Por cierto, del código: setup_adc_ports(RA0_ANALOG,RA3_RA2_REF); no tengo ni idea, pues supongo que es ccs y no uso ese programa.
-
Cuidado con las tensiones del conversor. Se necesita un voltage minimo, en la serie pic18F suele ser 3 voltios, por debajo de ahi no funciona, miralo en le datasheet del micro


-
Primero gracias por la colaboracion,
ahora si, en el PDF (pag. 194) da los valores de Vref (min 2.0 max vdd+.3v), por lo que creo que no hay problema(mi medicion varia entre 2.8v y 3.2v). Pero lo estoy simulando con proteus y no esta midiendo correctamente. Con un pin estoy alimentando un circuito RC, y al cabo de un tiempo (1.73ms) mido cuanto se cargo el capacitor con el A/D. Puede tener algun problema de simulacion Proteus o tengo mal config. el tiempo del A/D. Si alguien me puede aclarar el tema de tiempo de conversion, tpo minimo, DV_2,DIV_8?? y como se configura, agradecido.
Algo de codigo:
#include <16F876.h>
#device adc=10
#use delay(clock=4000000)
#fuses HS,WDT
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,restart_wdt)
#define conv PIN_C1
long value;
void init()
{
setup_adc_ports(RA0_RA1_ANALOG_RA3_RA2_REF );
set_adc_channel( 0 );
setup_adc(ADC_CLOCK_DIV_8);
setup_spi(FALSE);
setup_counters(RTCC_INTERNAL,WDT_18MS);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
set_tris_a(0b001111);
set_tris_c(0b11001101);
output_low(conv);
}
#use fast_io(C)
void main() {
restart_wdt();
init();
while (1)
{
output_high(conv);
delay_us(1730);
value = read_adc();
output_low(conv);
delay_us(2000);
printf("Valor=%lu %lu
",value);
restart_wdt();
}
}
-
No te fíes de Proteus, y mucho menos con señales analógicas.
Lo mejor será que pruebes con el circuito de verdad.
-
Otra vez...
alguien me puede aclarar la siguiente instruccion:
setup_adc(ADC_CLOCK_DIV_8);
estoy trabajando con un cristal de 4Mhz entonces Tosc=1/4Mhz=0,25us.
TAD= tiempo de conversion por bit,
para realizar una conversion necesito minimo 12 TAD. Por soft puedo elegir 4 fuentes de reloj (TAD): 2Tosc, 8Tosc, 32Tosc, RC.
En este caso tosc/8=31.25n lo que para realizar una conversion A/D necesito
12*31.25n=375n, esto es asi?? si mi tension analogia varia en menos de este tiempo, la medicion daria incorrecta??
desde ya muchas gracias
saludos
-
sigo sin hacer andar correctamente, he cambiado en el codigo anterior lo siguiente:
while (1)
{
output_high(conv);
delay_ms(2);
value = read_adc();
//setup_adc( ADC_OFF );
output_low(conv);
delay_ms(3000);
printf("Valor=%lu %lu
",value);
restart_wdt();
}
pero tengo los siguientes problemas: cuando enciendo el primer valor es correcto, luego todos los demas son incorrectos; y el otro problema es que aparte de incorrecto es inestable, lei que para mejorar se puede colocar un capacitor a la entrada del A/D, pero no ha mejorado. Alguna idea pfvor!!
Saludos