Преобразователь max6675, вопрос по работе.
- Войдите на сайт для отправки комментариев
Втр, 29/09/2015 - 10:49
Заказывал на Али адаптер-преобразователь max6675 в комплекте с термопарой K-типа, еще отдельно другую термопару того же типа. Прикрутил его к Ардуино-Уно, все работает, с обеими термопарами, но показания считываются нестабильные, опрашиваю раз в секунду, гуляет в пределах 1 градуса. Например при температуре 24 градуса, показания могут быть из ряда 23,50; 23,75; 24,00; 24,25; 24,50. Причем эта нестабильность одинакова с тремя подопытными термопарами, третья тоже К-типа от китайского тестера. Это вообще нормально? Может я слишком много от него хочу? Но мне нужна точность хотя бы 0,25градуса.
Видимо никто не заморачивался такой точностью, термопарой ведь измеряют обычно высокие температуры и колебания +/- 0,5гр в этом случае не критичны. Пробовал подавать на адаптер милливольты с калибратора КИСС-03 имитируя термопару, результат тот же, показания гуляют +/- 0,5гр, но если сделать несколько выборок и потом усреднить, то выходит более менее стабильно.
При температуре 25 град. абсолютная погрешность в 0,25 град. соответствует относительной в 1%. Промышленный прибор, который дает такую точность, например Метран-271, в обычном исполнении стоит порядка 12000 рублей и каждый год его нужно поверять. Если Вас устроит не точность, а кратковременная стабильность показаний, то да, при отсутствии в сигнале резких выбросов решить задачу можно усреднением большого числа показаний.
.
Пришлось все же усреднять вот таким образом
Все равно плавает, но уже в пределах 0,2 градуса, меня это устраивает. Пробовал делать 20 и 30 выборок, эфект тот же, только дольше, между выборками приходится тормозить на 300мс. Теперь другая проблемка, сравнил с ртутным лабораторным термометром, при 20 градусах разница в 2,5градуса.
откалибруй тогда, только тебе нужен термометр точнее твоего для всего диапазона
Да термометр не проблема, морока блин. А если я потом другую термопару поставлю, все по новой калибровать? Что то я не помню, из своего далекого киповского прошлого, чтоб мы что то калибровали при замене термопары. Вторичные приборы калибровались таким большим ящиком который выдавал милливольты, сейчас калибруют КИССом по градуировочной таблице и никакой привязки к конкретной термопаре. Адаптер свой я проверил КИССом, значит выходит что термопара барахло или ртутник брешет? Прийдется в КИП идти чтоб термопары мои проверили, а заодно и ртутник.
а что ты хотел. купи дорогой калиброванный датчик. если купил набор за 250 рублей не расчитывай на точность киповского прибора)))
ну вообще хотелось бы), хотеть не вредно. Кстати у меня три разные термопары показывают одну и ту же температуру, грешу все же еще на ртутник, он давнишний и сто лет не поверялся.
ну тем более
Провел опыт, подключал термопары к КИССу, комнатную температуру показывают все однаково. Опустил в стакан с теплой водой, все три показывают одинаково 42гр, ртутник 38гр. Накидал льда в стакан, только две из 3х показали 0гр и ртутник тоже 0гр, одна аж -12 показала. На кипятке надо еще проверить.
Пробовал делать 20 и 30 выборок, эфект тот же, только дольше, между выборками приходится тормозить на 300мс. Теперь другая проблемка, сравнил с ртутным лабораторным термометром, при 20 градусах разница в 2,5градуса.
а что ты хотел. купи дорогой калиброванный датчик. если купил набор за 250 рублей не расчитывай на точность киповского прибора)))
Все забыли формулу:
«делаю ремонт! Быстро, качественно, не дорого – любые два варианта» :)
«делаю ремонт! Быстро, качественно, не дорого – любые два варианта
Я видел людей, которые на этих датчиках делали термоподвески для измерения температурного поля в элеваторах. Вполне рабочий вариант. Но точность у DS18B20 0,5 град., а Вы хотели 0,25. В описании к датчику точность и разрешающую способность разделяют совершенно четко.
«делаю ремонт! Быстро, качественно, не дорого – любые два варианта
нету трех, есть ДВА ИЗ трех. три комбинации, и никак иначе :)
Автор интересно мыслит -- для точных измерений нужен только точный датчик, а все остальное может быть каким хошь горбатым. А то, что ардуино без принятия специальных мер будет эталонный сигнал измерять всякий раз по разному, это почему-то оказывается за скобками. Взялись измерять аналоговые сигналы, добро пожаловать в мир аналоговой электроники, где нет ничего точного.
только если они в регуляторе, время усреднения не должно быть выше времени реакции (регулирования), а то получится осциллятор… уж больно жесткие требования у Вас к точности :)
UPDю справедливо для установившегося процесса...
Взялись измерять аналоговые сигналы, добро пожаловать в мир аналоговой электроники, где нет ничего точного.
Да. В аналоговой электронике элементы и схемы не работают, а "ведут себя". :))
Автор интересно мыслит -- для точных измерений нужен только точный датчик, а все остальное может быть каким хошь горбатым.
а как выборкой выдерают в дальномере сигнал из шумов тогда? шумы в корень из N раз ниже....
UPD. здесь тоже нормальный закон распределения - теория вероятности
только если они в регуляторе, ...
1. Убьемся тогда коллективно. Лучше "закрыть капот, там столько всего..." :))
2. А вообще-то началась классическая форумная забава. Автор говорит слово, а самовыдвиженцы из форумчан пытаются обрисовать другим полную статУю того "сферического коня в вакууме". Автор посмеется и еще полслова скажет. Так и идет...
а как выборкой выдерают в дальномере сигнал из шумов тогда? шумы в корень из N раз ниже....
И с какой точностью этот дальномер измеряет? До долей миллиметра, надеюсь?
а как выборкой выдерают в дальномере сигнал из шумов тогда? шумы в корень из N раз ниже....
И с какой точностью этот дальномер измеряет? До долей миллиметра, надеюсь?
есть дальномеры для измерения скорости горения ВВ (пороха) :) дальномеры разные
Опять же, ничего про точность. А в начале топика вопрос был про непостоянтсво значений после запятой или в младшем разряде.
Подниму тему, поскольку вопрос тоже по работе такого преобразователя.
Вопрос - можно ли как-то ускорить его работу? Опрашиваю раз в 250 миллисекунд, так как чаще он не успевает. Беда в том, что на время запроса (даже раз в четверть секунды) он заметно задумывается. Миллисекунд на 50, по ощущениям. В это время другие процессы встают.
Если это важно - он подключен к arduino nano не на железные SPI пины, а на выбранные три из цифровых - в моем случае
Также на другие выбранные пины подключен LED сегментный индикатор посредством MAX7219.
Если это важно - 6675 подключен так:
MAX7219 в каскаде висят на 2, 4 и 3 ногах соответственно. (din,cls,cs)
Update: Также интересно, есть ли какие более быстрые решения для опроса термопар типа K. Скажем, раз 10 в секунду хотя-бы.
Почему вы считаете, что он задумывается? По даташиту он начинает конверсию, когда CS -> HIGH, делает ее 220 мс и готов отдать. По CS -> LOW конверсия останавливается в любом случае. Так что разогнать наврядли удастся, а оптимизировать цикл чтения - наверное можно.
Посмотрел адафрутовскую либу - сплошные digitalRead/digitalWrite. Можете переписать на прямую работу с портом.
Почему вы считаете, что он задумывается?
Мой косяк оказался, да. Ошибся в коде с временными задержками. Выставил в итоге опрос раз в 250 мс, пока так оставлю. Ну и в рабочем режиме посмотрю еще варианты. Просто по даташиту - там ДО 220, типичное 170. Но с пометкой, что это теория. :)
И в первой тестовой сборке - по факту он корректно работал с задержкой в 100, я проверял. А на этой сборке - не укладывается даже в 150. Правда, там был пусть и тоже нано, но другого производителя. Надо будет попробовать тот контроллер в "боевую" сборку воткнуть. Ибо модуль работы с термопарой один и тот-же.
Я, собственно, на этом и подорвался, что код перестал работать по задержке, а я копать стал в других местах, ибо такой подставы не ожидал. Если опрашивать его слишком часто - он уходит в клинч и перестает пересчитывать температуру вообще, просто висит последнее значение.
Ну так вполне логично. Вы же не даете конверсию завершить, и новый результат в выходной буфер не заталкивается.
Привет Всем!
Есть задача создать код скользящего среднего для MAX6675 по трём значениям.
Я вроде это сделал. Код работает и результат давольно точный.
Проблема в том, как уменьшить и облагородить этот код. Он занимает слишком много памяти и является всего лишь частью оснавного проекта.
Вывод на манитор, это просто для анализа реальной темпертуры и усреднённой.
Я не програмист и не матиматик, но в том и том разбираюсь чуть выше среднего))).
Я радиолюбитель с 1986г. ))) Буду благодарен за любые подсказки!!!
Я не програмист и не матиматик, но в том и том разбираюсь чуть выше среднего))).
1. выкинуть Serial.print после дебага. он очень много жрет
2. со вторым вариантов масса, на пример: на кой ляд таскать 3 штуки а1, а2, а3 (и их переменные)?
создать функцию (Еще один пример - ваш вариант).
можно закидывать в массив результаты измерений и потом поработать с массивом (если не только усреднять, но и исключать сильно отличающиеся от среднего, так называемые "сбойные измерения")
можно завести некую переменную, типа счетчика измерений. Проводить измерения в некий момент выполнения основной программы. по достижению заданного значения переменной производить усреднение и обнулять переменную - для повторения цикла измерений. Можно добавить флаг, что получены новые данные (соответственно флаг збрасывать после использования новых данных по назначению)
Можно еще вагон с прицепом вариантов написать - Вам выбирать, как поступить.
UPD после дебага, убейте delay , просто вызывайте функцию из разных мест основной программы.
Проблема в том, как уменьшить и облагородить этот код. Он занимает слишком много памяти и является всего лишь частью оснавного проекта.
Почему Вы решили, что это "слишком много"?
Ну а теперь по поводу: как уменьшить объем. Правда, следует сразу оговориться, что в отсутствие конкретики результат может оказаться неудовлетворительным. Например, если, скажем, удастся уменьшить объем кода на 3 кб - это много или мало? Если исходный код был 3.5 кб - много, а если исходный 30 кб - то мало.
Первое - нужно определить, а что, собственно, жрет основную память?
Из того, что я вижу в коде, - 3 основных кандидата:
1. Класс Serial.
2. Класс thermocouple.
3. Вычисления с плавающей точкой.
Ну и кроме того - трижды повторяется один и тот же фрагмент. Не думаю, что сам по себе этот фрагмент объемный, но, отказавшись тот двух лишних, можно немного подсократить код (Вы ведь не привели конкретные цифры, значит, важен сам факт, что код станет короче).
Собственно, в этом ключе и надо действовать:
- Выяснить, а сколько же памяти занимает исходный код.
- Выяснить, сколько занимает Serial.
- Выяснить, сколько занимает thermocouple.
- Перевести вычисления в целые числа и оценить результат как по точности, так и по объему кода.
- Избавиться от троекратного повторения.
Спасибо за советы!!! Мне просто немного не хватает знаний в программиромании. Типерь я знаю в какую сторону надо капать))). Думаю надо изучать массив.
Ещо раз, спасибо!
Мне просто немного не хватает знаний в программиромании. Типерь я знаю в какую сторону надо капать...
на упреждение, посмотрите инфу по теме "область видимости переменных" прочитайте закрепленные темы в разделе Программирование. Если реально хотите научиться - пробуйте писать коды, много и разные... желательно простые, а не ломать голову над чужими высокоуровневыми проектами. Усреднение - одна из любопытнейших тем для начинающих...
UPD найти инфу на тему float - вычисления с плавающей запятой в восьмибитных процессорах. написать простую программу, которая берет данные из консоли и чего-то вычисляет и обратно выводит данные. Т.е. руками вводить данные (к примеру код АЦП) и вычислять в разных типах переменных. Желательно еще фиксировать время выполнения операции...
еще такой момент, когда вернетесь к челым числам, то
усреднять лучше по числу отсчетов кратных степени двойки, тогда усреднение (деление) можно выполнить операцией простого сдвига результата вправо, т.е. для двух отсчетов на один разряд, для четырех на два разряда и т.д.
еще такой момент, когда вернетесь к челым числам, то
усреднять лучше по числу отсчетов кратных степени двойки, тогда усреднение (деление) можно выполнить операцией простого сдвига результата вправо, т.е. для двух отсчетов на один разряд, для четырех на два разряда и т.д.
не до конца понял. Не могли бы написать пример на цыфрах?
еще такой момент, когда вернетесь к челым числам, то
усреднять лучше по числу отсчетов кратных степени двойки, тогда усреднение (деление) можно выполнить операцией простого сдвига результата вправо, т.е. для двух отсчетов на один разряд, для четырех на два разряда и т.д.
не до конца понял. Не могли бы написать пример на цыфрах?
напишите любое бинарное число на пример 64 (0100 0000), разделите на 2; 4; 8....
запишите ответ столбиком, а потом прочитайте ответ
UPD смысл в оптимизации скорости вычисления в сложных проектах ... и простых тоже...