Измерение температуры с max31865 и pt100

enclouder
Offline
Зарегистрирован: 22.09.2014

Доброго времени суток. 

Приобрел плату max31865 и RTD pt100.

При измерении температур холодной и горячей воды, разница по времени между точным измерением около 7 секунд. Примерно такое же время мы получим при измерении температуры датчиком ds18b20, только стоит он в 10 раз дешевле, чем max31865.

В чем же может быть причина, что такая высокая продолжительность времени измерения температуры? В чем смысл дорогостоющей платы, если она измеряет температуру с такой же скоростью, что и обычный ds18b20? Может, причина в некачественном RTD pt100?

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

Скетч можно глянуть?

Даташит , сразу в начале "21ms (max) Conversion Time" .Или я ошибаюсь?

DS18B20 - до 125С . а PT100 - диапазон намного больше.

enclouder
Offline
Зарегистрирован: 22.09.2014

Штирлиц пишет:

Скетч можно глянуть?

Даташит , сразу в начале "21ms (max) Conversion Time" .Или я ошибаюсь?

DS18B20 - до 125С . а PT100 - диапазон намного больше.

Так в этом то и дело, в даташите одно - по факту другое.

Очень надеюсь что проблема в дешевой гильзе, тоесть во всем pt100 (170 рублей на алиэкспрессе: http://ru.aliexpress.com/item/Three-wire-precision-platinum-resistance-temperature-probe-pt100-4-30-500-thermocouple-Free-Shipping/2039115279.html?detailNewVersion=1)

Диапазон мне не так важен, за пределы 5 - 100 * C я не выйду.

/* BEFORE DOWNLOAD SKETCH TO BOARD PLEASE FILL-OUT CONFIGURATION DEFINITIONS BELOW!!!
*  MAX31865 RTD to digital converter sample code, v1.01
*  contact: mendresz at gmail dot com
*/

// CONFIGURATION
#define CPU "AVR"      // CPU="AVR" for UNO, NANO, MEGA boards, CPU="DUE" for Arduino Due
#define Rref 400       // Rfef = 400 if PT100 used, Rref = 4000 if PT1000 used
#define WIRE 3         // PT100/1000 has 2 or 3 or 4 wire connection
//#define DEBUG        // if defined, all register values printed out after every reading
// END OF CONFIGURATION 

#define CS 10

#include <SPI.h>

void configureMAX31865(){
  digitalWrite(CS, LOW);
  SPI.transfer(0x80);
  if (WIRE==2 || WIRE==4) SPI.transfer(0xC2);
  if (WIRE==3) SPI.transfer(0xD2);
  digitalWrite(CS, HIGH);
  delay(50);
} 

double CallendarVanDusen(double R){
  double a = 3.9083E-03;
  double b = -5.7750E-07;
  signed long R0=Rref/4;
//  double t;
  return (-R0*a+sqrt(R0*R0*a*a-4*R0*b*(R0-R)))/(2*R0*b);  
}

void printRegs(unsigned char *reg){
   Serial.println("Register values (all values in HEX format):");
  
  Serial.print("Configuration: ");
  Serial.println(reg[0], HEX);
  
  Serial.print("RTD MSBs: ");
  Serial.println(reg[1], HEX);
  
  Serial.print("RTD LSBs: ");
  Serial.println(reg[2], HEX);
  
  Serial.print("High Fault Treshold MSB: ");
  Serial.println(reg[3], HEX);
  
  Serial.print("High Fault Treshold LSB: ");
  Serial.println(reg[4], HEX);
  
  Serial.print("Low Fault Treshold MSB: ");
  Serial.println(reg[5]), HEX;
  
  Serial.print("Low Fault Treshold LSB: ");
  Serial.println(reg[6]), HEX;
  
  Serial.print("Fault Status: ");
  Serial.println(reg[7], HEX);
  
  Serial.println();
}

void setup(){
  Serial.begin(9600);
  SPI.begin();
  if (CPU=="AVR") SPI.setClockDivider(SPI_CLOCK_DIV128);
  if (CPU=="DUE") SPI.setClockDivider(200);
  SPI.setDataMode(SPI_MODE3);
  pinMode(CS, OUTPUT);
  
  digitalWrite(CS, HIGH);
  delay(100);
  configureMAX31865();
}

void loop(){
  unsigned char reg[8];          // array for all the 8 registers
  unsigned int i;
  unsigned int RTDdata;          // 16 bit value of RTD MSB & RTD LSB, reg[1] & reg[2]
  unsigned int ADCcode;          // 15 bit value of ADC, RTDdata >> 1, 0th bit of RTDdata is RTD connection fault detection bit
  double R;                      // actual resistance of PT100(0) sensor
  
  digitalWrite(CS, LOW);
  delay(10);
  SPI.transfer(0);                                     // start reading from address=0
  for (i=0; i<8; i++) reg[i]=SPI.transfer(0);            // read all the 8 registers
  delay(10);
  digitalWrite(CS, HIGH);

  RTDdata = reg[1] << 8 | reg[2];
//  Serial.print("RTD data: 0x");
//  Serial.println(RTDdata,HEX);
  
  if (RTDdata & 1) {
    if (Rref==400) Serial.println("PT100 sensor connenction fault!");
    if (Rref==4000) Serial.println("PT1000 sensor connenction fault!");
    Serial.println();
    configureMAX31865();
  }  
  else{ 
   // Serial.print("ADC code (decimal): ");
    ADCcode=RTDdata>>1;
  //  Serial.println(ADCcode,DEC);

    //Serial.print("Resistance: ");
    R=(double)ADCcode*Rref/32768;
    //Serial.print(R);
    //Serial.println(" Ohms");
    
   // Serial.print("Temperature: ");
    Serial.print(CallendarVanDusen(R));
    //Serial.println(" deg. C");
    Serial.println();
  }

  #ifdef DEBUG
    printRegs(reg);
  #endif 

  delay(100);
}

лишние выводы сообщений убрал (//), чтоб ничего не отвлекало от цифр температуры

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

Исключите гильзу , подключив резистор на 100 Ом..

Попробуйте пример из библиотеки на этой странице

правда там используется делей в 1,5 сек в цикле.

enclouder
Offline
Зарегистрирован: 22.09.2014

Штирлиц пишет:

Исключите гильзу , подключив резистор на 100 Ом..

Попробуйте пример из библиотеки на этой странице

правда там используется делей в 1,5 сек в цикле.

Хорошо, другой код я конечно попробую.

Однако, что мне даст подключенный резистор на 100 Ом? Он же не подстроечный, у меня будет одна постоянная температура. А мне не столько важна точность (1-2 градуса погрешности не критичны), сколько скорость измерения температуры.

Честно говоря, я сильно сомневаюсь что код от PWF как то исправит ситуацию. Завтра протестирую, по результатам отпишусь. Спасибо.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

1. 130 Ом
2. 510 Ом параллельно к нему через кнопку.

Нажимаем кнопку- ваша темперамура "мгновенно" скакнула с +80 на +10, и балуйтесь, балуйтесь, балуйтесь....
 

enclouder
Offline
Зарегистрирован: 22.09.2014

trembo пишет:

1. 130 Ом
2. 510 Ом параллельно к нему через кнопку.

Нажимаем кнопку- ваша темперамура "мгновенно" скакнула с +80 на +10, и балуйтесь, балуйтесь, балуйтесь....
 

Это нужно чтоб исключить фактор нагревания гильзы и быть уверенным в скорости измерении сопротивления микросхемой?

sadman41
Offline
Зарегистрирован: 19.10.2016

Приподыму тему с теоретическим вопросом (все картинки после текста кликабельны).

Вот есть в интернетах два типа модуля MAX31865 - от Adafruit и широко известного бренда Noname. Отличия вижу, как минимум, в Ref-резисторе. На Adafruit - 4300 (430 Ом с допуском в 0.1% (?)), на Noname - 431 (430 Ом с допуском в ХЗ%). 

Вопрос - Noname модуль с таким рефренсом будет измерять лучше, чем схема на LM324, приведенная в этом посте форума или покупка его - деньги на ветер?

 

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

Вообще-то это две разные вещи. Ковертер( с 15-бит) и ОУ к Ардуино с 10-бит АЦП. В теории  на МАХ31865 точность и стабильность показаний должна быть лучше. Но цена первого на порядок выше второго варианта. Да и время доставки.Но все зависит от того какая точность вам нужна. Да и схему на ЛМ324 нужно доработать немного.

sadman41
Offline
Зарегистрирован: 19.10.2016

Да я понимаю, что это разные вещи. Мне интересно - будет ли конвертор с фиговым резистором работать лучше, чем схема на рассыпухе. Будет тот же самый плюс-минус лапоть или всё же получше.

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

sadman41 пишет:

Да я понимаю, что это разные вещи. Мне интересно - будет ли конвертор с фиговым резистором работать лучше, чем схема на рассыпухе. Будет тот же самый плюс-минус лапоть или всё же получше.

Мне кажется в любом случае будет лучше. А резистор Vref можно заменить на 1процентный.Но лично я делаю на лм324.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

а реально мерять до -100С ??

max31865 и pt100