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

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

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

Ответ
 
Опции темы Опции просмотра
Старый 17.05.2019, 06:27   #1
smart_pic
Senior Member
 
Регистрация: 08.12.2008
Адрес: Ставрополь
Возраст: 56
Сообщений: 1,028
Вес репутации: 2657/77
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,893
Вес репутации: 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
Вес репутации: 1630/60
DmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant future
По умолчанию 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,893
Вес репутации: 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
Вес репутации: 1630/60
DmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant future
По умолчанию 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
Адрес: Ставрополь
Возраст: 56
Сообщений: 1,028
Вес репутации: 2657/77
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
Сообщений: 380
Вес репутации: 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, время: 15:49.


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