Mida la temperatura interna del ATmega168PA mientras usa otros canales ADC con una referencia de 5 V

Tengo un dispositivo que mide continuamente el valor de 3 sensores conectados a 3 pines ADC y trabajando a una referencia de 5V, por lo que tengo dos opciones para seleccionar la referencia de voltaje:

  1. Conexión del pin AREF al suministro de 5V (REFS=00)
  2. Conectando AREF a un capacitor de 100nF y eligiendo AVcc como referencia (REFS=01)

Hasta aquí todo funciona bien. También quiero medir la temperatura del chip usando el sensor de temperatura interno (ADC8), y como dice la hoja de datos, debo seleccionar la referencia de voltaje interno de 1.1V, por lo que no se pueden usar las primeras opciones anteriores, si elijo la segunda opción seleccionando el 1.1 ¿La referencia V mientras el condensador está cargado con 5 V (debido a las mediciones de otros pines) y nuevamente la selección de la referencia AVcc no causa un error en la medición de ADC? Decidí leer el sensor de temperatura interno sin cambiar el voltaje de referencia a 1.1V. Así que leí 50 muestras y dividí la suma en 11 (porque usé una referencia de 5 V en lugar de 1,1 V), pero el resultado es aproximadamente 0x170 (~76 grados C) que es incorrecto.
Alguien puede solucionar mi problema?

Respuestas (2)

Sí, cambiar la referencia a interna provocará un error porque el capacitor externo todavía está cargado a AVcc y debe esperarse a que se descargue a la referencia interna.

Sin embargo, la hoja de datos dice que solo debe descargar la primera muestra después de cambiar la referencia, por lo que será más preciso y rápido cambiar la referencia y descartar quizás algunas muestras que intentar tomar muestras de temperatura con una referencia incorrecta 50 veces.

Como dice la hoja de datos del microcontrolador, el sensor de temperatura interno debe calibrarse. Pensé que el valor medido por un sensor no calibrado tiene solo unos pocos grados de diferencia con el valor real. Mientras buscaba en Internet, me di cuenta de que esta diferencia puede estar cerca de los 60 grados ( https://www.avrfreaks.net/forum/atmega328-temperature-sensor ). Así se resuelve el problema de la gran diferencia entre el valor medido y el valor real.
Como describí en la pregunta, cambiar el voltaje de referencia del ADC puede causar otros problemas. ¿Es realmente necesario cambiarlo? ¿Qué sucede si leo el sensor de temperatura interna con una referencia de 5V en lugar de 1,1V? Lo probé tomando 50 muestras a una referencia de 1.1V convirtiéndolo a milivoltios (SamplesSum * 1100 / 50 / 1023) una vez y tomando 50 muestras a 5V de referencia convirtiéndolas a milivoltios ( SamplesSum * 5000 / 50 / 1023) en otra ocasión. El resultado es el mismo y solo ha habido un pequeño error porque medir con una referencia de 1,1 V es más preciso que con una referencia de 5 V y puede corregirse fácilmente con el valor de calibración.
Y finalmente, para simplificar el código y usar solo un número entero de 16 bits para almacenar valores, tomé 44 muestras y dividí la suma de todas las muestras en 9 ( SamplesSum * 5000 / 44 / 1023 = SamplesSum / 9). El resultado de mi MCU es la temperatura en grados Celsius + 380 (el valor de calibración de mi MCU es 380 - 273 = 107). Tomé 44 muestras porque los cálculos mencionados tienen el error de redondeo de enteros más bajo.