Как считывать температуру с помощью платы arduino uno с датчиком RTD PT100?

Я новичок в программировании на ардуино. И почти неопытный.

Я хочу запрограммировать свою плату Arduino Uno для чтения 2/3/4-проводной конфигурации датчика RTD PT100 (с точностью не менее 0,5 ° C). Диапазон температур составляет от 0 до 400°C и от -50 до 100°C.

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

Я много исследовал эту тему, но не смог найти ничего полезного или существенного для решения моей проблемы.

Кроме того, я не могу использовать термистор или какую-либо микросхему для считывания температуры, поскольку машина, на которой установлен RTD, имеет PID, но я хотел бы создать регистратор данных, который мог бы получать температуру на самом компьютере.


person Mayur Agarwal    schedule 03.05.2015    source источник
comment
Привет, я думаю, вы получите лучшие ответы здесь -› arduino.stackexchange.com   -  person Andreas    schedule 03.05.2015
comment
Спасибо. Я новичок на этом сайте. Попробую.   -  person Mayur Agarwal    schedule 03.05.2015
comment
Нет проблем, я думаю, что это был правильный сайт до того, как был создан тот, на который я ссылался, поэтому все доступные теги :)   -  person Andreas    schedule 03.05.2015


Ответы (2)


PT100 увеличивает свое сопротивление при воздействии тепла. Характеристика зависимости температуры от сопротивления описана в таблице сопротивления pt100< /а>

Arduino может считывать напряжение на аналоговом входе. Чтобы получить показания градусов Цельсия, мы должны:

  1. читать аналоговый вход как напряжение
  2. рассчитать значение сопротивления (делитель напряжения)
  3. поиск градусов Цельсия из таблицы на основе сопротивления

делитель напряжения

Vin — это 5 вольт от arduino R1 — это сопротивление известного значения в моей программе, оно составляет 220 Ом, на самом деле R2 — это pt 100 Vout, который должен быть подключен к аналоговому входному контакту arduino (например, A0)

R2 = R1 * 1 / (Vin/Vвых - 1)

Схема может быть сделана на основе рисунка выше, она довольно проста.

Скетч, который я написал, содержит данные сопротивления от 0°C до 80°C (может быть легко расширен). Чтобы получить градусы из значения сопротивления, я использую мою версию функции MultiMap, которая использует один массив с плавающей запятой в качестве значений сопротивления и использует линейную интерполяцию. вычислить точные степени

float in[] = { 100.00, 100.39, 100.78, 101.17, 101.56, 101.95, 102.34, 102.73, 103.12, 103.51,
               103.90, 104.29, 104.68, 105.07, 105.46, 105.85, 106.24, 106.63, 107.02, 107.40,
               107.79, 108.18, 108.57, 108.96, 109.35, 109.73, 110.12, 110.51, 110.90, 111.29,
               111.67, 112.06, 112.45, 112.83, 113.22, 113.61, 114.00, 114.38, 114.77, 115.15,
               115.54, 115.93, 116.31, 116.70, 117.08, 117.47, 117.86, 118.24, 118.63, 119.01,
               119.40, 119.78, 120.17, 120.55, 120.94, 121.32, 121.71, 122.09, 122.47, 122.86,
               123.24, 123.63, 124.01, 124.39, 124.78, 125.16, 125.54, 125.93, 126.31, 126.69,
               127.08, 127.46, 127.84, 128.22, 128.61, 128.99, 129.37, 129.75, 130.13, 130.52 };

// known resistance in voltage divider
int R1 = 217;

float MultiMap(float val, float* _in, uint8_t size)
{
  // calculate if value is out of range 
  if (val < _in[0] ) return -99.99;
  if (val > _in[size-1] ) return 99.99;

  //  search for 'value' in _in array to get the position No.
  uint8_t pos = 0;
  while(val > _in[pos]) pos++;  

  // handles the 'rare' equality case
  if (val == _in[pos]) return pos;

  float r1 = _in[pos-1];
  float r2 = _in[pos];
  int c1 = pos-1;
  int c2 = pos;

 return c1 + (val - r1) / (r2-r1) * (c2-c1);
}

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);

}
void loop() {
  // put your main code here, to run repeatedly:
   int pt100 = analogRead(A0);


   float Vout = pt100 * (5.0 / 1023.0);
   float R2 = R1 * 1/(5.0/Vout - 1);

float c =  MultiMap(R2,in,80);

Serial.print("Resistance: ");
Serial.print(R2);
Serial.println(" Ohm");

Serial.print("Temperature: ");
Serial.print(c);
Serial.println(" C");


delay(400);
}
person Chris    schedule 09.02.2016
comment
Что касается точности: используемое значение сопротивления для каждого целого градуса, т.е. 0C -> 100 Ом 1C -> 100,39 и т. д. - person Chris; 10.02.2016
comment
Значение сопротивления R1 должно быть как можно более точным и точным. Сначала я задал в программе 220 Ом, как и должно было быть, но на самом деле это было 217 Ом (измерено мультиметром). Это означало минимум 3 градуса !!!!! - person Chris; 10.02.2016

Крис, хотя ваше решение работает, есть место для улучшения.

1) подтягивание 220 Ом слишком маленькое. Через pt100 постоянно протекает заметный ток, который может повлиять на точность. Очень минималистичный подход состоит в том, чтобы увеличить подтягивание, чтобы уменьшить этот ток, и усилить напряжение на делителе, см. http://www.avrfreaks.net/sites/default/files/pt100.JPG

2) как только появятся заметные кабельные трассы и стандартная промышленная среда, вы можете принять решение о стандартной планировке моста. При этом используются четыре провода, два из которых используются в качестве источника постоянного тока. (В отличие от подтягивающего резистора, источник постоянного тока обеспечивает стабильные показания во всем диапазоне и должен иметь лучшую температурную стабильность. Сам простой подтягивающий резистор может иметь значительный дрейф. Два других провода используются в качестве дифференциального входа. По этим проводам ток не течет. , поэтому фактическое расстояние проводки датчика не повлияет на точность. Этот подход показан здесь: https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/4wire2.svg/286px-4wire2.svg.png и фактически все промышленные датчики работают по этому принципу.

3) вы можете предпочесть использовать аналоговый интерфейс вместо создания собственной аналоговой схемы. AD7714 http://www.seekic.com/circuit_diagram/Measuring_and_Test_Circuit/Temperature_measurement_circuit_composed_of_of_ > и множество других профессиональных решений здесь: http://www.ti.com/europe/downloads/2-%203-%204-Wire%20RTD%20Measurement.pdf

person Gee Bee    schedule 29.03.2016