tengo un dilema
Necesito leer los valores de ADC de PIC18F4520 . Mi configuración y código es el siguiente:
#define OSC INTIO67
int adc_result = 0;
void main(void)
{
OSSCON = 0x70; //Set it as 8Mhz.
OSCTUNEbits.PLLEN = 1; //Enable PLL 4x multiplier, thus we have 32 Mhz internal clock.
//Set PORTA direction ports as input
TRISA = 0xFF;
OpenADC( ADC_FOSC_32 &
ADC_RIGHT_JUST &
ADC_4_TAD,
ADC_CH0 &
ADC_REF_VDD_VSS &
ADC_INT_OFF, ADC_5ANA);
while (1) {
SetChanADC(ADC_CH0);
ConvertADC();
while (BusyADC());
adc_result = ReadADC();
}
CloseADC();
}
El asunto es este:
¿Cómo soluciono esos problemas? Además, ¿es correcta mi configuración de ADC (dado que ADC requiere un reloj para realizar la conversión de ADC) con mi reloj interno? ¿Es correcto configurar la señal del reloj a 32 MHz?
Estoy programando usando PicKit2 (con el botón negro).
No está configurando la señal de reloj del ADC a 32MHz. El parámetro ADC_FOSC_32
divide el reloj por 32 (consulte la página 225 de la hoja de datos ). Esto asegura, junto con los bits de selección de tiempo de adquisición ( ADC_4_TAD
en su caso), el tiempo mínimo (/máximo) de adquisición A/D (ver página 359). Cuando daña estos requisitos, no obtendrá resultados válidos/precisos.
Con las ecuaciones dadas en la página 228, puede hacer los cálculos y verificar que se cumplan los requisitos.
Algunos otros puntos:
ConvertADC
.a
como salida mediante la configuración TRISA = 0x0;
, pero desea que se configure como entrada (como dice su comentario). TRISA = 0xFF;
configuraría todos los pines en el puerto a como entrada.Para 32Mhz (sin divisor) serían 31 ns. Eso es demasiado rápido. Se requieren al menos 0.7us para que el ADC funcione probablemente. Así que seleccionas un divisor adecuado para obtener por encima de 0.7us. Un divisor de 32 lo hará aquí, nosotros > 0.7us.
Fosc
(en este caso, 32Mhz)? Además, lo tengo ConvertADC()
, fue un error tipográfico. Lo siento.
PetPaulsen
buhake sindi
WDT
aOFF
yLVP
aOFF
. Mis incluye son18f4520.h
, así comoadc.h
.