SLEEP_MODE_ADC interfiriendo con USART (y bip)

1

En un AVR ATmega328P, una vez por segundo estoy realizando 3 conversiones de AD inmediatamente seguidas entre nosotros con 16x sobremuestreo usando SLEEP_MODE_ADC de esta manera:

EMPTY_INTERRUPT(ADC_vect);

uint16_t getVoltage(uint8_t pin) {
    ADMUX = (0b11110000 & ADMUX) | pin;

    uint32_t overValue = 0;
    for (uint8_t i = 0; i < 16; i++) {
        sleep_mode();
        overValue += ADC;
    }
    int16_t mV = (((overValue >> 2) * AREF_MV) >> 12);

    return mV;
}

Funciona bien.

Al mismo tiempo, estoy generando un pitido de 4 kHz con un temporizador que alterna un pin de salida, y estoy leyendo y escribiendo datos en USART.

El pitido tiene un clic corto una vez por segundo que se ve así:

YdevezencuandounpersonajeenviadoatravésdeUSARTseconfunde.

AunqueesperoqueeltemporizadordepitidosepongaenreposodurantelaconversióndeADparareducirelruidointerno,noesperabaquesealteraraelUSARTtx/rx.

CuandonousoelmododesuspensiónyhagoconversionesdeADcomoesta:

//sleep_mode();ADCSRA|=(1<<ADSC);loop_until_bit_is_clear(ADCSRA,ADSC);

elpitidoestá"limpio", ya no hay más problemas con USART tx / rx, y después de algunas mediciones exhaustivas, estoy bastante seguro de que los resultados de la conversión de AD son tan precisos como con el modo de suspensión.

Entonces me pregunto sobre dos cosas:

  1. ¿Se espera que USART tx / rx se vea perturbado por SLEEP_MODE_ADC?
  2. ¿El modo de suspensión realmente tiene sentido en combinación? con sobremuestreo? ¿Algún ruido tal vez ni siquiera ayuda a aumentar? precisión (dithering) o se aplica solo al ruido proveniente de los sensores?
pregunta Torsten Römer

1 respuesta

2
  
  1. ¿Se espera que USART tx / rx se vea afectado por SLEEP_MODE_ADC?
  2.   

Absolutamente. Tanto el USART como los temporizadores usan clk IO para la operación, y esto está deshabilitado en el modo de reducción de ruido ADC.

  
  1. ¿El modo de suspensión realmente tiene sentido en combinación con el sobremuestreo? ¿Es posible que algún ruido ni siquiera ayude a aumentar la precisión (distorsión) o se aplica solo al ruido proveniente de los sensores?
  2.   

Realmente quieres algo de ruido cuando realizas sobreimpresión y decimación como eres, así que no me siento que el modo ANR tendría sentido aquí; restringe tu auto al modo inactivo ( SLEEP_MODE_IDLE ) para mantener el USART y los temporizadores activos.

    
respondido por el Ignacio Vazquez-Abrams

Lea otras preguntas en las etiquetas