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

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


Местный
***

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



Как сделать вычисление значения температуры по градуировочной таблице термопары?

Пишу прогу на сях.
К примеру, измеряем напряжение с термопары, усиливаем его (с известным Ку) и подаем на вход ADC0 атмеги - там делим на Ку и получаем милливольты;
есть также градуировочная таблица для термопары вида:

float gradtbl[131]={0 , 0.40 , 0.80 , 1.20 ...... и т.д. 131 значение


как сделать пересчет значения миливольт в градусы?


--------------------
Разработчик
Go to the top of the page
 
+Quote Post
Petka
сообщение Feb 25 2009, 10:57
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(Ivan Kuznetzov @ Feb 25 2009, 13:37) *
Как сделать вычисление значения температуры по градуировочной таблице термопары?

Пишу прогу на сях.
К примеру, измеряем напряжение с термопары, усиливаем его (с известным Ку) и подаем на вход ADC0 атмеги - там делим на Ку и получаем милливольты;
есть также градуировочная таблица для термопары вида:

float gradtbl[131]={0 , 0.40 , 0.80 , 1.20 ...... и т.д. 131 значение


как сделать пересчет значения миливольт в градусы?

какой тип термопары?
Go to the top of the page
 
+Quote Post
Tanya
сообщение Feb 25 2009, 11:15
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 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))
Можно многочленом сразу.
Не забудьте про температуру опорного спая.
Только при чем тут АВР и С?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 25 2009, 11:18
Сообщение #4


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Tanya @ Feb 25 2009, 14:15) *
Только при чем тут АВР и С?

Ну как же! rolleyes.gif
Датчик-то к АВР подключается, а программа на си...


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 25 2009, 11:22
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Ivan Kuznetzov @ Feb 25 2009, 14:37) *
Пишу прогу на сях.

smile.gif На тех же сях берете и составляете другую "прогу", но уже для компа, в которой все вышесказанное, только не 
Цитата
Переделайте в микровольты (или десятки микровольт) - будут целые.
- это слишком общО - сразу пересчет в ожидаемые реальные показания (N=1024*U/Uref) выводите хоть куда - хоть на экран, и потом забираете данные командной строкой типа create.exe >>table.inc
Go to the top of the page
 
+Quote Post
xemul
сообщение Feb 25 2009, 11:27
Сообщение #6



*****

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



Начните лучше с требуемых точностных характеристик. Может статься, что с учетом используемой элементной базы будет достаточно аппроксимировать характеристику термопары одной прямой (или парой прямых) без ущерба для точности прибора.
Без плавучки, имхо, в этой задаче можно легко обойтись. Nadc = Nadc_max*(Kу*Uт)/Uref. Вот и посчитайте на бумажке зависимость Nadc(T).
Go to the top of the page
 
+Quote Post
Goodefine
сообщение Feb 25 2009, 12:26
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 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


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


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Goodefine @ Feb 25 2009, 16:26) *
Расстояние между индексами 100мкв, например, по таблице

Куда удобнее расстояние делать в 1 попугай АЦП. Нам-то, суровым авр-щикам crying.gif
Go to the top of the page
 
+Quote Post
Ivan Kuznetzov
сообщение Feb 25 2009, 12:34
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 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];

Это примерно, но принцип понятен, думаю...

последняя формула точно так будет выглядеть или это пример?


--------------------
Разработчик
Go to the top of the page
 
+Quote Post
Goodefine
сообщение Feb 25 2009, 12:35
Сообщение #10


Местный
***

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



Цитата
Куда удобнее расстояние делать в 1 попугай АЦП. Нам-то, суровым авр-щикам crying.gif
Зато так удобнее передрать зависимость ЭДС от температуры из паспорта термопары. Не принципиально, в общем... Но потом Ваш вариант, безусловно, приятней smile.gif
Цитата
последняя формула точно так будет выглядеть или это пример?

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

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


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


Местный
***

Группа: Свой
Сообщений: 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" градусов - в чем тут могут быть грабли?
crying.gif

Сообщение отредактировал Ivan Kuznetzov - Feb 25 2009, 12:47


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


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Ivan Kuznetzov @ Feb 25 2009, 16:46) *
когда на входе ADC ноль то температуру кажет " - 198" градусов - в чем тут могут быть грабли?
crying.gif

И зачем так плакать? Добавили дополнительную проверку на ноль - и делов-то. У Вас индекс ссылается куда? gradtbl[i - 1].. не надо матюков -  и так видно smile.gif
Go to the top of the page
 
+Quote Post
Goodefine
сообщение Feb 25 2009, 13:06
Сообщение #13


Местный
***

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



Зачем здесь флоат не понятно. Видно (из табл), что больше 52430 мкв Вам не понадобится. Т.е. инта для переменной напряжения хватит. Далее, обычно вместе с таблицей указывается полином зависимости. В том же экселе по нему можно найти ряд температур с шагом, скажем 1000 мкв. В этом случае температурный массив будет состоять где-то из 53 значений типа инт (если домножить на 10 - чтоб с десятыми и без флоат). Потом похожим (только учесть что шаг 1000 мкв) способом легко и относительно быстро найти искомую температуру с точностью до десятых, взяв остаток от которой найдем сами десятые в НЕ флоат...

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


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


Местный
***

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



Цитата(_Pasha @ Feb 25 2009, 17:53) *
И зачем так плакать? Добавили дополнительную проверку на ноль - и делов-то. У Вас индекс ссылается куда? gradtbl[i - 1].. не надо матюков -  и так видно smile.gif

я так и не понял где ошибка-то?


--------------------
Разработчик
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 25 2009, 13:30
Сообщение #15


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Ivan Kuznetzov @ Feb 25 2009, 17:12) *
я так и не понял где ошибка-то?


Код
themp = 0;

for (i = 1; i < 132; i++)



дальше по тексту. А привиделось нечто другое...
Go to the top of the page
 
+Quote Post

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

 


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


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