реклама на сайте
подробности

 
 
11 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Как сделать вычисление значения температуры по градуировочной таблице термопары?
Goodefine
сообщение Feb 25 2009, 14:02
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581



Если по Вашему (с флоат), то проще примерно так:
Код
float gradtbl[131]={/*...*/};
//...
uchar index1, index2;
float u_tmpr; //переведенное в флоат-миливольты измеренное напряжение
float tmpr_value; //переменная для температуры

for(i=0;i<131;i++)                {
                   if(gradtbl[i]>=u_tmpr){index1=i; break;}  
                              }

tmpr_value= (gradtbl[index1]-gradtbl[index1-1])/100 //промежуточное

for(i=0;i<100;i++)          {
           if(gradtbl[index1-1]+tmpr_value*i>=u_tmpr){index2=i; break;}  
                     }

tmpr_value=10*(index1-1) + index2/10; //окончательное значение температуры с десятыми


Можно, конечно, и проверку граничных условий добавить...

Сообщение отредактировал Goodefine - Feb 25 2009, 14:23


--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 25 2009, 22:17
Сообщение #17


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Ну Вы маньяки. Нужна всего одна целочисленная таблица с шагом в 10 гр.Цельсия, а в таблице прямо коды АЦП.
Получили код с АЦП, пробежались по таблице, тем самым нашли в каком диапазоне температур оказались, а дальше линейная интерполяция.
Единственное о чём Вам надо ещё задуматься так это о компенсации ЭДС ХС.
У меня так сделано - работает превосходно.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Ivan Kuznetzov
сообщение Feb 26 2009, 04:59
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798



Цитата(demiurg_spb @ Feb 26 2009, 03:17) *
Ну Вы маньяки. Нужна всего одна целочисленная таблица с шагом в 10 гр.Цельсия, а в таблице прямо коды АЦП.
Получили код с АЦП, пробежались по таблице, тем самым нашли в каком диапазоне температур оказались, а дальше линейная интерполяция.
Единственное о чём Вам надо ещё задуматься так это о компенсации ЭДС ХС.
У меня так сделано - работает превосходно.


а можно Ваш исходник посмотреть, пожалуйста?


--------------------
Разработчик
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 26 2009, 06:11
Сообщение #19


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Ivan Kuznetzov @ Feb 26 2009, 07:59) *
а можно Ваш исходник посмотреть, пожалуйста?
Нет. Это уж как-нибудь самиsmile.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
AlexU
сообщение Feb 26 2009, 06:34
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 31-05-06
Пользователь №: 17 639



Цитата(Ivan Kuznetzov @ Feb 25 2009, 13:37) *
float gradtbl[131]={0 , 0.40 , 0.80 , 1.20 ...... и т.д. 131 значение
...
как сделать пересчет значения миливольт в градусы?


Для ТХА, ТХК 20..200 град/0.5 хватило полинома второй степени. ХС на другом входе АЦП.
Go to the top of the page
 
+Quote Post
Сергей К
сообщение Feb 26 2009, 06:37
Сообщение #21


Участник
*

Группа: Новичок
Сообщений: 24
Регистрация: 18-09-08
Из: Киев
Пользователь №: 40 317



По поводу компенсации: я вот думаю, можно ли сразу перевести ЭДС термопары в градусы и затем к ним прибавить температуру окружающей среды (окружающая среда -30...+80 градусов Цельсия максимум, т.е. на улице).
Или же нужно сначала все в микровольты переводить, там делать компенсацию и лиш затем переводить в градусы (как в учебниках)? Точности в пару градусов достаточно.

Измеряю температуру 3мя каналами AD7792, темерературу холодного спая - внутреним датчиком AD7792 (вся конструкция в металлической коробке, куда приходят концы термопар)

Сообщение отредактировал Сергей К - Feb 26 2009, 06:54
Go to the top of the page
 
+Quote Post
Ivan Kuznetzov
сообщение Feb 26 2009, 06:44
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798



Goodefine

По Вашему примеру все работает хорошо - но десятых долей нету почему-то...

В общем сейчас у меня следящий ПИД регулятор на симистор работает
Печка сопротивления + ХА термопара в ней
девайс держит температуру +/- 2 градус....
только десятые доли не показывает - а хотелось бы....

О девайсе вкратце:
1) атмега32, дисплей 20х4
2) полная развязка от сети (по питанию - транс, по управлению симистором - оптрон)
3) переход через 0 ловлю внутренним компаратором меги
4) мощность нагревателя регулирую либо кнопочками +/-. либо по закону ПИД исходя из заданной температуры и измерянной
5) ПИД коэффициенты еще толком не настраивал, есть зона пропорциональности ит.д.
6) Два режима управления симистором фазоимпульсный и по Брезенхему
7) есть возможность встречно-параллельного включения двух тиристоров и управление ими с разных ног меги через развязывающие трансики
Если проект получится - выложу все как есть

Сообщение отредактировал Ivan Kuznetzov - Feb 26 2009, 06:53


--------------------
Разработчик
Go to the top of the page
 
+Quote Post
Goodefine
сообщение Feb 26 2009, 07:30
Сообщение #23


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581



Цитата
...но десятых долей нету почему-то...

Возможно, теряется точность. Попробуйте чуть иначе:
Код
float gradtbl[131]={/*...*/};
//...
uchar index;
float u_tmpr;        //переведенное в флоат-милливольты измеренное напряжение
float tmpr_value; //переменная для температуры
//с одним циклом:
for(i=0;i<131;i++)                {
                   if(gradtbl[i]>=u_tmpr){index=i; break;}  
                              }

//окончательное значение
tmpr_value=10*(index-1) +( u_tmpr - gradtbl[index-1])*10/(gradtbl[index]-gradtbl[index-1]);

Кстати, Ваш код вывода на дисплей можно увидеть?

Сообщение отредактировал Goodefine - Feb 26 2009, 07:35


--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Go to the top of the page
 
+Quote Post
Ivan Kuznetzov
сообщение Feb 26 2009, 08:19
Сообщение #24


Местный
***

Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798



Goodefine

Отлично все заработало! Спасибо!

код для лсиди выложу - он у меня самописный - кодевижновский меня не устраивает

в моем коде:
1) 4-х проводный интерфейс
2)можно все ноги дисплея переназначать
3) на RW я забил и посадил его на землю - нафига мне с дисплея читать?? biggrin.gif

...только после 130 градусов - остаток всегда .75

вот мучает меня вопрос - а во флаше хранить таблицу можно? а то память она жрет....

если делаю вот так - то не работает:
Код
flash float gradtbl[131]={0 , 0.40 , 0.80 , 1.20 , 1.61 , 2.02 , 2.43 , 2.85 , 3.26 , 3.68,


Сообщение отредактировал Ivan Kuznetzov - Feb 26 2009, 08:20


--------------------
Разработчик
Go to the top of the page
 
+Quote Post
Tanya
сообщение Feb 26 2009, 08:51
Сообщение #25


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(Ivan Kuznetzov @ Feb 26 2009, 11:19) *
Goodefine

Отлично все заработало! Спасибо!


...только после 130 градусов - остаток всегда .75

вот мучает меня вопрос - а во флаше хранить таблицу можно? а то память она жрет....

если делаю вот так - то не работает:
Код
flash float gradtbl[131]={0 , 0.40 , 0.80 , 1.20 , 1.61 , 2.02 , 2.43 , 2.85 , 3.26 , 3.68,

По Вашей таблице видно, что у Вас диапазон 1300 градусов, а в таблице числа в милливольтах.
Разрядность Вашего АЦП (градуировка близка к линейной) позволяет разрешить примерно 1 градус (еще точнее - 1.3). Таблица через 10 градусов. При таких обстоятельствах можно (или нужно)
а) уменьшить таблицу в два - три - четыре... раза. Может быть, неравномерно - постройте график - там, где отклонение от прямой будет меньше 0.5 градуса, нет смысла дробить интервал.
б) в таблицу вместо милливольтов записать целые числа - соответствующие коды АЦП, в другую - соответствующую температуру.
Или полином.
Go to the top of the page
 
+Quote Post
xemul
сообщение Feb 26 2009, 09:27
Сообщение #26



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Tanya @ Feb 26 2009, 11:51) *
По Вашей таблице видно, что у Вас диапазон 1300 градусов, а в таблице числа в милливольтах.
Разрядность Вашего АЦП (градуировка близка к линейной) позволяет разрешить примерно 1 градус (еще точнее - 1.3). Таблица через 10 градусов. При таких обстоятельствах можно (или нужно)
а) уменьшить таблицу в два - три - четыре... раза. Может быть, неравномерно - постройте график - там, где отклонение от прямой будет меньше 0.5 градуса, нет смысла дробить интервал.
б) в таблицу вместо милливольтов записать целые числа - соответствующие коды АЦП, в другую - соответствующую температуру.
Или полином.

Зачем Вы так изощренно издеваетесь над программистами?smile.gif Любой контроллер или процессор и сам должен все сделать.
Я предполагаю, что автор использует АЦП АВР с внутренней опорой (которая по даташиту имеет точность +-10%) и вряд ли эту опору калибрует. Исходя из точности опоры я предложил кривую термопары аппроксимировать прямой (парой, тройкой,... - опять же исходя из требуемой и достижимой точности) и забить на всякие плавучие таблицы.
Но, похоже, для конкретных программистов точность - это сколько знаков после запятой можно вывести на индикатор.
Go to the top of the page
 
+Quote Post
Ivan Kuznetzov
сообщение Feb 26 2009, 09:33
Сообщение #27


Местный
***

Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798



Цитата(xemul @ Feb 26 2009, 14:27) *
Зачем Вы так изощренно издеваетесь над программистами?smile.gif Любой контроллер или процессор и сам должен все сделать.
Я предполагаю, что автор использует АЦП АВР с внутренней опорой (которая по даташиту имеет точность +-10%) и вряд ли эту опору калибрует. Исходя из точности опоры я предложил кривую термопары аппроксимировать прямой и забить на всякие плавучие таблицы.
Но, похоже, для конкретных программистов точность - это сколько знаков после запятой можно вывести на индикатор.

совершенно верно! использую внутренний опорный источник МК на 2.5 вольт


--------------------
Разработчик
Go to the top of the page
 
+Quote Post
xemul
сообщение Feb 26 2009, 09:58
Сообщение #28



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Ivan Kuznetzov @ Feb 26 2009, 12:33) *
совершенно верно! использую внутренний опорный источник МК на 2.5 вольт

Тогда просто аппроксимируйте кривую термопары в требуемом температурном диапазоне прямой (по методу наименьших квадратов или любому другому известному Вам). На выходе получите простую функцию T = a*Nadc + b. Все расчеты легко можно будет уложить в 2-хбайтовую целочисленную арифметику.
Ну а дальше (по индукции, и если нужно повысить точность аппроксимации) можно выполнить аппроксимацию двумя прямыми (тремя,...), для каждой рассчитать a и b.
Или, если таки по таблице, то можно выполнять интерполяцию не по 2 точкам, а по 3. Это позволит сократить количество точек в таблице при несущественном увеличении целочисленной арифметики, но потребует некоторых предварительных расчетов, н-р, в ёкселе (чтобы не сократить число точек сверх меры, когда погрешность интерполяции станет значимой).
Погуглите методы аппроксимации и интерполяции.
Кста, попалось: http://do.rksi.ru/library/courses/chm/
Обратите внимание на раздел "Введение. Приближенные числа и действия над ними. Оценка точности вычислений". Это базис, который позволит в дальнейшем не рисовать на индикаторе 5 десятичных разрядов при точности измерения 10%.
Go to the top of the page
 
+Quote Post
Goodefine
сообщение Feb 26 2009, 10:56
Сообщение #29


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581



Цитата
...диапазон 1300 градусов...
...АЦП (градуировка близка к линейной) позволяет разрешить примерно 1 градус...

АЦП это дело наживное. Если мало, всегда добавить внешний можно. Кроме того, никто не говорит, что нужно измерять с одинаковой точностью на всем диапазоне. Флоат, конечно, совершенно необязательно...
Цитата
...только после 130 градусов - остаток всегда .75

Прямо всегда?
Цитата
Но, похоже, для конкретных программистов точность - это сколько знаков после запятой можно вывести на индикатор.

Список конкретных программистов мона огласить?


--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Go to the top of the page
 
+Quote Post
Ivan Kuznetzov
сообщение Feb 26 2009, 11:07
Сообщение #30


Местный
***

Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798



хух! в общем все! получился ПИД регулятор - температуру теперь нормально кажет - с десятыми
теперь хочу попробывать какой-нибудь алгоритм авто-настройки ПИД коэффициентов...
может есть у кого, поделитесь пожалуйста?

Вот схемка:

Сообщение отредактировал Ivan Kuznetzov - Feb 26 2009, 11:08
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Разработчик
Go to the top of the page
 
+Quote Post

11 страниц V  < 1 2 3 4 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th July 2025 - 10:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01877 секунд с 7
ELECTRONIX ©2004-2016