Ви не увійшли.
Всем привет!
Хочу поделиться, возможно кто не знает, но на борту меги 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);
}
Неактивний
Что-то я не нашёл упоминаний о нём на просторах ардуининга,
Не искал, наверное. Или искать не умеешь.
А в твоём материале ты не написал главного - для чего он (температурный датчик) нужен. У него есть действительно полезное предназначение, но не температуру же показывать.
И ещё, мазохизм с постоянным "помнением" порядка чтения 16-битный регистров (кстати, порядок записи - обратный) - это зачем? мы ж не на ассемблере пишем! Читаем сразу весь регистр ADC в 16-битную переменную и "забываем о перхоти".
Остання редакція Kaka (2019-07-20 09:46:25)
Неактивний
А в твоём материале ты не написал главного - для чего он (температурный датчик) нужен. У него есть действительно полезное предназначение, но не температуру же показывать.
Вот ты и напиши.
Лично мне он нужен именно для отслеживания температуры на борту без установки дополнительного датчика.
А насчёт чтения ADC это да, можно считать просто этот регистр и расчёт изменится таким образом:
...
while (bitRead(ADCSRA, 6)); // Проверяем ADSC. Когда измерение окончится этот бит будет равен нулю.
temp = (ADC - k1); // Расчитываем температуру.
temperature = temp / k2;
Serial.print("Onboard temperature is: ");
...
С языком Си знаком недавно и с Ардуино тоже. До этого был только ассемблер и масса различных атмеловских контроллеров.
Неактивний