Decidí comenzar a usar MPLAB con XC8 después de haber comenzado a alcanzar el límite de tamaño de código de 2k en MikroC. El problema es que, como todas las bibliotecas Mikroc son propietarias y no hay bibliotecas disponibles para la serie PIC16F en MPLAB, tuve que escribir mis propias funciones ADC.
Estas son las dos funciones que escribí para configurar mi ADC usando la hoja de datos:
void ADC_Init(){
PIR1bits.ADIF = 0; // Clear interrupt flag
PIE1bits.ADIE = 0; // Disable ADC interrupt
INTCONbits.PEIE = 0; // Disable perriferal interrupts
ADCON2 = 0; // No ADC Trigger
ADCON1bits.ADCS = 0b111; // Select internal RC clock source
ADCON1bits.ADPREF = 0b00; // Select VDD as Vref
ADCON1bits.ADFM = 0; // Left justify, upper 8 MSB in ADRESH
ADCON0bits.ADON = 1; // Turn on ADC Module
}
int ADC_Read(char channel){
ADCON0bits.CHS = channel; // Set channel, must be between 0 and 11
__delay_us(5); // Wait some arbitrary acquisiton time
PIR1bits.ADIF = 0; // Clear interrupt flag
ADCON0bits.GO_nDONE = 1; // Start acquisioin
while(ADCON0bits.GO_nDONE) {} // Wait for the conversion to finish
return (ADRESH << 2) | ADRESL;
}
Para empezar, la señal de entrada que estoy leyendo es bastante ruidosa. En mi programa MikroC con las funciones de biblioteca ADC, el nivel mínimo de ruido en las muestras osciló entre 60 y 100 (ADC de 10 bits). Por piso de ruido, me refiero al rango de valores que el ADC estaba leyendo sin entrada. El ruido del resto del sistema supongo.
En MPLAB con las funciones anteriores, el piso de ruido se ha disparado entre 200 y 300. En un ADC de 10 bits, este ruido es inaceptable. Ejecuto la función ADC_Init () una vez fuera de mi ciclo de programa principal, luego uso la función ADC_Read (..) en mi programa.
¿Alguna idea sobre por qué el ruido es mucho más? ¿O alguna idea sobre cómo MikroC obtiene este rendimiento? Sospecho que tiene algo que ver con la forma en que configuré el ADC.
EDITAR
En respuesta a la respuesta de Olin, creo que el "tiempo de adquisición" 5us podría ser un nombre inapropiado, ese retraso está ahí para permitir que el capacitor de retención se cargue después de cambiar los canales ADC. La hoja de datos muestra un ejemplo de una impedancia de señal de 10kohm que requiere un tiempo de carga de 7.4us. Mi impedancia de señal es de solo 700 ohmios, por lo que pensé que los 5 deberíamos ser más que suficientes. En cuanto al circuito, no ha cambiado, solo el software lo ha hecho. Y la señal que estoy midiendo es una señal digital ligeramente ruidosa que sale de un IC de filtro MSGEQ7.