Arduino UNO, термопара типа К, max31855KASA+

positivemann
Offline
Зарегистрирован: 20.04.2014

Ребята, суть проблемы такова. Есть термопара типа К и микросхема для работы с ней max31855KASA+. Один хороший человек (а вообще ещё один до него) написал для неё библиотеку и код, чтобы всё работало и замеряло. Ссылка на форум, где он пишет об этом, а так же на github. До него ещё один человек написал библиотеку для неё, ей я ещё не воспользовался.

И я не могу понять как это работает, что в итоге получилось.  При использовании demo4 при прослушивании порта выводит следующее:

Start max31855_demo3: 0.1.03
 
10x read: 5344
getTemperature: 4
getInternal: 0
 
-56.00
26.75
 
change: 65812
counter: 125
-56.00
-61.75
 
change: 73088
counter: 139
-61.75
-62.00
 
change: 73048
counter: 139
-62.00
-62.50
 
change: 147648
counter: 281
-62.50
-62.25
.............
 Если беру горячий спай термопары пальцами, то значение тут же меняется с -60 до примерно -20, кратковременное действие зажигалки даёт что-то около 120. Почему изначально показывает отрицательные значения?
Подключил питание к +5V, GND рядом с 5М, цифру подключил к соответствующим номерам на Arduino, т.е.: 5(SCK) - 5, 6(CS) - 6, 7(SO) - 7. Как я понял он именно так делал. Всего у него 4 версии кода, все выдают странные значения изначально отрицательные. Помогите. пожалуйста, разобраться.
positivemann
Offline
Зарегистрирован: 20.04.2014

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

Geronimo
Offline
Зарегистрирован: 06.05.2013

Может откалибровать надо?

gena
Offline
Зарегистрирован: 04.11.2012

  Я года два назад сделал термометр на этой микросхеме. Посмотрите мой код, от без библиотек. Может чем поможет.

 /*  Программа опроса термопреобразователя MAX31855K по интерфейсу SPI и
выводу прочитанных данных на скорости 9600 8N1 через UART микроконтроллера 
ATmega8A-PU в СОМ порт РС (и параллельно в модуль Bluetooth RS-232).
    Назначение выводов ARDUINO:
    D10 = "/CS" - выход, выбор кристалла термопреобразователя,
    D12 = "SO" - вход, данные из термопреобразователя на микроконтроллер,
    D13 = "SCK" - выход, тактирование термопреобразавателя. 
 */
 
    byte CS = 10;                                  // назначение вывода D10 ARDUINO как "/CS" для MAX31855K
    byte SO = 12;                                  // назначение вывода D12 ARDUINO как "SO" для MAX31855K 
    byte SCK_ = 13;                                // назначение вывода D13 ARDUINO как "SCK" для MAX31855K
 
void setup () 
{   pinMode(CS, OUTPUT); digitalWrite(CS, HIGH);   // выход, выбор кристалла - "/CS" = 1
    pinMode(SO, INPUT);                            // вход, данные из термопреобразователя - "SO"       
    pinMode(SCK_, OUTPUT); digitalWrite(SCK_, LOW);// выход, тактирование считываемых данных - "SCK" = 0
    Serial.begin(9600) ;                           // настройка COM порта ARDUINO на скорость 9600
}
    byte Fault;                                    // бит ошибки подключения термопары, если равен "1" - то ошибка   
    byte Sign;                                     // бит знака температуры, если равен "1" - то температура отрицательная
    
void loop ()                                       // основная программа
{   
START:                                             // начало программы
    delay(500);                                    // пауза между измерениями, милли секунды 
    word Temp ;                                    // значение температуры в градусах
    byte Temp_;                                    // значение десятых долей градуса температуры
    
 // -----------------------------------------------
 // Чтение бит D31...D16 из микросхемы MAX31855K
 
    digitalWrite(CS, LOW);                         // активация MAX31855K, "/CS" = 0 
    digitalWrite(SCK_, HIGH);                      // задать "SCK" = 1
    Sign = digitalRead (SO);                       // чтение знака температуры термопары "Sign", бит D31
    digitalWrite(SCK_, LOW);                       // задать "SCK" = 0    

    Temp = 0;                                      // Temp = 0
    byte Dxx = 13;                                 // задание Dxx, т.е. количества считываемых бит
    while (Dxx != 0)                               // повторять до тех пор, пока Dxx не станет равно нулю:
        { digitalWrite(SCK_, HIGH);                // задать "SCK" = 1
          Temp = Temp << 1;                        // сдвиг Temp на один разряд влево
          if(digitalRead (SO)==1)                  // чтение бит температуры от D30 до D18 с
              {bitSet(  Temp,0);}                  // установкой в "1" нулевого бита переменной Temp (если это нужно)
          digitalWrite(SCK_, LOW);                 // задать "SCK" = 0               
          Dxx = Dxx -1 ;                           // декрементирование Dxx
        }             
 
    digitalWrite(SCK_, HIGH);                      // задать "SCK" = 1, холостой такт, бит D17
    digitalWrite(SCK_, LOW);                       // задать "SCK" = 0, холостой такт
    
    digitalWrite(SCK_, HIGH);                      // задать "SCK" = 1
    Fault = digitalRead(SO);                       // чтение бита ошибки подключения термопары Fault, бит D16
    digitalWrite(SCK_, LOW);                       // задать "SCK" = 0        

    digitalWrite(CS, HIGH);                        // деактивация MAX31855K - "/CS" = 1
    
 // -----------------------------------------------
 // Анализ бита "Fault" и действия программы если есть ошибка подключения термопары    
    
    if(Fault == 1)                        
      {   Serial.println ("-270");                 // отправка числа "-270" в СОМ порт
                                                   // при ошибке подключения термопары
          goto START;                              // переход на начало программы
      }

 // -----------------------------------------------   
 // Преобразование отрицательной температуры в положительное число

    if (Sign == 1) {Temp = ~ Temp;                 // инвертирование переменной Temp                
                    Temp = Temp + 1;               // инкрементирование переменной Temp
                    Temp = Temp & 8191;            // обнуление старших разрядов Temp
             if (Temp >= 1080)                     // ограничение отрицательной температуры
                   {Temp = 1080;}                  // величиной "-270.0" град С (270 D = 100 0011 1000 B)                                        
                   }
                   
 // -----------------------------------------------                   
 // Разделение измеренной температуры на целые и десятые доли градуса  
 
    Temp_ = Temp & 3;                              // выделение десятых долей градуса температуры
    Temp = Temp >> 2;                              // выделение целых градусов температуры
    if (Temp >= 1372)                              // ограничение выводимой на график температуры 
                   {Temp = 1372; }                 // величиной +1372 град С (в случае положительной
                                                   // температуры)
 // -----------------------------------------------                                                    
 // Вывод температуры в СОМ порт       
 
    if (Sign == 1) {Serial.print ("-" );}          // вывод знака "-" для отрицательных значений
    Serial.print (Temp);                           // вывод температуры в градусах
    Serial.print (",");                            // вывод знака ","
    byte T_0 = ((5*bitRead(Temp_,1)) + (3*bitRead(Temp_,0))); // вычисление значения десятых
    Serial.println (T_0);                          // вывод десятых долей градуса  
 
}

 /* Программа опрашивает микросхему термопреобразователя MAX31855K работающей с термопарой "К" типа
по интерфейсу SPI, проверяет отсутствие ошибки подключения термопары. Если есть ошибка подключения,
то в программу передаётся значение "-270". Это должно привлечь внимание пользователя, т.к. таких низких 
температур достичь почти не возможно. При отсутствии ошибки проверяется знак температуры и если 
температура отрицательная, то её значение преобразовывается в положительное значение. Величина 
отрицательной температуры ограничивается значением "-270,0" град С, а положительная температура 
ограничивается значением "1372" град С (на графике это проявляется как ограничение линии температуры). 
Затем вычисляются целые и десятые доли градуса. Если температура больше 1000 град С, то десятые доли 
градуса в программу визуализации не отправляются. Полученные значения отправляются через СОМ порт в 
РС и возможно параллельно в модуль "Bluetooth RS-232" для просмотра температуры на мобильных устройствах, 
например карманном ПК или мобильном телефоне.
*/

 

positivemann
Offline
Зарегистрирован: 20.04.2014

Цитата:
Может откалибровать надо?

Вроде не надо. 

  

Цитата:
Я года два назад сделал термометр на этой микросхеме. Посмотрите мой код, от без библиотек. Может чем поможет.

Спасибо, обязательно попробую)

positivemann
Offline
Зарегистрирован: 20.04.2014

Использовал ваш код. Если термопару не трогать, то выдаёт -270. В комментарии написано, что это ошибка подключения термопары. Как только беру горячий спай пальцами, то значение прыгает от -270 до -200. Не подскажете с чем это может быть связано?

gena
Offline
Зарегистрирован: 04.11.2012

  Всё, что пока могу посоветовать, это: проверить монтаж (не забыть про землю); соответсвтвие назначения пинов термопреобразователя; учесть, что питание термопреобразователя ДО четырёх вольт. А как запитана у Вас?

gena
Offline
Зарегистрирован: 04.11.2012
gena
Offline
Зарегистрирован: 04.11.2012

/sites/default/files/u3495/plata_so_storony_payki.jpg . Проверил код (взял его отсюда, с сайта). Работает.

positivemann
Offline
Зарегистрирован: 20.04.2014

Я просто на макетке подключаю термопару к микросхеме, от микросхемы к Arduino, питание 5V от USB. У вас там обвязка ещё. Нужно же термопару напрямую к микросхеме по даташиту?

http://s019.radikal.ru/i612/1405/e8/0547ba4ec9fa.jpg

 

gena
Offline
Зарегистрирован: 04.11.2012

  Я вопрос не понял. А питание не должно превышать +4 В. Обвязка (2 кОм, 3 кОм) нужна для сопряжения ардуины (+5 В) с термопреобразователем (+3,3 В). Если иначе - как повезёт (должно НЕ поветси).

positivemann
Offline
Зарегистрирован: 20.04.2014

Я имею ввиду без обвязки подключаю напрямую, т.е. микросхема питается от 5В.  Обалдеть, перепутал, думал она от 5В работает, а максимум 4. Вообще можно питать микросхему от ардуины 3.3В без обвязки? Есть же такой выход у arduino uno.

И, видимо, я сжёг микруху, раз пробовал питать от 5В.

gena
Offline
Зарегистрирован: 04.11.2012

Запитать от 3,3 В и делитель на входы 2 кОм, 3 кОм (обязательно). Выход можно подать без обвязки, напрямую в ардуину. Может микросхема ещё живая, раз не греется.

positivemann
Offline
Зарегистрирован: 20.04.2014

В даташите указано, что 3.3В это нормально. А зачем обвязка на вход тогда? На входы это между термопарой и микросхемой?

gena
Offline
Зарегистрирован: 04.11.2012

На входы, это на выводы CS (6) и SCK (5). Не хорошо получается, если питание +3,3 В, а на входе +5 В (микросхема запитывается " не  тудою").

positivemann
Offline
Зарегистрирован: 20.04.2014

Спасибо за ответы, попробую, буду надеятся, что не спалил микруху.

positivemann
Offline
Зарегистрирован: 20.04.2014

Разрешите уточнить: если всё-таки на выход поставить, как на схеме, резистор на 470 Ом и стабилитрон, то можно поставить стабилитрон не кс136, а BZX55-C3V3 или BZX55-C3V6? И что конкретно делает эта обвязка на входы/выход?

gena
Offline
Зарегистрирован: 04.11.2012

 На выход ставить резистор 470 Ом и стабилитрон 3V3 не обязтельно (я поставил для перестраховки, т.к. экспериментировал на длинной линии + ещё какие то особенности были). А BZX55-C3V3 или BZX55-C3V6 ствить можно, если питание териопреобразователя не более +3 вольт. Резисторы на 2 и 3 кОм образуют делитель. Т.е. с микроконтроллера ардуины приходит 5 вольт, а делитель уменьшает напряжение на входе термопреобразавателя до трёх вольт (можно и другие номиналы, на не очень маленькие или очень большие).

positivemann
Offline
Зарегистрирован: 20.04.2014

Вот, про делители и понять никак не могу, я же подключаю микросхему к 3,3В на ардуине, откуда там 5В?

gena
Offline
Зарегистрирован: 04.11.2012

 Измерьте напряжение питания микроконтроллера на плате. Если оно 3,3 вольта, то резисторы не нужны.

positivemann
Offline
Зарегистрирован: 20.04.2014

Спасибо за ваши ответы и помощь, всё заработало. Теперь осталось ещё 3 термопары присоединить, попробую с помощью герконовых реле и транзисторов управлять поочерёдно термопарами.

gena
Offline
Зарегистрирован: 04.11.2012

 Так какое питание у микроконтроллера? А про подключение термопар через реле интересно (хоть и мало верится в положительный результат). Отпишитесь о результатах.

Gdalex
Offline
Зарегистрирован: 06.10.2015

Что-то я не вкурю никак: где Вы в даташите увидели конденсатор между выводами Т+ и Т-? Между VCC и GND - есть. А вот для подключения термопары ничего не надо: "The device includes signal-conditioning hardware to convert the thermocouple’s signal into a voltage compatible with the input channels of the ADC. The T+ and T- inputs connect to internal circuitry that reduces the introduction of noise errors from the thermocouple wires.", что в вольном переводе означает: "Устройство включает в себя аппаратную обработку сигналов для преобразования сигнала термопары в напряжение, совместимое с входными каналами АЦП. Входы T+ и T- подключаются к внутренней схеме, что уменьшает появление шумовых ошибок от проводов термопары."

Т.е. все фильтры в самом чипе уже присутствуют. Кроме того, на сколько я понимаю в "колбасных обрезках", ограничивать уровень логической 1 нужно только на входах CS и SCK. SO - выход и контролеру пофиг что 3.3В, что 5.0В - это все равно больше 2.7В, что соответствует логической 1. 

MacSim
Offline
Зарегистрирован: 28.11.2012

как калибровать термопару? замерить на сколько врет и учитывать в программе?

и особо от мах6675 вроде не отличается, несмотря на большее разрешение 14 бит шаг тот же 0.25, больше пределы измерения, питание не 5 а 3.3...

 

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

В интернетах пишут, что алишные модули с этими максами безбожно врут... калибруй, не калибруй...

Ksenia
Offline
Зарегистрирован: 19.05.2022

Рекомендованный способ согласования с использованием диодов и подтяжки к "+ "    10 Килоомами не заработал а вот при помощи делителя Ок