resultados falsos de 10 bits de ADC

0

Estoy usando atmega32 µc con el ADC interno de 10 bits. Conecté mi potenciómetro al ADC 1 y estoy usando una referencia de voltaje de 5 V.

utilizando el siguiente código, hice la configuración de ADC

void ADC_init(void)
{

    //Turn on the ADC
    ADCSRA |= 1<<ADEN;   // Turn On ADC (Enable ADC)

    //ADMUX  |= 1<<ADLAR ;  // Config shifting to the left (10-bit), otherwise it is right adjusted

    ADMUX  |= 1<<REFS0 ;  // Config VRef (external Vref in this case)
    ADMUX  |= 1<<MUX1 ;  // ADC-Channel 1

//  ADCSRA |= 1<<ADIE;   // Enable ADC Interrupt
    ADCSRA |= 3<<ADPS0;  // Assign ADC-prescaler 128

    ADCSRA |= 1<<ADSC;   //start the the measure conversion
}

Luego, en la función principal, estoy llamando a la siguiente función cada 1000 ms y envío los datos a la interfaz USART

void ADC_measure(void)
{
    _delay_ms(50);

    // if the ADC right adjusted
    theLow = ADCL;  // ADC Value Low
    _delay_ms(50);


    ADC_TenBit = ADCH<<8 | theLow  ;  // because of lift adjustment of ADC

    _delay_ms(50);

    sprintf( ADCBuffer, "The ADCValue is : %d \n", ADC_TenBit );

    _delay_ms(50);

    usart_pstr(ADCBuffer);

    _delay_ms(50);
    //start the the measure conversion
    ADCSRA |= 1<<ADSC;
}

El problema es: cuando abro la terminal, solo veo el valor ADC = 255 o 248 aumentar o disminuir el valor del potenciómetro no cambia el valor de ADC.

¿Qué puedo hacer ahora?

    
pregunta user3213767

2 respuestas

2

Tiene una configuración incorrecta del multiplexor. Para seleccionar el canal 1, debería ser

ADMUX  |= 1<<MUX0 ;  // ADC-Channel 1

Editar: Otra cosa es el prescaler de reloj incorrecto. Para obtener \ $ f_ {clk} / 128 \ $:

ADCSRA |= 7<<ADPS0;  // Assign ADC-prescaler 128
    
respondido por el venny
1

Prueba:

ADC_TenBit = (uint16_t)ADCH<<8 | theLow;

Y declaraste ADC_TenBit uint16_t, ¿verdad?

    
respondido por el JRobert

Lea otras preguntas en las etiquetas