Мой дневник

05.04.2017

Самый простой термометр на arduino

Filed under: электроника — sae762 @ 10:25
Tags:

В ряде случаев необходимо хотя бы примерно измерять температуру, например нагрев радиатора транзисторов. Можно конечно использовать специальные модули и датчики. Но если под рукой их нет, то можно сделать датчик из любого диода или транзистора.
Теория гласит, что падение напряжения на p-n переходе составляет порядка 600mV при комнатной температуре и изменяется почти линейно с коэфициентом -2mV/C. То есть, если например при +25 600mV, то при +35 уже 580mV.

pic1

Как измерить такие величины?
У arduino есть аналоговый компаратор, который позволяет измерать входное напряжение от 0 до некоторого “эталонного” напряжения. В качестве эталона можно использовать как внешний источник, так и внутренний, номиналом 1.1 вольт. Последний вполне подходит. Задаем analogReference(INTERNAL) и получаем analogRead(A7) значение от 0 до 1023 что примерно соответствует милливольтам.
Обычно для измерения падения напряжения схема состоит из последовательно соединенных диода и резистора. Резистор подключается к 3.3V можно и к 5V, диод к GND, а с точки соединения снимается прямое напряжение на p-n переходе.
Схему можно собрать и не транзисторе, превратив его в диод, соединив коллектор и базу. Эмиттер транзистора npn подключем к земле, а коллектор с базой – к резистору.

pic2
Где-то на форуме прочитал, что можно еще упростить схему, используя внутренний подтягивающий резистор arduino. То есть подключаем эмиттер npn транзистора к земле, базу с коллектором, к примеру, к A7. Затем “подключаем внутренний резистор командой digitalWrite(A7, INPUT_PULLUP);”.

НЕ РАБОТАЕТ! Мало того что команда должна быть pinMode(A7, INPUT_PULLUP), но похоже резистор слишком велик, и падение напряжения получается нестабильным.

ВОТ ТАК НЕ РАБОТАЕТ:pic3
В качестве бонуса привожу код, получающий аналоговое значение без задержек. В регистры устанавливаем параметры для считывания, запускаем процесс, а результат опрашиваем когда нам удобно. Можно также сделать по прерыванию.

int t;

void setup() {
Serial.begin(115200);
//pinMode(A7,INPUT_PULLUP);
//first measure
ADMUX=0b11000111;//ref 1.1v, input A7
ADCSRA |= 0b01000000;//start bit
delay(300);
}

void loop() {
if ((ADCSRA & 0b01000000) == 0) { //if bit ADSC cleared
t=ADCL; //read it first, to lock adch
t|=(ADCH<<8);//read it last to unlock
}
Serial.println(t);
//start new conversion
ADCSRA |= 0b01000000;//start bit
delay(1000);
}

Обратите внимание на порядок считывания значения ADCL и ADCH

 

Advertisements

Leave a Comment »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: