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:
- ¿Se espera que USART tx / rx se vea perturbado por SLEEP_MODE_ADC?
- ¿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?