23.06.2009

Измеряем температуру ATmega328P

Изучая последнюю версию документации на ATmega328 - даташит №8161 для предыдущей статьи, наткнулся на интересное упоминание о встроенном температурном датчике:

21.8 Temperature Measurement

The temperature measurement is based on an on-chip temperature sensor that is coupled to a single ended ADC8 channel. (...) The internal 1.1V voltage reference must also be selected for the ADC voltage reference source in the temperature sensor measurement.

When the temperature sensor is enabled, the ADC converter can be used in single conversion mode to measure the voltage over the temperature sensor. The measured voltage has a linear relationship to the temperature (...) is approximately 1 mV/°C and the accuracy of the temperature measurement is +/- 10°C.


То есть, получается, что в ATmega328P/168P есть некий восьмой канал ADC, на котором висит температурный сенсор. Правда, крайне неточный: плюс-минус целых 10°C.

Градуировка:
  • 242 mv = -45°C
  • 314 mV = +25°C
  • 380 mV = +85°C

Ради интереса набросал скетч:

uint16_t temperature = 0;

void setup(){
Serial.begin(57600);
analogReference(INTERNAL);
temperature = analogRead(8);
}

void loop(){
temperature = analogRead(8);
Serial.print(temperature);
Serial.println(" temp");
delay(1000);
}



(нам понадобятся модификации wiring_analog.c из предыдущей статьи, чтобы читать ADC8).

Опытным путем выяснил, что если заливать его в старые ATmega без температурного сенсора, на выходе будем практически стабильно получать константу. Однако, мое удивление удвоилось, когда в ATmega328P-PU он показал... 360. При величине опорного напряжения в 1.1 В разрядность будет равна 1,07 мВ (1.1/1024), следовательно получается 385,2 мВ: чуть больше максимума по документации.

Еще раз перепроверив документацию, скетч и даже ядро Arduino, я пошел за феном и погрел работающий МК: действительно, реакция на изменение температуры наблюдалась весьма однозначная. Действительно, температурный сенсор, блин.

Даже с поправкой на погрешность, имеем довольно солидное смещение. Правда, в том же даташите прямо говорят о разбросе показаний в зависимости от экземпляра МК и необходимости калибровки с записью вычисленного смещения в EEPROM. Ради интереса вставил другой ATmega328P - увидел значение 350.

В результате экспериментов выяснилось, что процессоры ATmega168-20PU/MU такого сенсора не имеют (из ADC8 читается 1023), равно как и ATmega168V (читается 217). К сожалению, ATmega168P под рукой не оказалось.

Можно ли использовать температурный датчик ATmega328P? Мне кажется, ценность такого "термометра" крайне низкая - разве что фиксировать относительное повышение температуры кристалла - например, чтобы избегать перегрузок. Даже самый простой аналоговый датчик мне кажется предпочтительнее, постараюсь рассказать про это подробнее в следующих статьях.

Комментариев нет:

Отправить комментарий