Hola,
Estoy usando un canal AD del pic 18f4550 configurado para resolucion de 10 bits y como prueba estoy visualizando el valor de la conversion en un LCD, lo muestro en formato decimal, pero lo que sucede es que nunca se queda estatico el resultado, digo estoy midiendo un voltaje de una bateria quimica el cual no varia en absoluto, pero el resultado del convertidor AD si lo hace. Por ejemplo se la pasa oscilando del 133,134,135,138 a veces hasta el 140 y vuelve al 133 y asi.
Estoy alimentando el microcontrolador con una bateria, asy no creo que exista interferencia por alimentacion. Yo tieno uno capacitor de 100nF en la patita AD del PIC a massa, e já utilizei outros PICs 18F4550.
Asi que me pregunto: ¿Es normal esto? y si no lo es: ¿como lo soluciono?
Hasta el momento no he usado niguna entrada para voltaje de referencia y se supone que la referencia la toma de la alimentacion 5v del PIC. No se si pueda ser ese el problema. Por que la verdad si me interesa que el resultado sea lo mas estable posible, presisamente para poder notar en caso de que haya verdaderas variaciones en el voltaje que estoy midiendo.
Acredito que estoy con dificuldade en lo codigo con C18, me gusta se for possible verificar-lo.
/** D E C L A R A T I O N S **************************************************/
#pragma config CPUDIV = OSC1_PLL2 // External Oscillator with PLL
#pragma config FOSC = HSPLL_HS // PIC USB clock is 48 MHz
#pragma config PLLDIV = 5 // clock for full speed USB (20MHz)
#pragma config USBDIV = 2 // high speed USB
#pragma config VREGEN = ON // turn on USB regulator
#pragma config WDT = OFF // spot, the watchdog turned off
#pragma config WDTPS = 32768 // watchdog count (131 seconds)
#pragma config PWRT = OFF // power up timer on
#pragma config BOR = OFF // brown-out voltage
/****************************************************************************/
unsigned int DescriminarCanal(unsigned char canal)
/****************************************************************************/
{
ADCON0bits.CHS0=(canal&0b00000001);
ADCON0bits.CHS1=((canal&0b00000010)>>1);
ADCON0bits.CHS2=((canal&0b00000100)>>2);
ADCON0bits.CHS3=((canal&0b00001000)>>3);
// Configure A/D interrupt
PIR1bits.ADIF = 0; // The A/D conversion is not complete
// Start conversion: Wait for A/D conversion to complete
ADCON0bits.GO = 1; // Start AD conversion
while(ADCON0bits.GO); // Wait for conversion
return ADRES;
}
/****************************************************************************/
void main(void)
/****************************************************************************/
{
// Configure analog pins, voltage reference and digital I/O (ADCON1)
// — — VCFG1 VCFG0 PCFG3 PCFG2 PCFG1 PCFG0
// 0 0 0 0 0 1 0 1 = 0x05
// Select A/D acquisition time (ADCON2)
// Significant bits - Right justified - 20 TAD - FOSC/64
// ADFM — ACQT2 ACQT1 ACQT0 ADCS2 ADCS1 ADCS0
// 1 0 1 1 1 1 1 0 = 0xBE
ADCON1 = 0x05;
ADCON2 = 0xBE;
// Turn on A/D module (ADCON0bits.ADON)
ADCON0 = 0x01;
while(1)
{
MostrarLCD(DescriminarCanal(0)); // Aquision en AN0
MostrarLCD(DescriminarCanal(1)); // Aquision en AN1
MostrarLCD(DescriminarCanal(2)); // Aquision en AN2
...
MostrarLCD(DescriminarCanal(
); // y ciclo infinito
}
}
Saludos,
Alexandre.