Преобразователь max6675, вопрос по работе.

sally555
sally555 аватар
Offline
Зарегистрирован: 28.05.2015

Заказывал на Али адаптер-преобразователь max6675 в комплекте с термопарой K-типа, еще отдельно другую термопару того же типа. Прикрутил его к Ардуино-Уно, все работает, с обеими термопарами, но показания считываются нестабильные, опрашиваю раз в секунду, гуляет в пределах 1 градуса. Например при температуре 24 градуса, показания могут быть из ряда 23,50; 23,75; 24,00; 24,25; 24,50. Причем эта нестабильность одинакова с тремя подопытными термопарами, третья тоже К-типа от китайского тестера. Это вообще нормально? Может я слишком много от него хочу? Но мне нужна точность хотя бы 0,25градуса.

sally555
sally555 аватар
Offline
Зарегистрирован: 28.05.2015

Видимо никто не заморачивался такой точностью, термопарой ведь измеряют обычно высокие температуры и колебания +/- 0,5гр в этом случае не критичны. Пробовал подавать на адаптер милливольты с калибратора КИСС-03 имитируя термопару, результат тот же, показания гуляют +/- 0,5гр, но если сделать несколько выборок и потом усреднить, то выходит более менее стабильно.

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

При температуре 25 град. абсолютная погрешность в 0,25 град. соответствует относительной в 1%. Промышленный прибор, который дает такую точность, например Метран-271, в обычном исполнении стоит порядка 12000 рублей и каждый год его нужно поверять. Если Вас устроит не точность, а кратковременная стабильность показаний, то да, при отсутствии в сигнале резких выбросов решить задачу можно усреднением большого числа показаний.

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

.

sally555
sally555 аватар
Offline
Зарегистрирован: 28.05.2015

Пришлось все же усреднять вот таким образом

float UsrednenieTemp()
{
  float a=0,b=0;
  for(int i=0; i<10; i++){
  b = thermocouple.readCelsius();
  a = a+ b; 
  delay(300);
  }
  a = a/10;
  return a;
}

Все равно плавает, но уже в пределах 0,2 градуса, меня это устраивает. Пробовал делать 20 и 30 выборок, эфект тот же, только дольше, между выборками приходится тормозить на 300мс. Теперь другая проблемка, сравнил с ртутным лабораторным термометром, при 20 градусах разница в 2,5градуса.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

откалибруй тогда, только тебе нужен термометр точнее твоего для всего диапазона

sally555
sally555 аватар
Offline
Зарегистрирован: 28.05.2015

Да термометр не проблема, морока блин. А если я потом другую термопару поставлю, все по новой калибровать? Что то я не помню, из своего далекого киповского прошлого, чтоб мы что то калибровали при замене термопары. Вторичные приборы калибровались таким большим ящиком который выдавал милливольты, сейчас калибруют КИССом по градуировочной таблице и никакой привязки к конкретной термопаре. Адаптер свой я проверил КИССом, значит выходит что термопара барахло или ртутник брешет? Прийдется в КИП идти чтоб термопары мои проверили, а заодно и ртутник.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а что ты хотел. купи дорогой калиброванный датчик. если купил набор за 250 рублей не расчитывай на точность киповского прибора)))

sally555
sally555 аватар
Offline
Зарегистрирован: 28.05.2015

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну тем более

sally555
sally555 аватар
Offline
Зарегистрирован: 28.05.2015

Провел опыт, подключал термопары к КИССу, комнатную температуру показывают все однаково. Опустил в стакан с теплой водой, все три показывают одинаково 42гр, ртутник 38гр. Накидал льда в стакан, только две из 3х показали 0гр и ртутник тоже 0гр, одна аж -12 показала. На кипятке надо еще проверить.

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

sally555 пишет:

Пробовал делать 20 и 30 выборок, эфект тот же, только дольше, между выборками приходится тормозить на 300мс. Теперь другая проблемка, сравнил с ртутным лабораторным термометром, при 20 градусах разница в 2,5градуса.

Для непрерывного мониторинга лучше подходит метод "скользящего среднего". На разгонном участке Вы набираете все 30 точек и по ним вычисляете среднее. Дальше на каждом шаге отбрасываете самое ранне значение в выборке, добавляете одно новое и на модифицированной выборке вычисляете среднее. "Экономится" время на набор 29 значений. И так каждый раз. Если нужна действительно точность, то калибровок и поверок не избежать. Причем для решения за 250 руб. стоит помнить о сомнительной термостабильности электроники и необходимости компенсации холодного спая, когда речь идет о термопарах.

Гриша
Offline
Зарегистрирован: 27.04.2014

jeka_tm пишет:

а что ты хотел. купи дорогой калиброванный датчик. если купил набор за 250 рублей не расчитывай на точность киповского прибора)))

Все забыли формулу:

«делаю ремонт! Быстро, качественно, не дорого – любые два варианта» :)

 

sally555
sally555 аватар
Offline
Зарегистрирован: 28.05.2015

Duino A.R. пишет:
Для непрерывного мониторинга лучше подходит метод "скользящего среднего". На разгонном участке Вы набираете все 30 точек и по ним вычисляете среднее. Дальше на каждом шаге отбрасываете самое ранне значение в выборке, добавляете одно новое и на модифицированной выборке вычисляете среднее. "Экономится" время на набор 29 значений. И так каждый раз.
Спасибо за скользящее среднее! Век живи, век учись.

Duino A.R. пишет:
Если нужна действительно точность, то калибровок и поверок не избежать. Причем для решения за 250 руб. стоит помнить о сомнительной термостабильности электроники и необходимости компенсации холодного спая, когда речь идет о термопарах.

Ну так я не экономлю на себе:-), просто взял на первый раз для опытов дешевые. Ошибочку понял, уже заказал более дорогие. Хотя не уверен что они намного лучше). А вообще я пока в поиске, что применить в своем агрегате, термопары или цифровые датчики на основе интегральных элементов DS18, они довольно медленные в отличии от термопар.

sally555
sally555 аватар
Offline
Зарегистрирован: 28.05.2015

Гриша пишет:

«делаю ремонт! Быстро, качественно, не дорого – любые два варианта

таки не два, а три варианта, быстро, качественно  или недорого :-).

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

sally555 пишет:
А вообще я пока в поиске, что применить в своем агрегате, термопары или цифровые датчики на основе интегральных элементов DS18, они довольно медленные в отличии от термопар.

Я видел людей, которые на этих датчиках делали термоподвески для измерения температурного поля в элеваторах. Вполне рабочий вариант. Но точность у DS18B20  0,5 град., а Вы хотели 0,25. В описании к датчику точность и разрешающую способность разделяют совершенно четко.

Гриша
Offline
Зарегистрирован: 27.04.2014

sally555 пишет:

Гриша пишет:

«делаю ремонт! Быстро, качественно, не дорого – любые два варианта

таки не два, а три варианта, быстро, качественно  или недорого :-).

нету трех, есть ДВА ИЗ трех. три комбинации, и никак иначе :)

a5021
Offline
Зарегистрирован: 07.07.2013

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

Гриша
Offline
Зарегистрирован: 27.04.2014

sally555 пишет:

Duino A.R. пишет:
Для непрерывного мониторинга лучше подходит метод "скользящего среднего". На разгонном участке Вы набираете все 30 точек и по ним вычисляете среднее. Дальше на каждом шаге отбрасываете самое ранне значение в выборке, добавляете одно новое и на модифицированной выборке вычисляете среднее. "Экономится" время на набор 29 значений. И так каждый раз.
Спасибо за скользящее среднее! Век живи, век учись.

только если они в регуляторе, время усреднения не должно быть выше времени реакции (регулирования), а то получится осциллятор… уж больно жесткие требования у Вас к точности :) 

UPDю справедливо для установившегося процесса...

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

a5021 пишет:

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

Да. В аналоговой электронике элементы и схемы не работают, а "ведут себя". :))

Гриша
Offline
Зарегистрирован: 27.04.2014

a5021 пишет:

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

а как выборкой выдерают в дальномере сигнал из шумов тогда? шумы в корень из N раз ниже....

UPD. здесь тоже нормальный закон распределения - теория вероятности

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

Гриша пишет:

только если они в регуляторе, ...

1. Убьемся тогда коллективно. Лучше "закрыть капот, там столько всего..." :))

2. А вообще-то началась классическая форумная забава. Автор говорит слово, а самовыдвиженцы из форумчан пытаются обрисовать другим полную статУю того "сферического коня в вакууме". Автор посмеется и еще полслова скажет. Так и идет...

a5021
Offline
Зарегистрирован: 07.07.2013

Гриша пишет:

а как выборкой выдерают в дальномере сигнал из шумов тогда? шумы в корень из N раз ниже....

И с какой точностью этот дальномер измеряет? До долей миллиметра, надеюсь?

Гриша
Offline
Зарегистрирован: 27.04.2014

a5021 пишет:

Гриша пишет:

а как выборкой выдерают в дальномере сигнал из шумов тогда? шумы в корень из N раз ниже....

И с какой точностью этот дальномер измеряет? До долей миллиметра, надеюсь?

есть дальномеры для измерения скорости горения ВВ (пороха) :) дальномеры разные

a5021
Offline
Зарегистрирован: 07.07.2013

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

Чечако
Offline
Зарегистрирован: 15.06.2018

Подниму тему, поскольку вопрос тоже по работе такого преобразователя.

Вопрос - можно ли как-то ускорить его работу? Опрашиваю раз в 250 миллисекунд, так как чаще он не успевает. Беда в том, что на время запроса (даже раз в четверть секунды) он заметно задумывается. Миллисекунд на 50, по ощущениям. В это время другие процессы встают.

Если это важно - он подключен к arduino nano не на железные SPI пины, а на выбранные три из цифровых - в моем случае 

Также на другие выбранные пины подключен LED сегментный индикатор посредством MAX7219.

 

Если это важно - 6675 подключен так:

int ktcSO = 7;
int ktcCS = 6;
int ktcCLK =5;
 
//инициализируем термопару
MAX6675 ktc(ktcCLK, ktcCS, ktcSO);

MAX7219 в каскаде висят на 2, 4 и 3 ногах соответственно. (din,cls,cs)

 

Update: Также интересно, есть ли какие более быстрые решения для опроса термопар типа K. Скажем, раз 10 в секунду хотя-бы.

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

Почему вы считаете, что он задумывается? По даташиту он начинает конверсию, когда CS -> HIGH, делает ее 220 мс и готов отдать. По CS -> LOW конверсия останавливается в любом случае.  Так что разогнать наврядли удастся, а оптимизировать цикл чтения - наверное можно.

Посмотрел адафрутовскую либу - сплошные digitalRead/digitalWrite. Можете переписать на прямую работу с портом.

Чечако
Offline
Зарегистрирован: 15.06.2018

sadman41 пишет:

Почему вы считаете, что он задумывается?

Мой косяк оказался, да. Ошибся в коде с временными задержками. Выставил в итоге опрос раз в 250 мс, пока так оставлю. Ну и в рабочем режиме посмотрю еще варианты. Просто по даташиту - там ДО 220, типичное 170. Но с пометкой, что это теория. :)

И в первой тестовой сборке  - по факту он корректно работал с задержкой в 100, я проверял. А на этой сборке - не укладывается даже в 150. Правда, там был пусть и тоже нано, но другого производителя. Надо будет попробовать тот контроллер в "боевую" сборку воткнуть. Ибо модуль работы с термопарой один и тот-же.

Я, собственно, на этом и подорвался, что код перестал работать по задержке, а я копать стал в других местах, ибо такой подставы не ожидал. Если опрашивать его слишком часто - он уходит в клинч и перестает пересчитывать температуру вообще, просто висит последнее значение.

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

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

sss-b
Offline
Зарегистрирован: 10.12.2018

Привет Всем!

Есть задача создать код скользящего среднего для MAX6675 по трём значениям.

Я вроде это сделал. Код работает и результат давольно точный. 

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

#include "max6675.h"

int thermoDO = 2;  //он же SO
int thermoCS = 3;
int thermoCLK = 4;  //он же SCK

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

int vccPin = 5;  //пин для питания
int gndPin = 6;  //пин для земли

  //переменные с плавоющей тоцкой
  float a1; 
  float a2;
  float a3;
  
  float a11;
  float a22;
  float a33;
  
void setup() {
  Serial.begin(9600);
  
  //активируем питание и землю
  pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH);
  pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW);
   
  }

void loop() 
  {
  a1=(thermocouple.readCelsius());
  Serial.print(a1);
  delay(200);
  a11=(a1+a2+a3)/3;             //находим среднее значение из трух измерений
  a11+=0.5;                     //прибовляем к результату 0.5
  a11=(int)a11;                 //отрезаем дробную часть
  Serial.print("; C sr. = ");
  Serial.println(a11);
  
  a2=(thermocouple.readCelsius());
  Serial.print(a2);
  delay(200);
  a22=(a2+a3+a1)/3;
  a22+=0.5;
  a22=(int)a22;
  Serial.print("; C sr. = ");
  Serial.println(a22);
  
  a3=(thermocouple.readCelsius());
  Serial.print(a3);
  delay(200);
  a33=(a3+a1+a2)/3;
  a33+=0.5;
  a33=(int)a33; 
  Serial.print("; C sr. = ");
  Serial.println(a33);
  
}

Вывод на манитор, это просто для анализа реальной темпертуры и усреднённой.

Я не програмист и не матиматик, но в том и том разбираюсь чуть выше среднего))). 

Я радиолюбитель с 1986г. ))) Буду благодарен за любые подсказки!!!

Гриша
Offline
Зарегистрирован: 27.04.2014

sss-b пишет:

Я не програмист и не матиматик, но в том и том разбираюсь чуть выше среднего))).

1. выкинуть Serial.print после дебага. он очень много жрет

2.  со вторым вариантов масса, на пример: на кой ляд таскать 3 штуки а1, а2, а3 (и их переменные)?

создать функцию (Еще один пример - ваш вариант).

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

можно завести некую переменную, типа счетчика измерений. Проводить измерения в некий момент выполнения основной программы. по достижению заданного значения переменной производить усреднение и обнулять переменную - для повторения цикла измерений. Можно добавить флаг, что получены новые данные (соответственно флаг збрасывать после использования новых данных по назначению)

Можно еще вагон с прицепом вариантов написать - Вам выбирать, как поступить. 

UPD  после дебага, убейте delay , просто вызывайте функцию из разных мест основной программы.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sss-b пишет:

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

Во-первых, "занимает слишком много памяти" - конкретно сколько?

Почему Вы решили, что это "слишком много"?

 

Ну а теперь по поводу: как уменьшить объем. Правда, следует сразу оговориться, что в отсутствие конкретики результат может оказаться неудовлетворительным. Например, если, скажем, удастся уменьшить объем кода на 3 кб - это много или мало? Если исходный код был 3.5 кб - много, а если исходный 30 кб - то мало.

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

Из того, что я вижу в коде, - 3 основных кандидата:

1. Класс Serial.

2. Класс thermocouple.

3. Вычисления с плавающей точкой.

Ну и кроме того - трижды повторяется один и тот же фрагмент. Не думаю, что сам по себе этот фрагмент объемный, но, отказавшись тот двух лишних, можно немного подсократить код (Вы ведь не привели конкретные цифры, значит, важен сам факт, что код станет короче).

Собственно, в этом ключе и надо действовать:

- Выяснить, а сколько же памяти занимает исходный код.

- Выяснить, сколько занимает Serial.

- Выяснить, сколько занимает  thermocouple.

- Перевести вычисления в целые числа и оценить результат как по точности, так и по объему кода.

- Избавиться от троекратного повторения.

sss-b
Offline
Зарегистрирован: 10.12.2018

Спасибо за советы!!! Мне просто немного не хватает знаний в программиромании. Типерь я знаю в какую сторону надо капать))). Думаю надо изучать массив.

Ещо раз, спасибо!  

Гриша
Offline
Зарегистрирован: 27.04.2014

sss-b пишет:

 Мне просто немного не хватает знаний в программиромании. Типерь я знаю в какую сторону надо капать...

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

UPD  найти инфу на тему float - вычисления с плавающей запятой в восьмибитных процессорах. написать простую программу, которая берет данные из консоли и чего-то вычисляет и обратно выводит данные. Т.е. руками вводить данные (к примеру код АЦП) и вычислять в разных типах переменных. Желательно еще фиксировать время выполнения операции...

ВН
Offline
Зарегистрирован: 25.02.2016

еще такой момент, когда вернетесь к челым числам, то

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

sss-b
Offline
Зарегистрирован: 10.12.2018

ВН пишет:

еще такой момент, когда вернетесь к челым числам, то

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

не до конца понял. Не могли бы написать пример на цыфрах?

Гриша
Offline
Зарегистрирован: 27.04.2014

sss-b пишет:

ВН пишет:

еще такой момент, когда вернетесь к челым числам, то

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

не до конца понял. Не могли бы написать пример на цыфрах?

напишите любое бинарное число на пример 64 (0100 0000), разделите на 2; 4; 8....

запишите ответ столбиком, а потом прочитайте ответ

UPD  смысл в оптимизации скорости вычисления в сложных проектах ... и простых тоже...