Термопара К типа и AVR

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
grinay
Открыл глаза
Сообщения: 44
Зарегистрирован: Пн июл 06, 2009 07:42:07

Re: Термопара К типа и AVR

Сообщение grinay »

pyzh_man писал(а):Дабы расставить точки над i привожу текст своего сообщения:
Добрый день! Вроде все разжевали, не составит труда особого самим написать. Могу, конечно, написать, но за оплату работы.

??? Сижу, обтекаю. :)

Не чего личного. Я просил помощи, а не платной помощи:) если бы мне было не обходимо заплатить я бы просто обратился во внии чтоли и что нить подобное:) Но это уже - бред какой то чтоли так%)
На просторах инета я не нашел удовлетворяющего варианта. Вот и прошу. Кстати не многого.

Ведь код написан единственное что осталось это мать его полином.
В том простом виде где просто сложить и умножить - температура врет ой как сильно...
Потому что то где то не так:)
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: Термопара К типа и AVR

Сообщение Satyr »

Не оттуда начали. Точность какая нужна ?
Если это, как я понимаю, паяльная станция, то там и +-5 градусов роли не играют.

А под такую точность можно представить заранее расчитанной кусочно-линейной функцией по нескольким десяткам точек.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Термопара К типа и AVR

Сообщение oleg110592 »

Код: Выделить всё

unsigned int GetTemperature()
{
char i;
unsigned int Adc;
unsigned long Vf;
int p1,p2;

    Adc=0;
    for (i=0; i<64; i++) {
        Adc += read_adc(1);
    }
    Adc>>=6;
//вычисляем напряжения термопары в десятках мкВ:
    Vf=(((unsigned long)Adc)*((500000000/1023)/836))/100;

    unsigned int Vhj = (unsigned int)Vf;
//находим целое число милливольт:
    signed char Index = Vhj / 100;

        Index = Index - TC_V_MIN;
//проверяем выход за диапазон вниз:
        if(Index < 1) return(Lin[0]);
//проверяем выход за диапазон вверх:
        if(Index > TC_POINTS - 2) return(Lin[TC_POINTS - 1] / 10);
//читаем первую точку таблицы:
//температура представлена в десятых градуса
         p1 = Lin[Index];
//читаем вторую точку таблицы:
        Index++;
        p2 = Lin[Index];
//вычисляем дельту на интервале 1 мВ:
        int DeltaT = p2 - p1;
//вычисляем дробную часть милливольт:
        int DeltaV = Vhj % 100;
//линейная интерполяция по отрезку 1 мВ:
        p1 = p1 + DeltaV * DeltaT / 100;
//подготовка к округлению:
        p1 += 5;
  //возвращаем температуру в градусах:
    return(p1 / 10);
}

таблица вычисляется из полинома на копьютере, делал так для другой термопары
АЦП внутренний меги48 vref=5В + внешний ОУ с коэффициентом усиления 83.6 (в тексте 836 для упрощения). ОУ включен практически по схеме в даташите на AD8551.
grinay
Открыл глаза
Сообщения: 44
Зарегистрирован: Пн июл 06, 2009 07:42:07

Re: Термопара К типа и AVR

Сообщение grinay »

Всем спасибо. Но я все же добился полного расчета по формулам из госта. Все верно температуру показывает в точноти до пол градуса, большего на 18 битной ацп не добится. Но меня и так вполне устраивает.
Компенсацию холодного спая сделал по таблице из госта. от 0-50 гр. Думаю при других условиях станцию не будет эксплуатироватся:)
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Термопара К типа и AVR

Сообщение pyzhman »

Тешу себя надеждой что хотя бы маленький кусочек этого спасибо мой. :?
Docendo discimus
grinay
Открыл глаза
Сообщения: 44
Зарегистрирован: Пн июл 06, 2009 07:42:07

Re: Термопара К типа и AVR

Сообщение grinay »

pyzh_man писал(а):Тешу себя надеждой что хотя бы маленький кусочек этого спасибо мой. :?

И твой тоже%)
grinay
Открыл глаза
Сообщения: 44
Зарегистрирован: Пн июл 06, 2009 07:42:07

Re: Термопара К типа и AVR

Сообщение grinay »

Кстати чтобы не ввести не кого в заблуждение, я не много не доглядел , в это АЦП предусмотрено усиление сигнала аж до 8 раз.Это означает что можно добиться класса точности в 0.05 градуса. Что собственно я и сделал%)
KpuBoHic
Родился
Сообщения: 3
Зарегистрирован: Пн янв 09, 2012 17:26:46

Re: Термопара К типа и AVR

Сообщение KpuBoHic »

Здраствуйте. Я новичок-любитель в МП-програмировании и пока что еще учусь, поэтому нужна помощь профи!!
Задача состоит в подключении АЦП (MCP3421) к ATMEGA8 и через I2C правильно считать информацию с АЦП. Но пока что не получаеться правильно отладить считывание данных.
Изображение
Вот есть функции для использования I2C но не понятно что за переменные должны быть заместь unsigned char, на что и ругаеться компилятор (CodeVisonAVR). Подскажите как правильно это сделать или где это можно узнать.

Код: Выделить всё

         i2c_start();
         i2c_write(unsigned char);
         i2c_read(unsigned char);
         i2c_stop();

Прошу строго не судить.
Заранее спасибо.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Термопара К типа и AVR

Сообщение pyzhman »

unsigned char i2c_read(unsigned char ack)
reads a byte from the bus.
The ack parameter specifies if an acknowledgement is to be issued after the byte was read.
Set ack to 0 for no acknowledgement or 1 for acknowledgement.

unsigned char i2c_write(unsigned char data)
writes the byte data to the bus.
Returns 1 if the slave acknowledges or 0 if not.
Docendo discimus
KpuBoHic
Родился
Сообщения: 3
Зарегистрирован: Пн янв 09, 2012 17:26:46

Re: Термопара К типа и AVR

Сообщение KpuBoHic »

Исходя из
unsigned char i2c_read(unsigned char ack)
reads a byte from the bus.
The ack parameter specifies if an acknowledgement is to be issued after the byte was read.
Set ack to 0 for no acknowledgement or 1 for acknowledgement.

использовал следующий код

Код: Выделить всё

int t;
i2c_start();
t = i2c_read(1);
i2c_stop();

Но в результате с АЦП так не чего и не получил :( (пробовал i2c_read(1) и i2c_read(0) ).
Хотя на осцилографе пакет даных постоянно отправляеться.
Что не так делаю???
Аватара пользователя
Roma4ka
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пт фев 05, 2010 20:47:51

Re: Термопара К типа и AVR

Сообщение Roma4ka »

использую ниже приведенный код для CVAVR, на симуляторе работает а реальности нет, комнатную температуру не показывает, если нагреть паяльником то показывает 350 С вот....
потенциометрам регулируется только при нагреве выше 50 С

Код: Выделить всё


#define TC_K      40.0  //температурный коэффициент для CJ, мкВ/°C
#define T_RES      0.25 //дискретность представления температуры CJ, °C (DS18B20)

#define TC_V_MIN -3 //минимальное напряжение с термопары, мВ
#define TC_V_MAX 54 //максимальное напряжение с термопары, мВ
#define TC_POINTS (TC_V_MAX - TC_V_MIN + 1) //количество точек таблицы

//Таблица линеаризации термопары K-типа. В таблице даны значения
//температуры в десятых долях градуса в зависимости от напряжения.
//Диапазон температур -82.4...+1346.0°C.
//Шаг напряжения - 1 мВ, диапазон -3..+54 мВ
const int __flash Lin[TC_POINTS] =
{
  -824, -531, -259,                                            //-3..-1 мВ
  0, 250, 495, 736, 976, 1220, 1466, 1715, 1965, 2215,         // 0.. 9 мВ
  2462, 2707, 2950, 3190, 3430, 3668, 3906, 4143, 4378, 4614,  //10..19 мВ
  4849, 5083, 5318, 5553, 5787, 6022, 6258, 6494, 6731, 6969,  //20..29 мВ
  7208, 7449, 7690, 7933, 8177, 8423, 8670, 8919, 9169, 9421,  //30..39 мВ
  9674, 9929, 10186, 10445, 10706, 10969, 11234, 11501, 11772, //40..48 мВ
  12045, 12321, 12600, 12883, 13169, 13460                     //49..54 мВ
};
unsigned int GetTemperature()
{
char i;
unsigned int Adc;
unsigned long Vf;
unsigned int Vhj;
 signed char Index;
int p1,p2;
int DeltaV;
int DeltaT;


    Adc=0;
    for (i=0; i<64; i++) {
        Adc += read_adc(6);
    }
    Adc>>=6;
//вычисляем напряжения термопары в десятках мкВ:
    Vf=(((unsigned long)Adc)*((500000000/1023)/836))/100;

    Vhj = (unsigned int)Vf;
//находим целое число милливольт:
    Index= Vhj / 100;

        Index = Index - TC_V_MIN;
//проверяем выход за диапазон вниз:
        if(Index < 1) return(Lin[0]);
//проверяем выход за диапазон вверх:
        if(Index > TC_POINTS - 2) return(Lin[TC_POINTS - 1] / 10);
//читаем первую точку таблицы:
//температура представлена в десятых градуса
         p1 = Lin[Index];
//читаем вторую точку таблицы:
        Index++;
        p2 = Lin[Index];
//вычисляем дельту на интервале 1 мВ:
        DeltaT = p2 - p1;
//вычисляем дробную часть милливольт:
        DeltaV = Vhj % 100;
//линейная интерполяция по отрезку 1 мВ:
        p1 = p1 + DeltaV * DeltaT / 100;
//подготовка к округлению:
        p1 += 5;
  //возвращаем температуру в градусах:
    return(p1 / 10);
}


Изображение
Вложения
2904.JPG
(76.29 КБ) 9682 скачивания
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Re: Термопара К типа и AVR

Сообщение hybroid »

Оно у вас схемотехнически не способно регистрировать комнатную температуру. Термопаре нужна компенсация холодного спая, т.к. э.д.с. термопары - это разница между "горячим" и "холодными" концами. Компенсацию можно делать либо на Dallas'овском интегральном датчике, либо диодами, либо постоянно одно и то же напряжение подмешать на вход ОУ резистором. Посмотрите схемы паяльных станций на нашем форуме.. Например, вот: http://www.radiokot.ru/forum/download/f ... w&id=43470 тут резистором R1 как раз устанавливается комнатная температура (но она не будет меняться, это жёсткая компенсация как бы).
А код, кстати, Леонида Ивановича вроде бы :) Запомнилась его кусочная табличка. Вот можете и посмотреть на схему его паяльной станции или фена, там этот код родился. Ищите по DSS и по DSF.
Аватара пользователя
Roma4ka
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пт фев 05, 2010 20:47:51

Re: Термопара К типа и AVR

Сообщение Roma4ka »

другими словами я смогу снимать показания толь от 50 до 1000 С ? :(
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Re: Термопара К типа и AVR

Сообщение hybroid »

По идее нет. 0 ваших показаний - это комната. А если термопара в паяльнике - то его ручка (а там горячее). И дальше с этой разницей вверх. Т.е. ваши снятые 50 градусов - это в реальности может быть от 70 до 100, в случае паяльника. А то и выше 100 :) Можно раз погреть паяльник на его рабочей температуре (при скольки вы там обычно работаете?) и померять температуру у него в ручке, около концов термопары, у места пайки. Потом программно плюсовать к снятым показаниям. Так будет хоть какая-то сомнительная точность. Если у вас вообще не паяльник, то желательно делать точную компенсацию. Хотя бы диодами.
http://www.radiokot.ru/forum/viewtopic. ... start=3360 отлистайте этот топик назад, страниц на 30 наверное.. Там среди сообщений Liv'а можно многому поучиться по данному вопросу, и даже больше данного вопроса.
zöner
Вымогатель припоя
Сообщения: 502
Зарегистрирован: Чт фев 16, 2012 19:00:11

Re: Термопара К типа и AVR

Сообщение zöner »

а насколько нужна аппроксимация полиномом ? Для пайки реально нужен узкий диапазон 150..300град, а там достаточно и линейной зависимости. Тоже сделал ИК паялку, но на STM32, там хватило линейной зависимости, меряю встроенным АЦП, правда усилители не на 358 а немного лучше...
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»