yakuzaa 0 25 февраля, 2009 Опубликовано 25 февраля, 2009 · Жалоба Как сделать вычисление значения температуры по градуировочной таблице термопары? Пишу прогу на сях. К примеру, измеряем напряжение с термопары, усиливаем его (с известным Ку) и подаем на вход ADC0 атмеги - там делим на Ку и получаем милливольты; есть также градуировочная таблица для термопары вида: float gradtbl[131]={0 , 0.40 , 0.80 , 1.20 ...... и т.д. 131 значение как сделать пересчет значения миливольт в градусы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Petka 0 25 февраля, 2009 Опубликовано 25 февраля, 2009 · Жалоба Как сделать вычисление значения температуры по градуировочной таблице термопары? Пишу прогу на сях. К примеру, измеряем напряжение с термопары, усиливаем его (с известным Ку) и подаем на вход ADC0 атмеги - там делим на Ку и получаем милливольты; есть также градуировочная таблица для термопары вида: float gradtbl[131]={0 , 0.40 , 0.80 , 1.20 ...... и т.д. 131 значение как сделать пересчет значения миливольт в градусы? какой тип термопары? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 25 февраля, 2009 Опубликовано 25 февраля, 2009 · Жалоба Как сделать вычисление значения температуры по градуировочной таблице термопары? Пишу прогу на сях. К примеру, измеряем напряжение с термопары, усиливаем его (с известным Ку) и подаем на вход 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)) Можно многочленом сразу. Не забудьте про температуру опорного спая. Только при чем тут АВР и С? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 17 25 февраля, 2009 Опубликовано 25 февраля, 2009 · Жалоба Только при чем тут АВР и С? Ну как же! :rolleyes: Датчик-то к АВР подключается, а программа на си... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 25 февраля, 2009 Опубликовано 25 февраля, 2009 · Жалоба Пишу прогу на сях. :) На тех же сях берете и составляете другую "прогу", но уже для компа, в которой все вышесказанное, только не Переделайте в микровольты (или десятки микровольт) - будут целые. - это слишком общО - сразу пересчет в ожидаемые реальные показания (N=1024*U/Uref) выводите хоть куда - хоть на экран, и потом забираете данные командной строкой типа create.exe >>table.inc Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xemul 0 25 февраля, 2009 Опубликовано 25 февраля, 2009 · Жалоба Начните лучше с требуемых точностных характеристик. Может статься, что с учетом используемой элементной базы будет достаточно аппроксимировать характеристику термопары одной прямой (или парой прямых) без ущерба для точности прибора. Без плавучки, имхо, в этой задаче можно легко обойтись. Nadc = Nadc_max*(Kу*Uт)/Uref. Вот и посчитайте на бумажке зависимость Nadc(T). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Goodefine 0 25 февраля, 2009 Опубликовано 25 февраля, 2009 (изменено) · Жалоба Как вариант: Задаем массив, разбив участки зависимости на прямые (относительно) //условно: 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]; Это примерно, но принцип понятен, думаю... Изменено 25 февраля, 2009 пользователем Goodefine Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 25 февраля, 2009 Опубликовано 25 февраля, 2009 · Жалоба Расстояние между индексами 100мкв, например, по таблице Куда удобнее расстояние делать в 1 попугай АЦП. Нам-то, суровым авр-щикам :crying: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yakuzaa 0 25 февраля, 2009 Опубликовано 25 февраля, 2009 · Жалоба Как вариант: Задаем массив, разбив участки зависимости на прямые (относительно) //условно: 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 0 25 февраля, 2009 Опубликовано 25 февраля, 2009 (изменено) · Жалоба Куда удобнее расстояние делать в 1 попугай АЦП. Нам-то, суровым авр-щикам crying.gifЗато так удобнее передрать зависимость ЭДС от температуры из паспорта термопары. Не принципиально, в общем... Но потом Ваш вариант, безусловно, приятней :) последняя формула точно так будет выглядеть или это пример? Смысл в том что интерполируется число между двумя значениями из таблицы, определенными измеренным напряжением в мкв (загрубленным в "расстояние между значениями по таблице" раз). На практике, конечно, надо поотлаживать этот кусок (остатки, правильный порядок и т.д.)... Изменено 25 февраля, 2009 пользователем Goodefine Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yakuzaa 0 25 февраля, 2009 Опубликовано 25 февраля, 2009 (изменено) · Жалоба Зато так удобнее передрать зависимость ЭДС от температуры из паспорта термопары. Не принципиально, в общем... таблица обычная - тоесть указывается значение ЭДС через каждые 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: Изменено 25 февраля, 2009 пользователем Ivan Kuznetzov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 25 февраля, 2009 Опубликовано 25 февраля, 2009 · Жалоба когда на входе ADC ноль то температуру кажет " - 198" градусов - в чем тут могут быть грабли? :crying: И зачем так плакать? Добавили дополнительную проверку на ноль - и делов-то. У Вас индекс ссылается куда? gradtbl[i - 1].. не надо матюков - и так видно :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Goodefine 0 25 февраля, 2009 Опубликовано 25 февраля, 2009 (изменено) · Жалоба Зачем здесь флоат не понятно. Видно (из табл), что больше 52430 мкв Вам не понадобится. Т.е. инта для переменной напряжения хватит. Далее, обычно вместе с таблицей указывается полином зависимости. В том же экселе по нему можно найти ряд температур с шагом, скажем 1000 мкв. В этом случае температурный массив будет состоять где-то из 53 значений типа инт (если домножить на 10 - чтоб с десятыми и без флоат). Потом похожим (только учесть что шаг 1000 мкв) способом легко и относительно быстро найти искомую температуру с точностью до десятых, взяв остаток от которой найдем сами десятые в НЕ флоат... Изменено 25 февраля, 2009 пользователем Goodefine Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yakuzaa 0 25 февраля, 2009 Опубликовано 25 февраля, 2009 · Жалоба И зачем так плакать? Добавили дополнительную проверку на ноль - и делов-то. У Вас индекс ссылается куда? gradtbl[i - 1].. не надо матюков - и так видно :) я так и не понял где ошибка-то? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 25 февраля, 2009 Опубликовано 25 февраля, 2009 · Жалоба я так и не понял где ошибка-то? themp = 0; for (i = 1; i < 132; i++) дальше по тексту. А привиделось нечто другое... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться