Страница 2 из 2
Re: Термопара К типа и AVR
Добавлено: Вс дек 04, 2011 09:42:49
grinay
pyzh_man писал(а):Дабы расставить точки над i привожу текст своего сообщения:
Добрый день! Вроде все разжевали, не составит труда особого самим написать. Могу, конечно, написать, но за оплату работы.
??? Сижу, обтекаю.

Не чего личного. Я просил помощи, а не платной помощи:) если бы мне было не обходимо заплатить я бы просто обратился во внии чтоли и что нить подобное:) Но это уже - бред какой то чтоли так%)
На просторах инета я не нашел удовлетворяющего варианта. Вот и прошу. Кстати не многого.
Ведь код написан единственное что осталось это мать его полином.
В том простом виде где просто сложить и умножить - температура врет ой как сильно...
Потому что то где то не так:)
Re: Термопара К типа и AVR
Добавлено: Вс дек 04, 2011 10:04:45
Satyr
Не оттуда начали. Точность какая нужна ?
Если это, как я понимаю, паяльная станция, то там и +-5 градусов роли не играют.
А под такую точность можно представить заранее расчитанной кусочно-линейной функцией по нескольким десяткам точек.
Re: Термопара К типа и AVR
Добавлено: Вс дек 04, 2011 10:12:12
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.
Re: Термопара К типа и AVR
Добавлено: Вс дек 04, 2011 16:26:46
grinay
Всем спасибо. Но я все же добился полного расчета по формулам из госта. Все верно температуру показывает в точноти до пол градуса, большего на 18 битной ацп не добится. Но меня и так вполне устраивает.
Компенсацию холодного спая сделал по таблице из госта. от 0-50 гр. Думаю при других условиях станцию не будет эксплуатироватся:)
Re: Термопара К типа и AVR
Добавлено: Вс дек 04, 2011 16:33:26
pyzhman
Тешу себя надеждой что хотя бы маленький кусочек этого спасибо мой.

Re: Термопара К типа и AVR
Добавлено: Пн дек 05, 2011 01:05:35
grinay
pyzh_man писал(а):Тешу себя надеждой что хотя бы маленький кусочек этого спасибо мой.

И твой тоже%)
Re: Термопара К типа и AVR
Добавлено: Пн дек 05, 2011 16:05:51
grinay
Кстати чтобы не ввести не кого в заблуждение, я не много не доглядел , в это АЦП предусмотрено усиление сигнала аж до 8 раз.Это означает что можно добиться класса точности в 0.05 градуса. Что собственно я и сделал%)
Re: Термопара К типа и AVR
Добавлено: Пн янв 09, 2012 18:18:48
KpuBoHic
Здраствуйте. Я новичок-любитель в МП-програмировании и пока что еще учусь, поэтому нужна помощь профи!!
Задача состоит в подключении АЦП (MCP3421) к ATMEGA8 и через I2C правильно считать информацию с АЦП. Но пока что не получаеться правильно отладить считывание данных.

Вот есть функции для использования I2C но не понятно что за переменные должны быть заместь
unsigned char, на что и ругаеться компилятор (CodeVisonAVR). Подскажите как правильно это сделать или где это можно узнать.
Код: Выделить всё
i2c_start();
i2c_write(unsigned char);
i2c_read(unsigned char);
i2c_stop();
Прошу строго не судить.
Заранее спасибо.
Re: Термопара К типа и AVR
Добавлено: Пн янв 09, 2012 19:10:28
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.
Re: Термопара К типа и AVR
Добавлено: Вт янв 10, 2012 20:23:30
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) ).
Хотя на осцилографе пакет даных постоянно отправляеться.
Что не так делаю???
Re: Термопара К типа и AVR
Добавлено: Пт мар 30, 2012 18:34:51
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);
}

Re: Термопара К типа и AVR
Добавлено: Пт мар 30, 2012 18:46:12
hybroid
Оно у вас схемотехнически не способно регистрировать комнатную температуру. Термопаре нужна компенсация холодного спая, т.к. э.д.с. термопары - это разница между "горячим" и "холодными" концами. Компенсацию можно делать либо на Dallas'овском интегральном датчике, либо диодами, либо постоянно одно и то же напряжение подмешать на вход ОУ резистором. Посмотрите схемы паяльных станций на нашем форуме.. Например, вот:
http://www.radiokot.ru/forum/download/f ... w&id=43470 тут резистором R1 как раз устанавливается комнатная температура (но она не будет меняться, это жёсткая компенсация как бы).
А код, кстати,
Леонида Ивановича вроде бы

Запомнилась его кусочная табличка. Вот можете и посмотреть на схему его паяльной станции или фена, там этот код родился. Ищите по DSS и по DSF.
Re: Термопара К типа и AVR
Добавлено: Пт мар 30, 2012 19:47:40
Roma4ka
другими словами я смогу снимать показания толь от 50 до 1000 С ?

Re: Термопара К типа и AVR
Добавлено: Пт мар 30, 2012 20:00:12
hybroid
По идее нет. 0 ваших показаний - это комната. А если термопара в паяльнике - то его ручка (а там горячее). И дальше с этой разницей вверх. Т.е. ваши снятые 50 градусов - это в реальности может быть от 70 до 100, в случае паяльника. А то и выше 100

Можно раз погреть паяльник на его рабочей температуре (при скольки вы там обычно работаете?) и померять температуру у него в ручке, около концов термопары, у места пайки. Потом программно плюсовать к снятым показаниям. Так будет хоть какая-то сомнительная точность. Если у вас вообще не паяльник, то желательно делать точную компенсацию. Хотя бы диодами.
http://www.radiokot.ru/forum/viewtopic. ... start=3360 отлистайте этот топик назад, страниц на 30 наверное.. Там среди сообщений Liv'а можно многому поучиться по данному вопросу, и даже больше данного вопроса.
Re: Термопара К типа и AVR
Добавлено: Пт мар 30, 2012 20:28:10
zöner
а насколько нужна аппроксимация полиномом ? Для пайки реально нужен узкий диапазон 150..300град, а там достаточно и линейной зависимости. Тоже сделал ИК паялку, но на STM32, там хватило линейной зависимости, меряю встроенным АЦП, правда усилители не на 358 а немного лучше...