Проект терморегистратора на базе MAX6675K

Рабочие проекты Ардуино
artur_mod
Сообщения: 5
Зарегистрирован: 04 июн 2018, 08:11

Проект терморегистратора на базе MAX6675K

Сообщение artur_mod » 05 июн 2018, 07:32

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

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

Покупать в этом году лаборатория ничего не планирует (там замкнутый круг, в начале нужен результат, а потом финансирование, а не наоборот), поэтому вместо ремонта и настройки старинного оборудования (очень много требует времени и главное результат проделанной работы того не стоит), я решил попытаться собрать ПИД-терморегулятор на базе Ардуино своими силами (китайские клоны довольно таки дешевы, и могу себе позволить). Но прежде чем делать терморегулятор, решил собрать терморегистратор.

Как оказалось, с пайкой у меня дела тоже обстояли не очень хорошо, но более менее стало получаться, правда усилитель для термопары из урока 27 пока собрать не удалось (спаял на макетке, но где-то коротит, и придется все переделывать). {Было бы классно в ближайшем будущем собрать усилитель на печатной плате, но её ещё нарисовать надо (научиться).}

Поэтому решил собрать терморегистратор на базе китайской версии микросхемы MAX6675K, которую тоже заказ из Поднебесной. Вообще в перспективе мне желательно всё-таки собрать усилитель, и более того, переделать его под термопару типа S (платина-платина родий), у меня в лаборатории имеются конечно и К-термопары, но S предпочтительнее использовать.

Ну всё, ближе к делу. Я посмотрел скетч из урока 27, и переработал его таким образом, чтобы написанная Эдуардом программа Thermometer заработала с MAX6675K и смогла накапливать данные. Цели этой я добился, а вот удовлетворения особого не получил, потому как пришлось смотреть библиотеку для MAX6675K а там сплошные прерывания с помощью функции delay.

Прикинул по времени сколько берет на себя библиотека, и в итоге получилось, что опрашивать датчик чаще чем каждые 300 мс не стоит, это как бы следует из того какие прерывания ставил автор библиотеки и "образцового" скетча. Я сократил до раз в 250 мс, т.о. что датчик опрашивается четыре раза в секунду, вроде так, а главное программа Termometr заработала. При двух мс понятное дело ниче не работало.

Теперь вот думаю, может имеет смысл переписать библиотеку для MAX6675, и как-то вычислить сколько на самом деле времени нужно этой микросхеме для передачи данных, хочется как-то почаще получать и получше усреднять данные с чипа. Плюс не хочется тормозить программу бесконечными delay, это как я понял из уроков не комильфо. Возможно такая маленькая скорость обращений будет мешать нормальной работе ПИД-термоконтроллера. Как считаете Эдуард, имеет смысл написать библиотеку с прерываниями MsTimer2? Или возможно лучше вообще создать отдельную функцию обращения к чипу MAX6675 и интегрировать её в будущую программу, вызывая с помощью общего программного таймера MsTimer2?

Я нашел описание инерфейса и скетч работающий напрямую с MAX6675 здесь: http://www.bristolwatch.com/ele2/therc.htm И наверное смог бы на его основе написать функцию.

termometrMAX6675K_rab1.zip
скетч терморегистратора на базе MAX6675K работает с программой Termometr
(1.14 КБ) 186 скачиваний


Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Проект терморегистратора на базе MAX6675K

Сообщение Эдуард » 05 июн 2018, 13:21

Здравствуйте!
В программе не совсем корректно вычисляется среднее значение температуры. Результатом вызова функции readCelsius() является число типа float а вы его суммируете в переменной long. Дробная часть теряется.
Зачем вам прерывание, если программа в нем зависает на 220 мс?

А что касается параллельной работы АЦП и программы, то возможностей много. Посмотрите как реализована фоновая работа АЦП Ардуино в уроке 65. Вы можете сделать так.
У MAX6675 есть два периода "зависания": процесс преобразования 220 мс и процесс чтения результата. Если вам достаточно выполнить в фоновом режиме только процесс преобразования, то можете это сделать как в уроке 65.
Процесс чтения результата можете выполнить побитно в быстром прерывании, например, 250 мкс. Можете использовать аппаратный SPI. Тогда распараллелить можно все, но мне кажется, что вам достаточно выполнить в фоновом режиме только преобразование.

artur_mod
Сообщения: 5
Зарегистрирован: 04 июн 2018, 08:11

Re: Проект терморегистратора на базе MAX6675K

Сообщение artur_mod » 07 июн 2018, 09:32

Здравствуйте!

Огромное спасибо за обратную связь. Для меня это важный момент.

Эдуард писал(а):В программе не совсем корректно вычисляется среднее значение температуры. Результатом вызова функции readCelsius() является число типа float а вы его суммируете в переменной long. Дробная часть теряется.


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

Эдуард писал(а):Зачем вам прерывание, если программа в нем зависает на 220 мс?


Честно говоря, не знаю. Первая идея была, заставить работать скетч из урока 27 и программу Termometr с MAX6675. Пошел по пути наименьшего сопротивления, убирая все не нужное в случае микросхемы в написанном вами скетче. Вторая идея заключалась в том, что хорошо бы работу MAX привязать к таймеру, с тем прицелом, что в перспективе нужно собрать на этой же базе ПИД-термоконтроллер, а там будет много операций и нужно как-то все распределить по времени, согласовать друг с другом.

Эдуард писал(а):А что касается параллельной работы АЦП и программы, то возможностей много. Посмотрите как реализована фоновая работа АЦП Ардуино в уроке 65. Вы можете сделать так.


Я не совсем хорошо понимаю последовательность операций, которые выполняются в связке Ардуино - MAX6675, но пытаюсь в этом разобраться. Посмотрел материалы по SPI в интернете, и понял как устроена полудуплексная связь в данном случае. Но как именно работает микросхема не очень понятно, хоть я и просматривал даташит. Сейчас у меня в голове такая картина. Ардуино с помощью одного канала сигнализирует МAX, что готов осуществлять передачу, с помощью другого канала задает тактовую частоту, и по третьему каналу идет побитное считывание с МАХ в реестр. Всего МАХ отдаёт 16 бит, из них биты с 14 по 3 представляют собой двоичное представление значения температуры. Затем НАВЕРНОЕ данные каким-то образом обрабатываются и получается температура уже в виде десятичного числа типа float.

Поправьте меня, пожалуйста, если я ошибаюсь в чем-либо.

Таким образом получается что есть как минимум три операции, которым требуется время на осуществление.

Одна это работа по измерению ЭДС термопары и датчика температуры окружающей среды и вычисление конечной температуры самой микросхемой МАХ6675.

Мне ничего не известно о том, сколько времени на это требуется. Не понятен мне и вот ещё какой момент. Вот мы отдали команду CS=LOW, тем самым выразили желание начать обмен информацией по протоколу SPI. Что при это происходит? У МАХ6675 уже есть обработанный результат измерений ЭДС и преобразованный в температуру, или же она воспринимает это как команду - произвести измерение и обработку?

В случае с усилителем термопары все понятно, мы сами измеряем и сами обрабатываем, и каждый процесс разнесен по времени. Т.е. каждый раз считывая с усилителя термопары значение ЭДС, мы можем провести всю логическую цепочку, и она будет по логике своей замкнутой, т.е. мы измерили, обработали а потом уже принимаем решение на основе измеренного. Поэтому довольно-таки легко определить какая стадия в данном процессе наиболее затратная по времени. И главное система работать будет в любом случае. Так как управляющее воздействие будет основано на измерение предшествующем ему. Если же МАХ в своем собственном ритме работает и обновляет данные в реестре, то тогда может быть вероятность, что управляющее воздействие будет сформировано на сигнале, который не соответствует текущему моменту.

Я так понимаю важно знать, с какой скоростью МАХ обновляет свои данные. Если это длительная операция, то от нее и будет зависеть
частота обращений к микросхеме в течении секунды.

Вторая операция, это передача данных, т.е. считывание по протоколу SPI информации с MAX6675. Тут вы указали (ниже), что на это требуется
около 250 мкс. Т.е. эта операция не влияет на частоту обращений к МАХ, ну по-большому счету.

Третья операция - это обработка полученных от МАХ данных уже самой Ардуиной. Вот тут не понятно, толи это Ардуино около 220 мс тратит на обработку данных, то ли сама МАХ на первой стадии? Получается что реально мы только четыре раза за секунду можем данные считать? Быстрее как в случае с усилителем термопары не получится?

Возможно ли в таком случае собрать ПИД-термоконтроллер, что бы он адекватно работал?

Эдуард писал(а):У MAX6675 есть два периода "зависания": процесс преобразования 220 мс и процесс чтения результата. Если вам достаточно выполнить в фоновом режиме только процесс преобразования, то можете это сделать как в уроке 65.
Процесс чтения результата можете выполнить побитно в быстром прерывании, например, 250 мкс. Можете использовать аппаратный SPI. Тогда распараллелить можно все, но мне кажется, что вам достаточно выполнить в фоновом режиме только преобразование.


Аппаратный SPI, имеется ввиду, подключение к спец.пинам и использование библиотеки SPI? У меня нет опыта в программировании Ардуино, поэтому я пытаюсь уловить направление ваших мыслей, но возможно у меня это плохо получается, поэтому я тут переспрашиваю так дотошно. Я так подозреваю, что за счет аппаратного SPI можно скорость повысить, правильно?

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Проект терморегистратора на базе MAX6675K

Сообщение Эдуард » 08 июн 2018, 23:19

Здравствуйте!
Я не работал с MAX6675. Бегло посмотрел описание.
Запуск преобразования происходит по переходу сигнала CS в высокое состояние. Алгоритм преобразования в фоновом режиме подобен алгоритму работы АЦП из урока 65.
Вы просто переводите CS в низкий уровень считываете данные по последовательному интерфейсу SPI.
По окончанию чтения данных переводите CS в высокий уровень. Начинается преобразование.
Программа выполняет другие задачи и через время не менее 220 мс считывает данные последнего преобразования и запускает новое.
Таким образом программа тратит время только на чтение данных MAX6675.
Само чтение данных происходит достаточно быстро. Но если вы хотите и его выполнить в фоновом режиме, то вам необходимо использовать аппаратный SPI микроконтроллера.
Всеми этими действиями вы не повышаете скорость преобразования MAX6675. Вы не сможете считывать данные чаще, чем через каждые 220 мс. Но в момент, когда идет преобразование программа сможет выполнять другие задачи. Например, обрабатывать данные предыдущего преобразования.


Вернуться в «Проекты Ардуино»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя