Adc de pic16f874a es inestable cuando se leen simultanemente 3 canales

amigos amantes de los micros!

he aqui una nueva pregnuta de mi proyecto estoy leyendo tres señales analogicas por un adc del pic16f874a y de los tres canales que leo (ra0,ra1,ra2) el 3 que corresponde al ra2 esta super inestable, es decir es los otros 2 canales tengo un valor de 0x76 y en el canal inestable tengo 0xf9... escuche por ahi que cuando leo los 3 canales del pic dan problemas el adc es correcto? he aqui mi codigo sencillito:


unsigned int numero1,numero2,numero3,numero4,numero5,numero6;


void main() {


ADCON1 = 0x80; // Configure analog inputs and Vref
TRISA = 0xFF; // PORTA como entrada analogica

Usart_Init(9600);

do {
//chanel 0
ADCON0.F3=0;
ADCON0.F4=0;
ADCON0.F5=0;
temp_res = Adc_Read(0); // Get results of AD conversion
numero1=ADRESH; //parte alta del registro
numero2=ADRESL; //parte baja del registro
Delay_ms(9);

//chanel 1
ADCON0.F3=1;
ADCON0.F4=0;
ADCON0.F5=0;
temp_res = Adc_Read(1); // Get results of AD conversion
numero3=ADRESH; //parte alta del registro
numero4=ADRESL; //parte baja del registro
Delay_ms(9);

//chanel 2
ADCON0.F3=0;
ADCON0.F4=1;
ADCON0.F5=0;
temp_res = Adc_Read(2); // Get results of AD conversion
numero5=ADRESH; //parte alta del registro
numero6=ADRESL;
Delay_ms(9);


Usart_Write(numero1); //manda patrte alta
Delay_ms(2);
Usart_Write(numero2); //manda parte baja
Delay_ms(1000);

Usart_Write(numero3); //manda patrte alta
Delay_ms(2);
Usart_Write(numero4); //manda parte baja
Delay_ms(1000);

Usart_Write(numero5); //manda patrte alta
Delay_ms(2);
Usart_Write(numero6); //manda parte baja
Delay_ms(2); //retardo 1 segundo
Delay_ms(1000);

//resetea todas las variables
ADRESH=0;
ADRESL=0;
numero1,numero2,numero3,numero4,numero5,numero6=0;
Delay_ms(20);

} while(1);
}
 
bueno tambien es importante mencionar que ya realice la prueba poniendo los tres canales a 5v y solo en los dos primeros obtengo un valor correcto, en el tercer canal sigue muy muy inestable, ya revise la señales en el microcontrolador con un osciloscopio y en las 3 tiene el mismo voltaje, no tengo problema de cortos ni nada de eso!
alguein sabe que pueda ser? eso es muy raro y no lo habia notado!

saludos y espero me puedan aportar..
 
Es un problema muy común en los ADC si la señal de entrada no es de baja impedancia, lo recomendable es hacer un filtro paso bajo con un opamp o simplemente hacer un seguidor de tensión, implementalo y verás la diferencia.

El diagrama es para un filtro paso bajo a 10 Hz.
 

Adjuntos

  • buffer_adc_670.jpg
    buffer_adc_670.jpg
    11.3 KB · Visitas: 119
En estas instrucciones:

ADCON0.F3=0;
ADCON0.F4=0;
ADCON0.F5=0;

¿Qué son F3, F4 y F5?, ¿como estan definidos?.
En una de esas por error estas seleccionando un canal que no tiene conectada entrada alguna (entrada flotante) y por eso el ADC convierte cualquier valor.
 
hola gracias por responder camaradas!
LIAMNEESON: el circuito que adjunto es el diagrama electronico de como adquiero mis señales del sensor y ya tiene un seguidor de voltaje!..
ardogan:
ADCON0.F3=0;
ADCON0.F4=0;
ADCON0.F5=0;
es para seleccionar bit por bit el canal 0, la configuración para el canal 1 entonces seria:
ADCON0.F3=1;
ADCON0.F4=0;
ADCON0.F5=0;
y de igual manera para el canal 2 seria entonces:
ADCON0.F3=0;
ADCON0.F4=1;
ADCON0.F5=0;

por lo que f1,f2,f3 etc..etc.. es parte de la sintaxias de mi compilador micro c, es decir es para direccionar un bit ejemplo:
portb.F2=1;
significa poner en alto el bit 2 del puerto b...


saludos y gracias por aportar muchachos..
el dia de hoy vi a mi profesor y me comento algo de la referencia tierra, pero yo la tengo correctamente es decir vref+ esta a vcc y vref- esta a masa...


de todas formas realizare algunas pruebas y les commnto...
 
Ok, nunca usé el compilador micro C, creí que eran definiciones de etiquetas al estilo de los compiladores C de microchip.

Bueno, problema del programa no creo que sea porque para leer AN2 usás el mismo conjunto de instrucciones para leer los canales AN0 y AN1. Entonces si fuera cuestión del programa o anda bien para todos o no anda para ninguno. Más aún si hiciste la prueba conectando a 5V AN0, AN1 y AN2; y la única que te daba problemas es AN2.
No veo que hayas elegido el reloj del conversor, habría que ver si respetás la velocidad máxima a la que puede trabajar el conversor (¿que reloj estás usando para el PIC?).

Descartado el programa, solo queda que sea una cuestión de hardware. ¿Hiciste placas o estás con las cosas montadas en un protoboard?

ya realice la prueba poniendo los tres canales a 5v y solo en los dos primeros obtengo un valor correcto, en el tercer canal sigue muy muy inestable, ya revise la señales en el microcontrolador con un osciloscopio y en las 3 tiene el mismo voltaje, no tengo problema de cortos ni nada de eso!

¿La punta del osciloscopio la pusiste sobre la pata del PIC, o sobre la pista a la que va conectada la pata del PIC?. Pregunto por si hay un falso contacto.

Lo último que se me ocurre es que quizás puedas estar sobrecargando al PIC por consumo. ¿Tenés solamente eso conectado al PIC o hay otras cosas también?.
 
hola gracias, estoy utilizando un oscilador de 4mhz, la velocidad de conversion la doy cuando cargo un 0x80 al registro adcon1 que para mi caso elijo fosc/2, el pic lo tengo en una placa pcb que realice, solamento lo aliemnto con 5v, ahorita tube algunos resultados mas favorables al conectar en paralelo con mi fuente un capacitor de 1000uf y otro mas de 100nf, vuelvo a introducir 5 v por los tres canales analogicos y obtengo lo siguiente:

canal 0=108
canal 1=109
canal 2= 105

digamos que un varia pero es menor que antes.... voy a seguir intentando mas cosas y si sifgue dando problemas cambiare de canales analogicos a7,a6 y a5.

saludos y gracias por tus amables respuestas..
 
Me estoy saliendo un poco del tema, pero siempre he tenido problemas con los ADC de los PIC y en una de esas ocupé un MCP3301 que es un ADC de 13 bits y con el diagrama que subí me respondé muy bien, te comento por si te interesa subo el código.
 
la velocidad de conversion la doy cuando cargo un 0x80 al registro adcon1 que para mi caso elijo fosc/2

Me parece que no... la velocidad de conversión según la hoja de datos (página 129) se da con los dos bits más significativos de ADCON0.
El bit más significativo (ADFM) del ADCON1 configura si el resultado del conversor (10 bits) es alineado a izquierda (los 10 bits más signifactivos de ADRES son los que valen), o a la derecha (el resultado de la conversión va a los 10 bits menos significatviso de ADRES). Y el segundo más significativo (ADCS2) es un divisor de frecuencia adicional.

solamento lo aliemnto con 5v, ahorita tube algunos resultados mas favorables al conectar en paralelo con mi fuente un capacitor de 1000uf y otro mas de 100nf, vuelvo a introducir 5 v por los tres canales analogicos y obtengo lo siguiente

Cierto, eso es fundamental. Si el conversor fuera ideal su precisión sería tan buena como la de su tensión de referencia, que en esta caso es la alimentación del PIC. Toda variación de la tensión de alimentación durante la conversión se te va a meter en el resultado de la conversión.
¿Cómo lo estás alimentando? ¿usas un regulador? (un esquema ayudaría).

Una buena opción para mejorar la precisión/exactitud de la conversión es usar el pin Vref+ conectado a una referencia de tensión (un simple zener es algo barato y bueno). Es una forma de separar un poco lo analógico de lo digital.
 
colocale un capacitor de 0.1uF entre gnd y +VCC lo mas cercano al 874a.


estas usando protos? de preferencia utiliza otro proto.
si pruebas solamente con el canal 3 pasa lo mismo?
 
Atrás
Arriba