Arduino UNO, термопара типа К, max31855KASA+
- Войдите на сайт для отправки комментариев
Ср, 07/05/2014 - 07:34
Ребята, суть проблемы такова. Есть термопара типа К и микросхема для работы с ней 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 версии кода, все выдают странные значения изначально отрицательные. Помогите. пожалуйста, разобраться.
Понимаю, что никому не интересно помогать в теме "сделайте за меня" и я даже не знаю как попросить вас) но просто непонятно где хотя бы текст выводимый изменить и время, через которое обновляются данные, хотя раньше хоть с этим проблем не было.
Может откалибровать надо?
Я года два назад сделал термометр на этой микросхеме. Посмотрите мой код, от без библиотек. Может чем поможет.
/* Программа опроса термопреобразователя 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" для просмотра температуры на мобильных устройствах, например карманном ПК или мобильном телефоне. */Вроде не надо.
Спасибо, обязательно попробую)
Использовал ваш код. Если термопару не трогать, то выдаёт -270. В комментарии написано, что это ошибка подключения термопары. Как только беру горячий спай пальцами, то значение прыгает от -270 до -200. Не подскажете с чем это может быть связано?
Всё, что пока могу посоветовать, это: проверить монтаж (не забыть про землю); соответсвтвие назначения пинов термопреобразователя; учесть, что питание термопреобразователя ДО четырёх вольт. А как запитана у Вас?
/sites/default/files/u3495/plata_obshchiy_vid_1.jpg
/sites/default/files/u3495/plata_so_storony_payki.jpg . Проверил код (взял его отсюда, с сайта). Работает.
Я просто на макетке подключаю термопару к микросхеме, от микросхемы к Arduino, питание 5V от USB. У вас там обвязка ещё. Нужно же термопару напрямую к микросхеме по даташиту?
http://s019.radikal.ru/i612/1405/e8/0547ba4ec9fa.jpg
Я вопрос не понял. А питание не должно превышать +4 В. Обвязка (2 кОм, 3 кОм) нужна для сопряжения ардуины (+5 В) с термопреобразователем (+3,3 В). Если иначе - как повезёт (должно НЕ поветси).
Я имею ввиду без обвязки подключаю напрямую, т.е. микросхема питается от 5В. Обалдеть, перепутал, думал она от 5В работает, а максимум 4. Вообще можно питать микросхему от ардуины 3.3В без обвязки? Есть же такой выход у arduino uno.
И, видимо, я сжёг микруху, раз пробовал питать от 5В.
Запитать от 3,3 В и делитель на входы 2 кОм, 3 кОм (обязательно). Выход можно подать без обвязки, напрямую в ардуину. Может микросхема ещё живая, раз не греется.
В даташите указано, что 3.3В это нормально. А зачем обвязка на вход тогда? На входы это между термопарой и микросхемой?
На входы, это на выводы CS (6) и SCK (5). Не хорошо получается, если питание +3,3 В, а на входе +5 В (микросхема запитывается " не тудою").
Спасибо за ответы, попробую, буду надеятся, что не спалил микруху.
Разрешите уточнить: если всё-таки на выход поставить, как на схеме, резистор на 470 Ом и стабилитрон, то можно поставить стабилитрон не кс136, а BZX55-C3V3 или BZX55-C3V6? И что конкретно делает эта обвязка на входы/выход?
На выход ставить резистор 470 Ом и стабилитрон 3V3 не обязтельно (я поставил для перестраховки, т.к. экспериментировал на длинной линии + ещё какие то особенности были). А BZX55-C3V3 или BZX55-C3V6 ствить можно, если питание териопреобразователя не более +3 вольт. Резисторы на 2 и 3 кОм образуют делитель. Т.е. с микроконтроллера ардуины приходит 5 вольт, а делитель уменьшает напряжение на входе термопреобразавателя до трёх вольт (можно и другие номиналы, на не очень маленькие или очень большие).
Вот, про делители и понять никак не могу, я же подключаю микросхему к 3,3В на ардуине, откуда там 5В?
Измерьте напряжение питания микроконтроллера на плате. Если оно 3,3 вольта, то резисторы не нужны.
Спасибо за ваши ответы и помощь, всё заработало. Теперь осталось ещё 3 термопары присоединить, попробую с помощью герконовых реле и транзисторов управлять поочерёдно термопарами.
Так какое питание у микроконтроллера? А про подключение термопар через реле интересно (хоть и мало верится в положительный результат). Отпишитесь о результатах.
Что-то я не вкурю никак: где Вы в даташите увидели конденсатор между выводами Т+ и Т-? Между 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.
как калибровать термопару? замерить на сколько врет и учитывать в программе?
и особо от мах6675 вроде не отличается, несмотря на большее разрешение 14 бит шаг тот же 0.25, больше пределы измерения, питание не 5 а 3.3...
В интернетах пишут, что алишные модули с этими максами безбожно врут... калибруй, не калибруй...
Рекомендованный способ согласования с использованием диодов и подтяжки к "+ " 10 Килоомами не заработал а вот при помощи делителя Ок