Перейти к содержанию
    

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

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

 

Пишу прогу на сях.

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

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

 

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

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Пишу прогу на сях.

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

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

 

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

 

 

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

какой тип термопары?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Пишу прогу на сях.

К примеру, измеряем напряжение с термопары, усиливаем его (с известным Ку) и подаем на вход 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))

Можно многочленом сразу.

Не забудьте про температуру опорного спая.

Только при чем тут АВР и С?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только при чем тут АВР и С?

Ну как же! :rolleyes:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пишу прогу на сях.

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

Переделайте в микровольты (или десятки микровольт) - будут целые.
- это слишком общО - сразу пересчет в ожидаемые реальные показания (N=1024*U/Uref) выводите хоть куда - хоть на экран, и потом забираете данные командной строкой типа create.exe >>table.inc

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Без плавучки, имхо, в этой задаче можно легко обойтись. Nadc = Nadc_max*(Kу*Uт)/Uref. Вот и посчитайте на бумажке зависимость Nadc(T).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как вариант:

Задаем массив, разбив участки зависимости на прямые (относительно)

//условно:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Расстояние между индексами 100мкв, например, по таблице

Куда удобнее расстояние делать в 1 попугай АЦП. Нам-то, суровым авр-щикам :crying:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как вариант:

Задаем массив, разбив участки зависимости на прямые (относительно)

//условно:

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];

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Изменено пользователем Goodefine

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зато так удобнее передрать зависимость ЭДС от температуры из паспорта термопары. Не принципиально, в общем...

таблица обычная - тоесть указывается значение ЭДС через каждые 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:

Изменено пользователем Ivan Kuznetzov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

когда на входе ADC ноль то температуру кажет " - 198" градусов - в чем тут могут быть грабли?

:crying:

И зачем так плакать? Добавили дополнительную проверку на ноль - и делов-то. У Вас индекс ссылается куда? gradtbl[i - 1].. не надо матюков -  и так видно :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем Goodefine

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И зачем так плакать? Добавили дополнительную проверку на ноль - и делов-то. У Вас индекс ссылается куда? gradtbl[i - 1].. не надо матюков -  и так видно :)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

themp = 0;

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

 

 

дальше по тексту. А привиделось нечто другое...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...