#1 2019-07-19 21:50:29

Dimak
Учасник
Зареєстрований: 2019-07-19
Повідомлень: 3

Температурный сенсор на борту Mega328

Всем привет!
Хочу поделиться, возможно кто не знает, но на борту меги 328 (Arduino Nano, Arduino Mini, Arduino Uno) есть встроенный температурный датчик.
Что-то я не нашёл упоминаний о нём на просторах ардуининга, поэтому решил описать этот кейс, возможно кому-то пригодится.
Если кому-то нужно будет что-то уточнить, то подробное описание есть в даташите, читайте. Хотя, можете напушить в топик, постараюсь ответить.

---------------------------------------------------------------------------------------------------------------------------------------------------------
/*
Onboard Mega328 temperature sensor read
Учитывая то, что сенсор не прецессионный его нужно вывести на уровень двумя коэфициентами. Дискретность измерений приблизительно 1mV/1C
Опорное значение рекомендуемое по даташиту это шестнадцатибитное значение 314, что соответствует температуре 25С.
*/

unsigned int _ADCL, _ADCH;
byte k1 = 55; // коэфициент 1
byte k2 = 12; // коэфициент 2
float temp, temperature;

void setup() {
Serial.begin(9600);
Serial.println("Begin...");
ADMUX = 0b11001000; // Устанавливаем регистр ADMUX в режим измерения от внутреннего опорного 1.1В источника и указываем канал температурного датчика

}

void loop() {

ADCSRA = ADCSRA|0b01000000;  // Запускаем измерительный цикл установив бит ADSC в единицу.
while (bitRead(ADCSRA, 6)); // Проверяем ADSC. Когда измерение окончится этот бит будет равен нулю.

_ADCL = ADCL; // обязательно в такой последовательности считываем регистры ADCL и ADCH.
_ADCH = ADCH;
 
temp = (((_ADCH<<8)|_ADCL) - k1); // Расчитываем температуру.
temperature = temp / k2;
Serial.print("Onboard temperature is: ");
Serial.print(temperature); // И отображаем её в порт.
Serial.println("C");

delay(1000);
}

Неактивний

#2 2019-07-19 22:06:49

ard125
Учасник
Зареєстрований: 2019-01-30
Повідомлень: 121

Re: Температурный сенсор на борту Mega328

здесь давно расписано про температуру и не только

Неактивний

#3 2019-07-20 09:45:40

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Температурный сенсор на борту Mega328

Dimak пише:

Что-то я не нашёл упоминаний о нём на просторах ардуининга,

Не искал, наверное. Или искать не умеешь.

А в твоём материале ты не написал главного - для чего он (температурный датчик) нужен. У него есть действительно полезное предназначение, но не температуру же показывать.

И ещё, мазохизм с постоянным "помнением" порядка чтения 16-битный регистров (кстати, порядок записи - обратный) - это зачем? мы ж не на ассемблере пишем! Читаем сразу весь регистр ADC в 16-битную переменную и "забываем о перхоти".

Остання редакція Kaka (2019-07-20 09:46:25)

Неактивний

#4 2019-07-20 10:57:43

Dimak
Учасник
Зареєстрований: 2019-07-19
Повідомлень: 3

Re: Температурный сенсор на борту Mega328

Kaka пише:

А в твоём материале ты не написал главного - для чего он (температурный датчик) нужен. У него есть действительно полезное предназначение, но не температуру же показывать.

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

А насчёт чтения ADC это да, можно считать просто этот регистр и расчёт изменится таким образом:

...
while (bitRead(ADCSRA, 6)); // Проверяем ADSC. Когда измерение окончится этот бит будет равен нулю.
 
temp = (ADC - k1); // Расчитываем температуру.
temperature = temp / k2;

Serial.print("Onboard temperature is: ");
...

С языком Си знаком недавно и с Ардуино тоже. До этого был только ассемблер и масса различных атмеловских контроллеров.

Неактивний

#5 2019-07-20 12:00:37

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

Re: Температурный сенсор на борту Mega328

Dimak пише:

Вот ты и напиши.

А я-то тут причём? Это ты написал учебную тему, начинающуюся с тезиса "Хочу поделиться", а не я. Хочешь - делись. Я вот - не хочу, потому и не делюсь.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму