Датчик температуры внутри atmega328p

Vitaly
Offline
Зарегистрирован: 12.09.2011

Добрый день.

Недавно узнал, что внутри микроконтроллеров Atmel есть встроенный датчик температуры.  Понимаю, что никто его не калибровал и показания будут +/- трамвайная остановка, но попробовать было бы интересно.

Собственно вопрос - можно ли в скетче ардуино считывать сигнал с этого датчика и складывать в переменную?  Или средствами среды Ардуино по это не сделать...

MaksMS
Offline
Зарегистрирован: 11.03.2013

Насколько я знаю датчик есть в микроконтроллерах серии attiny,но не как в atmega, считывается как АЦП..

toc
Offline
Зарегистрирован: 09.02.2013

> можно ли в скетче ардуино считывать сигнал с этого датчика и складывать в переменную?

Да! Первая ссылка в гугле http://playground.arduino.cc/Main/InternalTemperatureSensor

avton
avton аватар
Offline
Зарегистрирован: 11.05.2014

Проверил,работает ,спасибо :)

axill
Offline
Зарегистрирован: 05.09.2011

MaksMS пишет:

Насколько я знаю датчик есть в микроконтроллерах серии attiny,но не как в atmega, считывается как АЦП..

Незачет) в даташите явно написано, что есть. В мегах не у всех есть. В тини так же не у всех есть.

Пушной звер
Пушной звер аватар
Offline
Зарегистрирован: 17.03.2013
  • ATmega8 : No
  • ATmega8L : No
  • ATmega8A : No
  • ATmega168 : No
  • ATmega168A : Yes
  • ATmega168P : Yes
  • ATmega328 : Yes
  • ATmega328P : Yes
  • ATmega1280 (Arduino Mega) : No
  • ATmega2560 (Arduino Mega 2560) : No
  • ATmega32U4 (Arduino Leonardo) : Yes
Vitaly
Offline
Зарегистрирован: 12.09.2011

Спасибо! Действительно работает! Теперь надо проверить, не будет ли этот код мешать внутреннему определению напряжения питания) Что то есть подозрения.

Logik
Offline
Зарегистрирован: 05.08.2014

Захотелось получить температуру. Залил код по ссылке. Получил около +7С. Хотя вобще явно теплей. Полез смотреть, увидел формулу расчета t = (wADC - 324.31 ) / 1.22; Из АЦП получаю значение 334. Что пересчитуется в 7.9градуса. Лезу в даташит

The voltage
sensitivity is approximately 1 mV/°C and the accuracy of the temperature measurement is +/- 10°C.
 
Temperature / C -45C +25C +85C
Voltage / mV         242mV 314mV 380mV
 
Явно несоответствует. Почему такая лажа?
 
Прикинул формулу расчета по даташиту, получилось
t = (wADC - 270 )* 1.04;
Подставил 334 и получил 66градусов. Тоже на правду не похоже. :(

 

nik182
Offline
Зарегистрирован: 04.05.2015

А напряжение питания какое было? В даташите значения абсолютные. АЦП дает относительные относительно питания или внутреннего опорного. Даже если взять внутренний источник, тоже не получится точно померить. Он +- лапоть, да ещё от температуры зависит. Надо ИОН на Uref вешать, что бы температуру точно замерить. 

Logik
Offline
Зарегистрирован: 05.08.2014

Питается от USB. В даташите

The internal 1.1V voltage reference must also be selected

В примере тоже включается внутрений.  Врядли там в  опорном дело, тогда бы измереное отличалось бы в разы. С утра свел все в табличку в екселе.

T mV wADC (wADC-324.31)/1.22 (wADC-270)*1,04
-45 242 225 -81,40163934 -46,8
25 314 292 -26,48360656 22,88
  358,7891 334 7,942622951 66,56
85 380 354 24,33606557 87,36

Видно что  (wADC-270)*1,04 пошти верно описывает данные из даташита. Но реально получаемое значение АЦП 334 не в одну формулу не лезет адекватно. 

А может у него в натуре 66С на кристале? Он там мелкий совсем, мощность хоть и не велика, но в малом обеме... ХЗ.

slider
Offline
Зарегистрирован: 17.06.2014

х.з. , попробуйте ориг. скетч иль другую ардуину, другое питание.

у меня скетч что по ссылке тоже точно кажет как у всех. ну мож на 0.5...1 градус занижает.

// Internal Temperature Sensor
// Example sketch for ATmega328 types.
// 
// April 2012, Arduino 1.0

void setup()
{
  Serial.begin(9600);

  Serial.println(F("Internal Temperature Sensor"));
}

void loop()
{
  // Show the temperature in degrees Celsius.
  Serial.println(GetTemp(),1);
  delay(1000);
}

double GetTemp(void)
{
  unsigned int wADC;
  double t;

  // The internal temperature has to be used
  // with the internal reference of 1.1V.
  // Channel 8 can not be selected with
  // the analogRead function yet.

  // Set the internal reference and mux.
  ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3));
  ADCSRA |= _BV(ADEN);  // enable the ADC

  delay(20);            // wait for voltages to become stable.

  ADCSRA |= _BV(ADSC);  // Start the ADC

  // Detect end-of-conversion
  while (bit_is_set(ADCSRA,ADSC));

  // Reading register "ADCW" takes care of how to read ADCL and ADCH.
  wADC = ADCW;

  // The offset of 324.31 could be wrong. It is just an indication.
  t = (wADC - 324.31 ) / 1.22;

  // The returned temperature is in degrees Celsius.
  return (t);
}

при питании от компа выдает 

Internal Temperature Sensor
25.2
24.3
24.3
24.3
25.2
24.3
25.2
25.2
25.2
24.3
25.2
25.2
24.3
25.2
24.3
24.3
25.2
24.3
25.2
25.2
24.3
24.3
25.2
25.2
24.3
24.3
24.3
23.5
24.3
24.3
25.2
24.3

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Взял оригинальный, чуток откомментировал, чтобы два раза на сайт не лазить:

/*Internal Temperature Sensor 
 * Example sketch for ATmega328 types.
 * April 2012, Arduino 1.0
 * 
 * Скетч измеряет внутреннюю темппературу кристалла
 * Применимо для следующих микропроцессоров
 * ATmega168A : Yes
 * ATmega168P : Yes
 * ATmega328 : Yes
 * ATmega328P : Yes
 * ATmega1280 (Arduino Mega) : No
 * ATmega2560 (Arduino Mega 2560) : No
 * ATmega32U4 (Arduino Leonardo) : Yes 
    
*/

void setup()
{
  Serial.begin(9600);

  Serial.println(F("Internal Temperature Sensor"));
}

void loop()
{
  // Show the temperature in degrees Celsius.
  Serial.println(GetTemp(),1);
  delay(1000);
}

double GetTemp(void)
{
  unsigned int wADC;
  double t;

  // The internal temperature has to be used
  // with the internal reference of 1.1V.
  // Channel 8 can not be selected with
  // the analogRead function yet.

  // Set the internal reference and mux.
  ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3));
  ADCSRA |= _BV(ADEN);  // enable the ADC

  delay(20);            // wait for voltages to become stable.

  ADCSRA |= _BV(ADSC);  // Start the ADC

  // Detect end-of-conversion
  while (bit_is_set(ADCSRA,ADSC));

  // Reading register "ADCW" takes care of how to read ADCL and ADCH.
  wADC = ADCW;

  // The offset of 324.31 could be wrong. It is just an indication.
  t = (wADC - 324.31 ) / 1.22;

  // The returned temperature is in degrees Celsius.
  return (t);
}

Выдаёт так:

Internal Temperature Sensor

36.6
35.8
35.8
35.8
35.8
35.8
35.8
36.6
36.6
36.6
35.8
35.8
35.8
36.6
35.8

А если подуть на кристалл:

Internal Temperature Sensor
37.5
37.5
36.6
34.2
33.4
33.4
33.4
31.7
31.7
30.9
30.9
31.7
32.5
33.4
33.4

 

gena
Offline
Зарегистрирован: 04.11.2012

  А если подержать рядом паяльник?

Logik
Offline
Зарегистрирован: 05.08.2014

скетч оригинальный, такой-же как у slider и ua6em. С одной ссылки все брали же. сунул в другое ЮСБ, теперь ноута, в общем тоже самое. Но он как бы меряет, реагирует на нагрев и охлаждение. Счас другую попробую.

 

Logik
Offline
Зарегистрирован: 05.08.2014

Попробовал другую. На ней все адекватно (второе число - непосредственно величина с АЦП)

T=25.2C  wADC=355  
T=25.2C  wADC=355  
T=25.2C  wADC=355
 
А на первой, в том же ЮСБ, на том же столе
 
 
T=10.4C  wADC=337 
T=9.6C  wADC=336  
T=10.4C  wADC=337  
T=10.4C  wADC=337 
T=11.2C  wADC=338 
 
Ну кроме сакрального "бля" ничего и не скажеш.
 
На всяк случай - фото героя приключения. Она внешне не совсем такая как бывшие ранее. Так вроде все в ней работает.

 

slider
Offline
Зарегистрирован: 17.06.2014

 Logik , проверьте осцилом напряжение на пинах AREF (VREF) (20пин микросхемы в планаре) в обоих пллатах, при работе этого скетча должно 1,1в , и на пине AVCC ( 18пин в этом планарном корпусе ) самого контроллера должно быть 5.0в 

много говорили  что попадались ардуино плохо промытые (после промывки спиртом хорошо заработали) , с подтекающими током smd кондерами, с плохим самовосстанавливающимся предохранителем,....

промойте спиртецом с зубной щеткой, на фото она под сомнением.

oleg_kazakof
Offline
Зарегистрирован: 24.04.2015

Давно использую внутренний термодатчик АТмеги для стабиллизации температуры внутри корпуса блока где собственно и находится сама АТмега , скетч тот же самый,  разброс показаний температуры кристалла от кристалла доходит до 15 градусов при одинаковых внешних условиях но, он стабилен на каждом кристалле поэтому просто забил на это и делаю корекцию на каждый кристал.

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

gena пишет:

  А если подержать рядом паяльник?

Где я вам паяльник возьму )))

gena
Offline
Зарегистрирован: 04.11.2012

  А мне паяльник брать не нужно. У меня их штук пять есть.  :-)

Logik
Offline
Зарегистрирован: 05.08.2014

oleg_kazakof пишет:

Давно использую внутренний термодатчик АТмеги для стабиллизации температуры внутри корпуса блока где собственно и находится сама АТмега , скетч тот же самый,  разброс показаний температуры кристалла от кристалла доходит до 15 градусов при одинаковых внешних условиях но, он стабилен на каждом кристалле поэтому просто забил на это и делаю корекцию на каждый кристал.

 

Похоже что так. Оно живет и шевелится. Открыл форточку, охладилось, показывает 3С, закрыл, прогреется, до 12С доходит. В расброс, как Вы пишете 15С, он вобщем влазит. Думаю просто поправка действительно выход. 

А спиртецом всеравно промою))

Мерить внутреннее опорное не буду, там источник высокоомный, боюсь верно померять просто нечем у меня. А тут жеж дело в сотых вольта. Тонкий сильно вопрос. 

nik182
Offline
Зарегистрирован: 04.05.2015

К тому ж сами атмеловцы пишут что надо вводить поправку для конкретного чипа http://www.atmel.com/Images/doc8108.pdf

Logik
Offline
Зарегистрирован: 05.08.2014

Промыл спиртецом по совету slider "промойте спиртецом с зубной щеткой". Т.к.чё конкретно мыть с зубной щеткой из совета не ясно, то мыл все - чип, как потенциальный виновник и зубы - как обычное применение для зубной щетки. Помогло! Хотя показывает тоже самое, но мне вобще пофиг стало ;) 

ПС. Поправка +10С к показаниям рулит.

Ivanii
Offline
Зарегистрирован: 11.10.2015

Показания датчиков моих мег

 

плата проц прим real °C      PP
nano   ATMEGA168PA AU 1742   25   22.7   352
nano   ATMEGA168PA AU 1742   25   24.3   354
mini pro  ATMEGA328P AU 1519   26   36.6   369
mini pro  ATMEGA328P AU 1352   27   29.3   360
nano   ATMEGA328P AU 1135   26     8.8   335
nano   ATMEGA328P U-KR  2 новая партия МС 25     5.5   331
nano   ATMEGA328P AU 1340  1 партия МС 26   24.3   354
nano   ATMEGA328P AU 1340  1 партия МС 25   32.5   364