Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Общетехнические вопросы

Общетехнические вопросы Общие вопросы аналоговой и цифровой электроники.

Ответ
 
Опции темы Опции просмотра
Старый 17.05.2019, 06:27   #1
smart_pic
Senior Member
 
Регистрация: 08.12.2008
Адрес: Ставрополь
Возраст: 55
Сообщений: 1,024
Вес репутации: 2657/76
smart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond repute
Отправить сообщение для smart_pic с помощью Skype™
По умолчанию входные цепи измерителя температуры

Необходимо сделать измеритель температуры на несколько точек.
Используемые датчики:
NTC – датчик температуры NTCLE100E3103JB0;
TSP – датчик температуры РТ-100 (TSP-100);
TXA – термопара типа TXA;


не силен в измерительной аналоговой схемотехнике ,поэтому прошу совета , что можно использовать. нужны ссылки на изучение этой темы и желательно реализацию на простой доступной базе. Точность устроит до 5%. Измерения будет делать микроконтроллер, поэтому допустима калибровка.
Желательно Простые проверенные решения, которые собрал и гарантированно работают. Питание желательно однополярное 3ю3В или 5В.
smart_pic вне форума   Ответить с цитированием
Старый 17.05.2019, 19:52   #2
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,887
Вес репутации: 5611/171
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: входные цепи измерителя температуры

Цитата:
Сообщение от smart_pic Посмотреть сообщение
Необходимо сделать измеритель температуры на несколько точек.
Используемые датчики:
NTC – датчик температуры NTCLE100E3103JB0;
TSP – датчик температуры РТ-100 (TSP-100);
TXA – термопара типа TXA;


не силен в измерительной аналоговой схемотехнике ,поэтому прошу совета , что можно использовать. нужны ссылки на изучение этой темы и желательно реализацию на простой доступной базе. Точность устроит до 5%. Измерения будет делать микроконтроллер, поэтому допустима калибровка.
Желательно Простые проверенные решения, которые собрал и гарантированно работают. Питание желательно однополярное 3ю3В или 5В.
да прям у микрочипа много аппнотов как раз по температуре и на разных технологиях.
для платины использую ацп от микрочипа mcp355х (тоже есть специальная аппота).
Greg вне форума   Ответить с цитированием
Старый 18.05.2019, 09:18   #3
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 835
Вес репутации: 1473/58
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: входные цепи измерителя температуры

Цитата:
Сообщение от smart_pic Посмотреть сообщение
TSP – датчик температуры РТ-100 (TSP-100)
http://ww1.microchip.com/downloads/e...tes/00687c.pdf
DmitrijVDN на форуме   Ответить с цитированием
Старый 18.05.2019, 18:51   #4
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,887
Вес репутации: 5611/171
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: входные цепи измерителя температуры

Цитата:
Сообщение от DmitrijVDN Посмотреть сообщение
нет, имелась в виду другая аппнота, без этой жути
http://ww1.microchip.com/downloads/e.../00001154B.pdf , хотя тоже 2008 год
Greg вне форума   Ответить с цитированием
Старый 18.05.2019, 19:53   #5
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 835
Вес репутации: 1473/58
DmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud ofDmitrijVDN has much to be proud of
По умолчанию Re: входные цепи измерителя температуры

да, я и так это понял, это на случай пользования внутреннего АЦП МК
DmitrijVDN на форуме   Ответить с цитированием
Старый 02.06.2019, 21:39   #6
GoshaGrek
Senior Member
 
Регистрация: 29.09.2011
Сообщений: 280
Вес репутации: 357/35
GoshaGrek is just really niceGoshaGrek is just really niceGoshaGrek is just really niceGoshaGrek is just really nice
По умолчанию Re: входные цепи измерителя температуры

Цитата:
Сообщение от DmitrijVDN Посмотреть сообщение
да, я и так это понял, это на случай пользования внутреннего АЦП МК
ПОД термопару ХА (тип К) как то делал такую схему. Как по мне- так проще и дешевле почти некуда. Правда температура у меня там была до 255(сушильный шкаф типа).Но при желании переделать до 1000 не проблема. Работает нормально уже почти 2 года

//================================================== ======================
// Типа терморегулятор - термометр для сушильного электрошкафа
// с термопарой
// Процессор 16F684 - частота 4МГц
// Версия 1.0
// Дата - 24.06.2017
// Контроль температуры до +255°С
// Регулирование температуры по двухпозиционному закону
// Гистерезис 2°С
// Выход на реле
// Задержка включения/выключения реле 2сек
//================================================== ======================
#include <pic.h>
#include <stdio.h>

#define _XTAL_FREQ 4000000 //defined for delay

__CONFIG(INTIO&WDTEN&MCLREN&PWRTEN&UNPROTECT&BORDI S);

//================================================== ======================
// КОНСТАНТЫ,МАКРОСЫ И ПЕРЕМЕННЫЕ
//================================================== ======================
#define BitIsClear(reg, bit) ((reg & (1<<(bit))) == 0)
//пример: if (BitIsClear(PORTB,1)) {...} //если бит очищен

#define BitIsSet(reg, bit) ((reg & (1<<(bit))) != 0)
//пример: if(BitIsSet(PORTB,2)) {...} //если бит установлен

#define InvBit(reg, bit) reg ^= (1<<(bit))
//пример: InvBit(PORTB, 1); //инвертировать 1-й бит PORTB

//********* определения для индикатора **********

#define sgA RA4
#define sgB RA5
#define sgC RC0
#define sgD RC1
#define sgE RC2
#define sgF RC3
#define sgG RC4

#define DIGIT_1 RA0
#define DIGIT_2 RA1
#define DIGIT_3 RA2

#define HEAT RC5

#define flag_set flags.b0 // флаг меню установки температуры
#define flag_blink flags.b1 // флаг мигалки индикации в меню
#define flag_ind flags.b3
#define flag_hold flags.b4
#define flag_heat flags.b5

#define pusto 10
//********** переменные и константы ***********
volatile unsigned char hyst = 2; //гистерезис при регулировании
volatile unsigned char segcounter = 0;
volatile unsigned char display; // то что выводим на индикатор
volatile unsigned char setpoint;
volatile unsigned char setpoint_old;
volatile unsigned char blinkcounter; //мигалка в режиме установки уставки
volatile unsigned char setcounter; //счетчик режимов меню установки
volatile unsigned char switchcounter;
volatile unsigned char temperature;
unsigned char hundreds,tens,ones;
unsigned char temp;
//-------------------------------------------------------------------
const unsigned char tblSg[]={ // abcdefg // портреты символов
0b01111110, // 0
0b00110000, // 1
0b01101101, // 2
0b01111001, // 3
0b00110011, // 4
0b01011011, // 5
0b01011111, // 6
0b01110000, // 7
0b01111111, // 8
0b01111011, // 9
0b00000000, // pusto
};//

volatile union // для преобр. байта в сегменты индикаторов
{
unsigned char j;
struct
{
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
}indbi;
}indbt;

volatile struct //для контрольных битов
{
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
}flags;

volatile unsigned char sg1,sg2,sg3,sg4;

//для контроля кнопок
typedef struct {
unsigned char Toggle; // Состояния входов
unsigned char Jitter : 2; // Для подавления дребезга кнопок
unsigned char Counter : 6; // Для проверки удерживания
unsigned char Hold; // Состояние длительного удерживания
//------------------------------- // События:
unsigned char Short; // Короткое нажатие и отпускание
unsigned char Changed; // Состояние входов изменилось

} my_structure;

volatile my_structure inState;

//================================================== ======================
// ПРОТОТИПЫ ФУНКЦИЙ
//================================================== ======================
void init(void);
void interrupt isr(void); // функция обработки прерываний
void dinind(void); //динамическая индикация
void Task_Inputs(void); //проверка нажатия кнопок
void convert(void);//функция преобразование int числа
//из двоичного в двоично-десятичный формат
//================================================== ======================
// функции (этого проекта)
//================================================== ======================
// НАЧАЛЬНАЯ ИНИЦИАЛИЗАЦИЯ КОНТРОЛЛЕРА
//================================================== ======================
void init(void) {
PEIE = 0;
GIE = 0;
ANSEL = 0x00; // АЦП отключить!!!!!!!!!!
ADCON0 = ADCON1 = 0x00;
ADRESL = ADRESH = 0x00;
CMCON0 = 0x07; //компаратор отключить!!!!!!!!!!
CMCON1 = 0x00;
//инициализация портов и таймеров
TRISA = 0x00;
WPUA = 0x00;
TRISC = 0b00000000;
CCP1CON = 0x00; //модуль ШИМ отключить
OPTION = 0b101000100; //
// инициализация TMR0
OPTION = 0b10000011;
T0IE = 1;
T0IF = 0;
TMR0 = 110;
//инициализация TMR1
T1CON = 0b00000101;
TMR1IE = 1;
TMR1L = 3;
TMR1H = 217;
TMR1IF = 0;
}
//================================================== ======================
// функция вывода байта на индикаторы
//================================================== ======================
void outByte(unsigned char bt) {
indbt.j = tblSg[bt];
sgA = !indbt.indbi.b6;
sgB = !indbt.indbi.b5;
sgC = !indbt.indbi.b4;
sgD = !indbt.indbi.b3;
sgE = !indbt.indbi.b2;
sgF = !indbt.indbi.b1;
sgG = !indbt.indbi.b0;
}//
//================================================== ======================
// КОНТРОЛЬ СОСТОЯНИЯ КНОПОК
//================================================== ======================

void Task_Inputs(void) {
static unsigned char prInputs; // Предыдущее состояние входов
unsigned char inTemp;
inTemp = 0x00;
if (!DIGIT_2) inTemp |= 0x02;
if (!DIGIT_3) inTemp |= 0x04;
inTemp ^= prInputs; // Изменения с момента последнего выполнения
prInputs ^= inTemp; // Текущее состояние входов
// Подавление дребезга
if (inTemp) {
inState.Jitter = 0;
return;
}
//---------------------------------------------------------------------
inState.Jitter++;
inTemp = prInputs ^ inState.Toggle; // Маска изменения состояние
// Состояние изменилось, дребезг подавлен
if (!inState.Jitter && inTemp) {
// Есть отпущенные
if (inState.Toggle & inTemp) {
inState.Changed |= inTemp;
inState.Short |= inTemp;
inState.Short &= ~inState.Hold;
inState.Hold &= ~inTemp;
} //
// Есть нажатые
if ((inState.Toggle ^ inTemp) & inTemp) {
inState.Changed |= inTemp;
inState.Short &= ~inTemp;
} //
inState.Toggle = prInputs;
inState.Counter = 0;
} //
inState.Counter++;
// Длительное удерживание
if (inState.Counter == 50) {
inState.Changed |= inState.Hold ^ inState.Toggle;
inState.Hold = inState.Toggle;
}
}
//================================================== ======================
//функция преобразование int числа из двоичного в двоично-десятичный формат
//================================================== ======================
void convert(void) {
hundreds = 0;
tens = 0;
ones = 0;
while (temp > 9) {
if (temp > 99) {
hundreds++;
temp -= 100;
} else if ((temp > 9) && (temp <= 99)) {
tens++;
temp -= 10;
}
}
if ((temp >= 0) && (temp <= 9)) ones = temp;
sg1 = hundreds;
sg2 = tens;
sg3 = ones;
}
//================================================== ======================
// ДИНАМИЧЕСКАЯ ИНДИКАЦИЯ
//================================================== ======================
void dinind(void){
switch (segcounter){
//вывод первого индикатора
case 0:
RA0=1;
RA1=0;
RA2=0;
if(sg1 == 0){
outByte(pusto);
}
else if ((flag_set == 0)||((flag_set == 1)&&(flag_blink == 1))||
((flag_set == 1)&&(flag_hold == 1))){
outByte(sg1);
}
break;
//вывод второго индикатора
case 1:
RA0=0;
RA1=1;
RA2=0;
if((sg1 == 0)&&(sg2 == 0)){
outByte(pusto);
}
else if ((flag_set == 0)||((flag_set == 1)&&(flag_blink == 1))||
((flag_set == 1)&&(flag_hold == 1))){
outByte(sg2);
}
break;
//вывод третьего индикатора
case 2:
RA0=0;
RA1=0;
RA2=1;
if ((flag_set == 0)||((flag_set == 1)&&(flag_blink == 1))||
((flag_set == 1)&&(flag_hold == 1))){
outByte(sg3);
}
break;
}
if (segcounter++ > 1) segcounter = 0;
}
//================================================== ======================
// ОБРАБОТКА ПРЕРЫВАНИЙ
//================================================== ======================
void interrupt isr(void) {
//прерывание TMR0 - динамическая индикация + контроль кнопок
// Tick ~ 2.5ms
if (T0IF && T0IE) {
CLRWDT();
//чтоб мигало в режиме установки
blinkcounter++;
if (blinkcounter == 120) {
flag_blink = !flag_blink;
blinkcounter = 0;
}
if (flag_ind == 1) {
dinind();
}
if (flag_ind == 0) {
RA0 = 0;
RA1 = 0;
RA2 = 0; //
outByte(pusto);
sgA = sgB = sgC = sgD = sgE = sgF = sgG = 1;
TRISA = 0b00000110;
OPTION = 0b00000011;
WPUA = 0b00000110;
Task_Inputs();
// инициализация АЦП
TRISA = 0b00000111;
ANSEL = 0b00000001;
ADCON1 = 0b00010000; // АЦП включен,t преобр 4мкС при Fosc=4MHz
ADCON0 = 0b00000001; // ан. канал 0 , левое выравнивание
ADRESL = ADRESH = 0x00;
__delay_us(100);
GODONE = 1;
while (GODONE);
temperature = ADRESH;
display = temperature;
TRISA = 0x00;
ANSEL = 0x00;
ADCON0 = 0x00;
OPTION = 0b10000011;
WPUA = 0x00;
}
flag_ind = !flag_ind;
TMR0 = 110;
T0IF = 0;
T0IE = 1;

}
//прерывание TMR1
// Tick ~ 10ms
//отсчет временных интервалов и управление нагревателем
if (TMR1IF && TMR1IE) {
CLRWDT();
//-----------------------------------------------------------------
if ((temperature >= setpoint)&&(flag_heat == 1)) {
switchcounter++;
if(switchcounter == 200){
HEAT = 0;
flag_heat = 0;
switchcounter = 0;
}
}
else if ((temperature <= (setpoint - hyst))&&(flag_heat == 0)) {
switchcounter++;
if(switchcounter == 200){
HEAT = 1;
flag_heat = 1;
switchcounter = 0;
}
}
else switchcounter = 0;
//---------------------------------------------------
TMR1L = 3;
TMR1H = 217;
TMR1IF = 0;
}
}
//================================================== ======================
// ОСНОВНОЙ БЛОК ПРОГРАММЫ
//================================================== ======================

void main() {
init();
CLRWDT();
//инициализация флагов и режимов
flag_set = 0;
flag_blink = 0;
flag_heat = 0;
display = 0;
setcounter = 0;
segcounter = 0;
blinkcounter = 0;
switchcounter = 0;
setpoint_old = EEPROM_READ(0); // прочитать значение
setpoint = setpoint_old; //уставки из EEPROM
temperature = 0;
flag_ind = 0;
HEAT = 0;
PEIE = 1;
GIE = 1; //

for (; {
temp = display;
convert();
if (flag_set == 1){
TMR1IE = 0;
TMR1IF = 0;
HEAT = 0;
flag_heat = 0;
}
else TMR1IE = 1;
//в рабочем режиме индикация уставки при
//длинном нажатии на кнопку >/set
if ((flag_set == 0)&&(BitIsSet(inState.Hold, 1))){
display = setpoint;
temp = display;
convert();
}
//выбор меню установки уставки
if (BitIsSet(inState.Short, 1)) {
setcounter++;
if (setcounter == 1) {
flag_set = 1;
}
//сброс меню
else if (setcounter > 1) {
flag_set = 0;
setcounter = 0;
}
}
//установка температуры регулирования
if (flag_set == 1) {
//увеличиваем температуру
if ((BitIsSet(inState.Hold, 1))&&(setpoint < 254)) {
setpoint++;
flag_hold = 1;
flag_blink = 0;
}
//уменьшаем температуру
if ((BitIsSet(inState.Hold, 2))&&(setpoint > 0)) {
setpoint--;
flag_hold = 1;
flag_blink = 0;
}
if ((BitIsClear(inState.Hold, 1))&&
(BitIsClear(inState.Hold, 2))) {
flag_hold = 0;
}
temp = setpoint;
convert();
}
// запись значения уставки температуры в EEPROM
if ((setpoint_old != setpoint)&&(flag_set == 0)) {
setpoint_old = setpoint;
EEPROM_WRITE(0, setpoint_old); // записали
}
inState.Changed = 0x00;
inState.Short = 0x00;
__delay_ms(500);
}//
}//
Миниатюры
Pechka_32.jpg  
GoshaGrek вне форума   Ответить с цитированием
Старый 02.06.2019, 21:45   #7
GoshaGrek
Senior Member
 
Регистрация: 29.09.2011
Сообщений: 280
Вес репутации: 357/35
GoshaGrek is just really niceGoshaGrek is just really niceGoshaGrek is just really niceGoshaGrek is just really nice
По умолчанию Re: входные цепи измерителя температуры

в принципе усилитель термопары можно упростить. А компенсацию холодного спая (по горячим следам) сделать на 18В20. Но тогда надо контроллер другой походу - что то типа 690
GoshaGrek вне форума   Ответить с цитированием
Старый 06.06.2019, 10:16   #8
smart_pic
Senior Member
 
Регистрация: 08.12.2008
Адрес: Ставрополь
Возраст: 55
Сообщений: 1,024
Вес репутации: 2657/76
smart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond repute
Отправить сообщение для smart_pic с помощью Skype™
По умолчанию Re: входные цепи измерителя температуры

Нашел на просторах сети такую схему.
Одни подключают термопару к инвертирующему входу, а другие к неинвертирующему входу. Что лучше?
Миниатюры
Термопара.jpg   термопара 1.jpg   Термопара 2.jpg  
smart_pic вне форума   Ответить с цитированием
Старый 06.06.2019, 15:20   #9
GoshaGrek
Senior Member
 
Регистрация: 29.09.2011
Сообщений: 280
Вес репутации: 357/35
GoshaGrek is just really niceGoshaGrek is just really niceGoshaGrek is just really niceGoshaGrek is just really nice
По умолчанию Re: входные цепи измерителя температуры

Цитата:
Сообщение от smart_pic Посмотреть сообщение
Нашел на просторах сети такую схему.
Одни подключают термопару к инвертирующему входу, а другие к неинвертирующему входу. Что лучше?
LM358 - для таких схем не годится , имхо.
Большие входные токи и напряжение смещения.
Чуть лучше майкрочиповский МСР601 но тоже не совсем то.
Я когда делал свою схему, (а таких устройства сделал два - на две печки, и обе работают ) то из недорогих оу нашел только AD8628 , 8551 тоже по идее должно пойти
GoshaGrek вне форума   Ответить с цитированием
Старый 06.06.2019, 15:42   #10
HJV
Senior Member
 
Регистрация: 25.02.2007
Адрес: Чита
Возраст: 39
Сообщений: 376
Вес репутации: 811/58
HJV is a splendid one to beholdHJV is a splendid one to beholdHJV is a splendid one to beholdHJV is a splendid one to beholdHJV is a splendid one to beholdHJV is a splendid one to beholdHJV is a splendid one to behold
Отправить сообщение для HJV с помощью ICQ
По умолчанию Re: входные цепи измерителя температуры

Для термопары наверно лучше брать инструментальный усилитель, типа AD620, AD8429 и т.д.
HJV на форуме   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регулятор температуры для отопления Denia Вопросы начинающих 1 21.02.2009 03:57


Часовой пояс GMT +3, время: 04:02.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot