Главная arrow Проекты arrow По группам arrow Микроконтроллеры arrow Малогабаритный термометр  
22.08.2017 г.
Главная
Проекты
Статьи
Начинающим
Архив новостей
Ссылки
Контакты
Поиск
Файлы
Форум
Карта сайта
Авторизация





Забыли пароль?
Ещё не зарегистрированы? Регистрация
Поддержи наш сайт!
Через WebMoney

 R785211844650
 Z210696637574
 E368177590409

Простые устройстваОтличные товары по превосходным ценамОтличные товары по превосходным ценам
Малогабаритный термометр Печать E-mail
Рейтинг: / 10
ХудшаяЛучшая 
Автор Андрей (aka MOLCHEC)   
13.07.2008 г.

Для контроля процесса ламинирования понадобился термометр, определяющими факторами являлось возможность мерить температуру на торце детали шириной 5 мм и менее, т.е. активная часть датчика должна быть минимальной. Температурный диапазон 0... 200 ºС, при этом сам датчик должен выдерживать более высокую температуру. Источник питания 24В. Поскольку задача не очень сложная я решил её немного усложнить, решив для себя сделать данный девайс минимальными габаритами, и вот что из этого получилось.

 

В качестве датчика был выбран KTY84-130 - это кремневый терморезистр от PHILIPS, у данного датчика диапазон рабочих температур -40...300 °С, что как нельзя лучше для меня подходит. Диаметр датчика 1,6 длина 3,6мм - корпус SOD68 (DO-34), т.е активная часть датчика как раз подходит для выполнения поставленной задачи. Для индикации был выбран светодиодный индикатор от старого компа, ничего другого просто под рукой не было. Управляющий контроллер ATMEGA8L-8AU, его ресурсов вполне достаточно. Поскольку нет требований по стабильности частоты, я использовал внутренний RC генератор, что позволило освободить дополнительные выводы порта B.

Ну вот дело дошло до схемы, её я рисовал с печатной платы и специально для статьи поэтому не исключены ошибки.

Принципиальная схема термометра.
Рисунок 1. Принципиальная схема термометра.

Печатная плата термометра
Рисунок 2. Печатная плата термометра, размер 32*37.

Несколько слов по монтажу: конденсатор С3 припаивал непосредственно к пятачку платы и к пятачку аналоговой земли, используя отрезок провода, сам конденсатор приклеил под индикатором. Плату разводил под ещё один конденсатор его ставить не обязательно. Аналоговую и цифровую земли необходимо соединить в одной точке, я это сделал в месте подключения к источнику питания. Провод до датчика необходимо использовать экранированный. Сам датчик имеет анод и катод, катод обозначен полоской и его следует подключать к земле.

Сопротивление резистора R3* выбирается в зависимости от напряжения питания, опорного напряжения и диапазона температуры. В данном случае напряжение питания 5В, опорное напряжение 2,56, диапазон 0...199. Для расчета был создан EXEL файл, в который с даташита предварительно забил значения сопротивления датчика (см. Таблица 1). Колонка ∆U R содержит значения падения напряжения на сопротивлении. Таким образом значение сопротивления R3 (в таблице ) выбирается таким чтобы падение напряжения при максимальной температуре было немного больше опорного напряжения. Колонка ADC показывает значения 10-ти разрядного преобразования АЦП на основании колонок Т °С и ADC строим график, который затем аппроксимируем в линию Трейда и получаем уравнение функции T(ADC), которое используем для преобразования результата АЦП в цифровое значение температуры. У меня получилось уравнение y= 2,5338x + 407,22, где y-ADC; x-T. Отсюда T(ADC)=(407-ADC)/2,5. Из данных видно, что ноль функции на самом деле при ADC=399. Преобразуем выражение для вычисления средствами контроллера, умножив его на 100, получим T(ADC)=((399-ADC)*100)/250. Полученное выражение подставляем в колонку Проверка и корректируя значения знаменателя добиваемся минимального отклонения в заданном диапазоне. В результате у меня получилось выражение T(ADC)=((399-ADC)*100)/264. Поскольку разброс сопротивления датчика составляет в среднем 4...5% то отклонение на 1...2 °С особо не влияют на общую погрешность.

Таблица 1. Пример расчёта.

 

Данные:                
Vcc,В T, ºC R, Ом Погреш. ∆U R ADC  
5 мин ном макс Проверка
Vref,В -40 340 359 379 5,6% 0,76 304  
2,56 -30 370 391 411 5,1% 0,82 327  
Rд,Ом -20 403 424 446 5,2% 0,87 350  
2000 -10 437 460 483 5,0% 0,93 374  
  0 474 498 522 4,8% 1,00 399 0
  10 514 538 563 4,6% 1,06 424 9
  20 555 581 607 4,5% 1,13 450 19
  25 577 603 629 4,3% 1,16 463 24
  30 599 626 652 4,2% 1,19 477 29
  40 645 672 700 4,2% 1,26 503 39
  50 694 722 750 3,9% 1,33 530 50
  60 744 773 801 3,6% 1,39 558 60
  70 797 826 855 3,5% 1,46 585 70
  80 852 882 912 3,4% 1,53 612 81
  90 910 940 970 3,2% 1,60 639 91
  100 970 1000 1030 3,0% 1,67 667 101
  110 1029 1062 1096 3,2% 1,73 694 112
  120 1089 1127 1164 3,3% 1,80 721 122
  130 1152 1194 1235 3,4% 1,87 748 132
  140 1216 1262 1309 3,7% 1,93 774 142
  150 1282 1334 1385 3,8% 2,00 800 152
  160 1350 1407 1463 4,0% 2,06 826 162
  170 1420 1482 1544 4,2% 2,13 851 171
  180 1492 1560 1628 4,4% 2,19 876 181
  190 1566 1640 1714 4,5% 2,25 901 190
  200 1641 1722 1803 4,7% 2,31 925 199
  210 1719 1807 1894 4,8% 2,37 949  
  220 1798 1893 1988 5,0% 2,43 973  
  230 1879 1982 2085 5,2% 2,49 995  
  240 1962 2073 2184 5,4% 2,54 1018  
  250 2046 2166 2286 5,5% 2,60 1040  
  260 2132 2261 2390 5,7% 2,65 1061  
  270 2219 2357 2496 5,9% 2,70 1082  
  280 2304 2452 2600 6,0% 2,75 1102  
  290 2384 2542 2700 6,2% 2,80 1119  
  300 2456 2624 2791 6,4% 2,84 1135  

 

График ADC(T °C)
Рисунок 3. График ADC(T °C)

Ну вот с теорией покончено приступаем к написанию прошивки.
Код основной программы:

// МК : M8
// Внутренний RC: 1.0000Mhz
#include <iom8.h>
#include <macros.h>

#define SetBit(x,y) (x|=y)
#define ClrBit(x,y) (x&=~y)
#define TestBit(x,y) (x&y)

unsigned int ACP,temp;
unsigned char PC=0,PB=0,PD=0,i;

void port_init(void){

PORTB = 0xFF;
DDRB = 0xFF;
PORTC = 0xFF;
DDRC = 0xFF;
DDRD = 0xFF;
PORTD = 0xFF;

}

//ADC инициализация

void adc_init(void){

ADCSR = 0x00; // Отключаем АЦП
ADMUX = 0b11000111; // Внутренний ИОН, AD7 (только для TQFP)
ACSR = 0b10000000; //Отключаем компаратор
ADCSR = 0b11101011; //Вкл АЦП,режим непрерывного преобразования,время преобразования: 104uS

}

#pragma interrupt_handler adc_isr:15
void adc_isr(void){

ACP=ADCL; //Чтение млядшиго байта преобразования
ACP|=(int)ADCH << 8; //Чтение страршего байта преобразования

if(ACP<399)ACP=399; // Ограничение нижнего предела 0 град
if(ACP>924) ACP=925; // Ограничение верхнего предела 199 град

i=((ACP-399)*100)/264; // Вычисление температуры

PORTC^=PC;
PORTB^=PB;
PORTD^=PD;

temp++;
if(temp==1000){

temp=0;
LED_putc(i);

}
asm("sleep");

}

void init_devices(void){

CLI();
port_init();
adc_init();
MCUCR = 0b1001000; // Устанавливаем и разрешаем спящий режим ADC
//MCUCR =0;
GICR = 0x00;
TIMSK = 0x00;
SEI();

}

void LED_putc(unsigned char ch){
unsigned int sot,des,ed;

sot=ch/100;
des=(ch-sot*100)/10;
ed=ch-sot*100-des*10;

PORTC=0xFF;
PORTB=0xFF;
PORTD=0xFF;

PC=0;
PB=0;
PD=0;

if(sot) SetBit(PC,0b00100000);

switch(des){

case 0:

if(ch<10)break;
SetBit(PC,0b00011111);
SetBit(PB,0b00000100);
break;

case 1:

SetBit(PC,0b00001010);
break;

case 2:

SetBit(PC,0b00010110);
SetBit(PB,0b00000110);
break;

case 3:

SetBit(PC,0b00011010);
SetBit(PB,0b00000110);
break;

case 4:

SetBit(PC,0b00001011);
SetBit(PB,0b00000010);
break;

case 5:

SetBit(PC,0b00011001);
SetBit(PB,0b00000110);
break;

case 6:

SetBit(PC,0b00011101);
SetBit(PB,0b00000110);
break;

case 7:

SetBit(PC,0b00001010);
SetBit(PB,0b00000100);
break;

case 8:

SetBit(PC,0b00011111);
SetBit(PB,0b00000110);
break;

case 9:

SetBit(PC,0b00011011);
SetBit(PB,0b00000110);
break;

}

switch(ed){

case 0:

SetBit(PD,0b00011111);
SetBit(PB,0b01000000);
break;

case 1:

SetBit(PD,0b00001100);
break;

case 2:

SetBit(PD,0b00001011);
SetBit(PB,0b11000000);
break;

case 3:

SetBit(PD,0b00001101);
SetBit(PB,0b11000000);
break;

case 4:

SetBit(PD,0b00011100);
SetBit(PB,0b10000000);
break;

case 5:

SetBit(PD,0b00010101);
SetBit(PB,0b11000000);
break;

case 6:

SetBit(PD,0b00010111);
SetBit(PB,0b11000000);
break;

case 7:

SetBit(PD,0b00001100);
SetBit(PB,0b01000000);
break;

case 8:

SetBit(PD,0b00011111);
SetBit(PB,0b11000000);
break;

case 9:

SetBit(PD,0b00011101);
SetBit(PB,0b11000000);
break;

}

PORTC^=PC;
PORTB^=PB;
PORTD^=PD;

}

int main(void){

init_devices();
while(1);
return 0;

}

Cтроки, выделенные красным цветом, специфичны для компилятора ICC for AVR, при использовании другого компилятора необходимо подключать соответствующие файлы согласно документации.

Для повышения качества преобразования используется спящий режим ADC. Подробнее о конфигурации спящих режимов и их типов я писал тут. Для ограничения тока через индикатор в каждом цикле преобразования мы инвертируем активные выводы порта значения которых хранятся в соответствующих переменных PC, PB, PD.

Изначально микроконтроллер уже сконфигурирован на работу от внутреннего RC генератора, частота 1 МГц. На всякий случай привожу значения конфигурационных ячеек для работы внутреннего RC (FUSE bits) CKEL3...0 0001.

Паяльником нагревал датчик до 150 °С, пробовал зажигалкой до 199 °С датчик остался жив устройство работает без замечаний.

Демонстрация работы термометра
Термометр в работе

 

Демонстрация работы термометра
Спичка жжот :-)

Общий потребляемый устройством ток порядка 33мА, при питании от 12В наблюдается слабый нагрев стабилизатора LP2950, несмотря на то что входное напряжение стабилизатора до 30В если требуется запитать напряжением выше 12В то желательно поставить ограничивающий резистор из учёта R=(Uвх-10)/0,033 или заменить стабилизатор на более мощный например LM7805. Применение МК с индексом L позволяет снизить напряжение питания до 2,7В однако при этом придётся снизить сопротивление резистора R2, микросхему LP2950 тогда можно исключить. На этом вроде всё, вопросы как обычно в форум.

Вид на монтаж
Вид на монтаж
 

Из файлового архива вы можете скачать все необходимые файлы.


Добавить в любимые (2) | Просмотров: 41174

  Коментарии (1)
 1 Написал(а) ARV, в 19:18 18.07.2008
Прокомментирую проект. 
1. По мнению автора, наиболее ценное в этом проекте - способ преобразования сопротивления в температуру, названный аппроксимацией. Я согласен с этим утверждением - это полезно. 
2. Автор применил индикатор от старого системного блока компьютера - безымянный. Вроде бы он имеет общие аноды... Распиновку выводов автор уже не помнит, так что желающие могут "расковырять ее" по исходному тексту 
3. В программе применен для вывода чисел на индикатор далеко не лучший способ. 
 
Все прочие комментарии и обсуждения настоятельно рекомендую вести [URL=http://arv.radioliga.com/index.php?option=com_joomlaboard&Itemid=30&func=view&id=1182&catid=16]на форуме[/URL]!

Только зарегистрированные пользователи могут оставлять коментарии.
Пожалуйста зарегистрируйтесь или войдите в ваш аккаунт.

 
« Пред.   След. »
Полезные материалы по сходным темам
BannerFans.com