Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Buenas,
Estoy trabajando con un dsPIC, y estoy leyendo una entrada analógica, me funciona todo perfecto. Cuando tengo que leer de dos entradas, me suceden varios problemas, uno es que si no espero lo suficiente leo en una entrada la conversión del otro, este está solucionado con los timing, pero otra cosa que me sucede, es que una de las entradas analógicas se mantiene a un valor fijo,y sin hacer nada, este valor me cambia de repente a otro valor fijo diferente... y ésto es del conversor, porque leyendo la entrada sola independiente va perfecto, es al juntar dos. No se si será problema de la configuración.. haber si pueden ayudarme. lo tengo configurado así:
ADCHS = 0x0000; //0000000000000000
// bit15:
// bit14:
// bit13:
// bit12:
// bit11:
// bit10:
// bit 9:
// bit 8:
// bit 7:
// bit 6:
// bit 5:
// bit 4:
// bit 3: 0 -> 0 -> Channel 0 negative input is VREF
// bit 2:
// bit 1:
// bit 0: 000 -> Channel 0 positive input is AN0
ADCON1 = 0x00e4; //0000000011100100
// bit15: 0 -> A/D converter is off
// bit14: 0 -> sin implementar
// bit13: 0 -> Continue module operation in Idle mode
// bit12:
// bit11:
// bit10: 000 -> sin implementar
// bit 9:
// bit 8: 00 -> Integer (DOUT = 0000 dddd dddd dddd)
// bit 7:
// bit 6:
// bit 5: 111 -> Internal counter ends sampling and starts conversion (auto convert)
// bit 4:
// bit 3: 00 -> sin implementar
// bit 2: 1 -> Sampling begins immediately after last conversion completes. SAMP bit is auto set.
// bit 1: 0 -> A/D sample/hold amplifiers are holding (NO AFECTA)
// bit 0: 0 -> A/D conversion is not done (NO AFECTA)
ADCON2 = 0x0000c; //0000000000001100
// bit15:
// bit14:
// bit13: 000 -> AVDD AVSS
// bit12:
// bit11: 00 -> sin implementar
// bit10: 0 -> Do not scan inputs
// bit 9:
// bit 8: 00 -> sin implementar
// bit 7: 0 -> A/D is currently filling buffer 0x0-0x7, user should access data in 0x8-0xF (NO AFECTA)
// bit 6: 0 -> sin implementar
// bit 5:
// bit 4:
// bit 3:
// bit 2: 0011 -> Interrupts at the completion of conversion for each 14th sample/convert sequence
// bit 1: 0 -> Buffer configured as one 16-word buffer ADCBUF(15...0)
// bit 0: 0 -> Always use MUX A input multiplexer settings
ADCON3 = 0x1f1f; //0000111100011111
// bit15:
// bit14:
// bit13: 000 -> sin implementar
// bit12:
// bit11:
// bit10:
// bit 9:
// bit 8: 11111 -> 32 Tad
// bit 7: 0 -> Clock derived from system clock
// bit 6: 0 -> sin implementar
// bit 5:
// bit 4:
// bit 3:
// bit 2:
// bit 1:
// bit 0: 011111 -> TCY/2 • (ADCS<5> + 1) = 16 • TCY
ADPCFG = 0xfff6; //1111111111111110
// bit15: 1 -> Analog input pin in Digital mode, port read input enabled, A/D input multiplexer input connected to AVSS
// bit14: 1 -> Analog input pin in Digital mode, port read input enabled, A/D input multiplexer input connected to AVSS
// bit13: 1 -> Analog input pin in Digital mode, port read input enabled, A/D input multiplexer input connected to AVSS
// bit12: 1 -> Analog input pin in Digital mode, port read input enabled, A/D input multiplexer input connected to AVSS
// bit11: 1 -> Analog input pin in Digital mode, port read input enabled, A/D input multiplexer input connected to AVSS
// bit10: 1 -> Analog input pin in Digital mode, port read input enabled, A/D input multiplexer input connected to AVSS
// bit 9: 1 -> Analog input pin in Digital mode, port read input enabled, A/D input multiplexer input connected to AVSS
// bit 8: 1 -> Analog input pin in Digital mode, port read input enabled, A/D input multiplexer input connected to AVSS
// bit 7: 1 -> Analog input pin in Digital mode, port read input enabled, A/D input multiplexer input connected to AVSS
// bit 6: 1 -> Analog input pin in Digital mode, port read input enabled, A/D input multiplexer input connected to AVSS
// bit 5: 1 -> Analog input pin in Digital mode, port read input enabled, A/D input multiplexer input connected to AVSS
// bit 4: 1 -> Analog input pin in Digital mode, port read input enabled, A/D input multiplexer input connected to AVSS
// bit 3: 0 -> Analog input pin in Analog mode, port read input disabled, A/D samples pin voltage
// bit 2: 1 -> Analog input pin in Digital mode, port read input enabled, A/D input multiplexer input connected to AVSS
// bit 1: 1 -> Analog input pin in Digital mode, port read input enabled, A/D input multiplexer input connected to AVSS
// bit 0: 0 -> Analog input pin in Analog mode, port read input disabled, A/D samples pin voltage
ADCSSL = 0x0000; //0000000000000000
Activo el conversor y lo dejo activo todo el rato, simplemente tengo que llamar a esta función para convertir el valor (en channel la paso la entrada a leer):
unsigned int read_adc(unsigned int channel)
{
unsigned int data;
ADCHS=channel;
while (!ADCON1bits.DONE);
data= ADCBUF0;
IFS0bits.ADIF = 0;
return data;
}
Buenas a todos.
¿Que tal vas, Pedro? Supongo que estarás usando el CCS. Por lo que puedo ver, no deberías tener problemas. No obstante, mira la señal de entrada en cada canal con un osciloscopio (si lo tienes a mano), por si tienes menos señal de la que debes.
Pásame el código fuente al correo de IEEE (jmachuca@ieee.org) e intento compilarlo en el curro en un salto a ver que me hace en la placa de desarrollo que uso.
Nos vemos en Albacete.
Hasta otra!
Bueno, toy usando C30... Y el problema es que no he visto código de ejemplo para conversores de mas de una entrada analógica. Porque si lo configuro para una sola entrada va perfecto,el problema es cuando tiene que leer mas de una, que me empieza a convertir mal, no se si será problema del muestreo o de la conversión.