|
|
  |
Как сделать вычисление значения температуры по градуировочной таблице термопары? |
|
|
|
Feb 25 2009, 14:02
|

Местный
  
Группа: Свой
Сообщений: 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
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Feb 26 2009, 04:59
|

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

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

Группа: Участник
Сообщений: 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 хватило полинома второй степени. ХС на другом входе АЦП.
|
|
|
|
|
Feb 26 2009, 06:37
|
Участник

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

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

Местный
  
Группа: Свой
Сообщений: 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
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Feb 26 2009, 08:19
|

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

|
GoodefineОтлично все заработало! Спасибо! код для лсиди выложу - он у меня самописный - кодевижновский меня не устраивает в моем коде: 1) 4-х проводный интерфейс 2)можно все ноги дисплея переназначать 3) на RW я забил и посадил его на землю - нафига мне с дисплея читать??  ...только после 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
--------------------
Разработчик
|
|
|
|
|
Feb 26 2009, 08:51
|
Гуру
     
Группа: Модераторы
Сообщений: 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 градуса, нет смысла дробить интервал. б) в таблицу вместо милливольтов записать целые числа - соответствующие коды АЦП, в другую - соответствующую температуру. Или полином.
|
|
|
|
|
Feb 26 2009, 09:27
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

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

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

|
Цитата(xemul @ Feb 26 2009, 14:27)  Зачем Вы так изощренно издеваетесь над программистами?  Любой контроллер или процессор и сам должен все сделать. Я предполагаю, что автор использует АЦП АВР с внутренней опорой (которая по даташиту имеет точность +-10%) и вряд ли эту опору калибрует. Исходя из точности опоры я предложил кривую термопары аппроксимировать прямой и забить на всякие плавучие таблицы. Но, похоже, для конкретных программистов точность - это сколько знаков после запятой можно вывести на индикатор. совершенно верно! использую внутренний опорный источник МК на 2.5 вольт
--------------------
Разработчик
|
|
|
|
|
Feb 26 2009, 09:58
|
    
Группа: Свой
Сообщений: 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%.
|
|
|
|
|
Feb 26 2009, 10:56
|

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

|
Цитата ...диапазон 1300 градусов... ...АЦП (градуировка близка к линейной) позволяет разрешить примерно 1 градус... АЦП это дело наживное. Если мало, всегда добавить внешний можно. Кроме того, никто не говорит, что нужно измерять с одинаковой точностью на всем диапазоне. Флоат, конечно, совершенно необязательно... Цитата ...только после 130 градусов - остаток всегда .75 Прямо всегда? Цитата Но, похоже, для конкретных программистов точность - это сколько знаков после запятой можно вывести на индикатор. Список конкретных программистов мона огласить?
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Feb 26 2009, 11:07
|

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

|
хух! в общем все! получился ПИД регулятор - температуру теперь нормально кажет - с десятыми теперь хочу попробывать какой-нибудь алгоритм авто-настройки ПИД коэффициентов... может есть у кого, поделитесь пожалуйста? Вот схемка:
Сообщение отредактировал Ivan Kuznetzov - Feb 26 2009, 11:08
Эскизы прикрепленных изображений
--------------------
Разработчик
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|