|
Как сделать вычисление значения температуры по градуировочной таблице термопары? |
|
|
|
Feb 25 2009, 11:15
|
Гуру
     
Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883

|
Цитата(Ivan Kuznetzov @ Feb 25 2009, 13:37)  Как сделать вычисление значения температуры по градуировочной таблице термопары?
Пишу прогу на сях. К примеру, измеряем напряжение с термопары, усиливаем его (с известным Ку) и подаем на вход ADC0 атмеги - там делим на Ку и получаем милливольты; есть также градуировочная таблица для термопары вида:
float gradtbl[131]={0 , 0.40 , 0.80 , 1.20 ...... и т.д. 131 значение
как сделать пересчет значения миливольт в градусы? Переделайте в микровольты (или десятки микровольт) - будут целые. Если по таблице, то интерполяция - находите интервал, в который попадает Ваше число X - (N-1,N). T=N-1 + (X-f(N-1))/(f(N)-f(N-1)) Можно многочленом сразу. Не забудьте про температуру опорного спая. Только при чем тут АВР и С?
|
|
|
|
|
Feb 25 2009, 11:22
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Ivan Kuznetzov @ Feb 25 2009, 14:37)  Пишу прогу на сях.  На тех же сях берете и составляете другую "прогу", но уже для компа, в которой все вышесказанное, только не Цитата Переделайте в микровольты (или десятки микровольт) - будут целые. - это слишком общО - сразу пересчет в ожидаемые реальные показания (N=1024*U/Uref) выводите хоть куда - хоть на экран, и потом забираете данные командной строкой типа create.exe >>table.inc
|
|
|
|
|
Feb 25 2009, 12:26
|

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

|
Как вариант: Задаем массив, разбив участки зависимости на прямые (относительно) //условно: Код table_termo[]={0/*значение для 0мкв*/,10/*значение температуры для 100мкв*/,20,30,...};[code] Расстояние между индексами 100мкв, например, по таблице Заводим переменную для измеренного напряжения на термопаре u_tmp_mkv Переменная температуры пусть tmp_table Тогда Код tmp_table=(table_termo[u_tmp_mkv/100+1]-table_termo[u_tmp_mkv/100])*(u_tmp_mkv%10+10*u_tmp_mkv%100)/100+table_termo[u_tmp_mkv/100]; Это примерно, но принцип понятен, думаю...
Сообщение отредактировал Goodefine - Feb 25 2009, 12:27
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Feb 25 2009, 12:34
|

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

|
Цитата(Goodefine @ Feb 25 2009, 17:26)  Как вариант: Задаем массив, разбив участки зависимости на прямые (относительно) //условно: Код table_termo[]={0/*значение для 0мкв*/,10/*значение температуры для 100мкв*/,20,30,...};[code] Расстояние между индексами 100мкв, например, по таблице Заводим переменную для измеренного напряжения на термопаре u_tmp_mkv Переменная температуры пусть tmp_table Тогда Код tmp_table=(table_termo[u_tmp_mkv/100+1]-table_termo[u_tmp_mkv/100])*(u_tmp_mkv%10+10*u_tmp_mkv%100)/100+table_termo[u_tmp_mkv/100]; Это примерно, но принцип понятен, думаю... последняя формула точно так будет выглядеть или это пример?
--------------------
Разработчик
|
|
|
|
|
Feb 25 2009, 12:35
|

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

|
Цитата Куда удобнее расстояние делать в 1 попугай АЦП. Нам-то, суровым авр-щикам crying.gif Зато так удобнее передрать зависимость ЭДС от температуры из паспорта термопары. Не принципиально, в общем... Но потом Ваш вариант, безусловно, приятней  Цитата последняя формула точно так будет выглядеть или это пример? Смысл в том что интерполируется число между двумя значениями из таблицы, определенными измеренным напряжением в мкв (загрубленным в "расстояние между значениями по таблице" раз). На практике, конечно, надо поотлаживать этот кусок (остатки, правильный порядок и т.д.)...
Сообщение отредактировал Goodefine - Feb 25 2009, 12:43
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Feb 25 2009, 12:46
|

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

|
Цитата(Goodefine @ Feb 25 2009, 17:35)  Зато так удобнее передрать зависимость ЭДС от температуры из паспорта термопары. Не принципиально, в общем... таблица обычная - тоесть указывается значение ЭДС через каждые 10 градусов - и заведена в массив: второй массив это числа от 0 до 1300 с шагом 10 Код float gradtbl[131]={0 , 0.40 , 0.80 , 1.20 , 1.61 , 2.02 , 2.43 , 2.85 , 3.26 , 3.68, 4.10 , 4.51 , 4.92 , 5.33 , 5.73 , 6.13 , 6.53 , 6.93 , 7.33 , 7.73, 8.13 , 8.53 , 8.93 , 9.34 , 9.74 , 10.15 , 10.56 , 10.97 , 11.38 , 11.80, 12.21 , 12.62 , 13.04 , 13.45 , 13.87 , 14.30 , 14.72 , 15.14 , 15.56 , 15.99, 16.40 , 16.83 , 17.25 , 17.67 , 18.09 , 18.51 , 18.94 , 19.37 , 19.79 , 20.22, 20.65 , 21.08 , 21.50 , 21.93 , 22.35 , 22.78 , 23.21 , 23.63 , 24.06 , 24.49, 24.91 , 25.33 , 25.76 , 26.19 , 26.61 , 27.04 , 27.46 , 27.88 , 28.30 , 28.73, 29.15 , 29.57 , 29.99 , 30.41 , 30.83 , 31.24 , 31.66 , 32.08 , 32.19 , 32.90, 33.32 , 33.72 , 34.13 , 34.55 , 34.95 , 35.36 , 35.76 , 36.17 , 36.57 , 36.97, 37.37 , 37.77 , 38.17 , 38.57 , 38.97 , 39.36 , 39.76 , 40.15 , 40.54 , 40.93, 41.32 , 41.71 , 42.09 , 42.48 , 42.88 , 43.26 , 43.64 , 44.02 , 44.40 , 44.78, 45.16 , 45.54 , 45.91 , 46.29 , 46.66 , 47.03 , 47.40 , 47.77 , 48.14 , 48.50, 48.87 , 49.23 , 49.59 , 49.95 , 50.31 , 50.67 , 51.02 , 51.38 , 51.73 , 52.08, 52.43};
float tempm[131];
for (i = 0; i < 131; i++) { tempm[i] = i; tempm[i] *= 10; } и собсссно сам цикл: Код while (1) { if (analogreg==1) { mvolt = read_adc(0) / 25;
for (i = 1; i < 132; i++) { if (gradtbl[i] > mvolt) {
themp = tempm[i - 1] + (( mvolt - gradtbl[i - 1] ) / ( gradtbl[i] - gradtbl[i - 1] )) * 10; } } { Дак вот в Баскоме все работало четко - а на Си (CVAVR) у меня все тормозит и когда на входе ADC ноль то температуру кажет " - 198" градусов - в чем тут могут быть грабли?
Сообщение отредактировал Ivan Kuznetzov - Feb 25 2009, 12:47
--------------------
Разработчик
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|