Главная » Статьи » Proton PICBasic

Измерение температуры с помощью аналогового датчика

Когда-то мне заказали разработать одно устройство, в функции которого входило измерение температуры по трем каналам. Поскольку планировалось серийное производство, то вопрос цены комплектующих был не на последнем месте. Пришлось продумывать варианты и искать альтернативы. В результате логических умозаключений по ряду объективных причин было принято решение использовать аналоговые датчики. Выбор пал на TC1047A, цена которых в то время в 2-2,5 раза была ниже, чем у всем известных DS18B20 (данные брались из расчета при покупке от 10 шт)

Цена датчиков температуры (на тот момент)
DS18B20 - от 38 рублей TC1047 - от 16 рублей

Датчик TC1047 отличается от датчика TC1047A тем, что последний работает от напряжения 5В. Смотрите даташит.

К тому же, простые исследования показали простоту работы с ним. В числе причин, по которым был выбран датчик, было наличие АЦП в микроконтроллере, так как требовалось большое число портов для измерения, управления и индикации всех процессов и режимов. Микроконтроллером для прототипа прибора стал имеющийся под рукой PIC16F877, как нельзя лучше подходивший для этих целей. Ну и, естественно, любой жидкокристаллический индикатор.

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

Можно убедиться в этом, взглянув на график из документации:

Документацию на датчик вы можете скачать здесь.

Итак, с компонентами определились. Рисуем простую схему. Мы рассматриваем пример работы с датчиком, а не готовое практическое устройство, поэтому не будем забивать схему ненужной информацией.


Производитель рекомендует в приложениях с высоким уровнем шумов использовать для датчиков конденсаторы номиналом 0,1 мкФ, подключенные к сигнальному и питающему выводам(на схеме не указаны).

Рассмотрим программу:

;-------------------------- Общие настройки------------------------------------

Device = 16F877A   ' Используемый микроконтроллер

Xtal = 12   ' Частота осциллятора  12 МГц

'-------------------------- Опции компилятора --------------------------------

Declare  FSR_CONTEXT_SAVE = On   ' Заботиться о сохранении содержимого регистра FSR

Declare  Reminders = Off   ' Включить напоминания компилятора

Declare  Warnings = On    ' Включить предупреждения компилятора

Declare  Optimiser_Level 0    ' Выключить оптимизацию программы

Declare  Bootloader = OFF  ' Выключить загрузчик

'-------------------------- Конфигурация программирования --------------------

Config  CP_ON, DEBUG_OFF, WRT_OFF, CPD_ON, LVP_OFF, BODEN_OFF, PWRTE_OFF, WDT_OFF, HS_OSC

'-------------------------- Настройки АЦП ------------------------------------

Declare  Adin_Res 8   ' Разрядность результата преобразования АЦП

Declare  Adin_Tad FRC   ' Источник тактирования АЦП

Declare  Adin_Stime  100   ' Время на подготовку АЦП к новому измерению

'-------------------------- Настройки подключения ЖКИ ------------------------

Declare  LCD_Type ALPHA   ' Тип ЖКИ - буквенно -цифровой

Declare  LCD_DTPin  PORTC.0   ' Порт данных ЖКИ

Declare  LCD_ENPin  PORTC.4   ' Управление линией E

Declare  LCD_RSPin  PORTC.5   ' Управление линией RS

Declare  LCD_Interface  4   ' Разрядность шины данных

Declare  LCD_CommandUs  2000   ' Задержка перед посылкой команды

Declare  LCD_DataUs  50   ' Задержка перед посылкой данных

Declare  LCD_Lines   2   ' Количество строк ЖКИ                                                                 

Symbol TEMP1 = 0 ' Датчик температуры 1

Symbol TEMP2 = 1 ' Датчик температуры 2

Symbol TEMP3 = 2 ' Датчик температуры 3

Dim TEMP As Dword     'переменная для считывания аналогового значения температуры 

Dim TempVar As Byte '

Dim i As Byte ' Счетчик для цикла

Dim Temperature1 As Dword

Dim Temperature2 As Dword

Dim Temperature3 As Dword

'-------------------------- Начало -------------------------------------------

Clear

'-------------------------- ADCON0, ADCON1 -----------------------------------

'AN7-AN5 - цифровые порты ввода/вывода. Vref+ = AN3, Vref- = Vss. Остальные каналы - аналоговые входы

     ADCON0 = %11000000 ' Значение регистра ADCON0

     ADCON1 = %00000011 ' Значение регистра ADCON1                                                         

'Обратите внимание - в качестве источника опорного напряжения выбран вход AN3

' Если взглянуть на схему, можно увидеть, что к этому входу подключен делитель напряжения,

'который дает 2,5 вольта.

'-------------------------- Начало -------------------------------------------

'-------------------------- Главная программа -------------------------

Start:

    PORTC = %00000000

    TRISA = %001111

    TRISC = %00000000                                                                                                                     

    OPTION_REG = %00000111

    Cls

    For i = 20 To 4 Step - 1

        Print At 1,i, "Start system    "

        DelayMS 100

    Next                                                           

    DelayMS 1000

    Cls

'-------------------------Начало главной программы----------------------------------------

MainProgram:

'---------------------Обработка нажатия кнопок--------------------------------------------

     GoSub ReadRealTemp

     Print At 1,1, "T1=", SDec Temperature1," :","T2=", SDec Temperature2,"    "

     Print At 2,1,"T3=", SDec Temperature3, "     "

     DelayMS 100

GoTo  MainProgram   ' Возврат на начало основной программы

ReadRealTemp:

    TempVar = TEMP1   'Временной переменной мы присваиваем номер первого канала измерения (TEMP1 = 0канал AN0)

    GoSub ConvertTemp  ' Сделаем перерасчет

    Temperature1 = TEMP 'Возвращаемое реальное значение температуры уже со знаком, потому, что мы используем знаковую переменную 

    TempVar = TEMP2   'Канал AN1 (TEMP2 = 1)

    GoSub ConvertTemp 

    Temperature2 = TEMP'

    TempVar = TEMP3    'Канал AN2  (TEMP3 = 2)

    GoSub ConvertTemp

    Temperature3 = TEMP'

Return

ConvertTemp:

        TEMP = ADIn TempVar  ' Считываем значение напряжения по указанному каналу

        TEMP = TEMP - 50      'И вычитаем коэффициент

Return

End

А теперь внимание!

Установив в качестве источника опоры для АЦП значение 2,5 вольта мы получаем практически идеальный результат при разрешении АЦП в 8 разрядов. То есть, максимальный результат преобразования, который мы можем получить при 2,5 вольтах выходного сигнала - это 255. Но мы не получим такой результат, поскольку максимальное значение положительной температуры, которую может измерить датчик - 125 градусов, при которых уровень выходного напряжения будет равен 1,75 вольт (смотри график зависимости). Соответственно, разница между значением температуры и выходным уровнем напряжения - 500 мВ (о чем сказано на том же самом графике). Нам остается вычесть это значение. Так как мы приняли значение выходного сигнала прямо пропорциональным разрешению АЦП, то просто вычтем 50 из измеренного значения, что будет равно вычитанию 500 мВ из результата.

Если бы мы установили опорное напряжение равным 5В, тогда нам потребовался бы АЦП с разрешением в 10 разрядов и отнимать нам пришлось бы другую цифру. Какую - посчитайте сами :).

Таким образом. нам подойдет любой микроконтроллер с разрешением в 8 разрядов. Для получения наиболее точного результата опору можно подобрать не 2,5 вольта, а 2,55 вольта. Это будет самый точный результат. С помощью такого датчика запросто можно сделать навороченный терморегулятор для инкубатора или аквариума, например. А можно и регулятор температуры для холодильника собрать.

Архив с программой и файлом протеуса можно скачать здесь.

Пишем комментарии и задаем вопросы.

Похожие материалы: USB HID термометр, Терморегулятор, Прибор для измерения влажности, Работа с датчиком DS18S20, Цифровая паяльная станция, Программируемый термостат, Работа с датчиком DS18B20

 




Категория: Proton PICBasic | Добавил: ADMIN (06.11.2011)
Просмотров: 9164 | Комментарии: 8 | Теги: ds18B20, TC1047A, датчик, пример, АЦП, температура, Измерение, разрешение | Рейтинг: 5.0/3
Всего комментариев: 8
1 vanish   (06.11.2011 20:16)
Незначительная опечатка - частота кварца 12 мгц , а в комментарии 4.

2 ADMIN   (07.11.2011 01:16)
Исправим! Спасибо!

3 Matrix252005   (08.11.2011 16:32)
ADMIN, СПС за статью!!!

Сегодня, ради интереса, глянул сколько стоят у нас эти датчики!!! Цена мне понравилась, ~6 грн по отношению к ~20грн (DS18B20) !!! И на скорую руку, накидал прогу для управления "TC1047A" + МК 12F675. Экран 2х7 сегментный (статика ОК) + 2хCD4033.

Благодаря Вам, мы узнаем много нового!!! smile СПС ВАМ!!

4 ADMIN   (09.11.2011 12:28)
Минус нетрудно присобачить к двум индикаторам - использовать диод плоский. Рад, что оказался полезен. Буду стараться дальше

5 Matrix252005   (09.11.2011 12:40)
Минус нетрудно присобачить к двум индикаторам - зачем, я переписал код под 3х74НС595, а там можно спокойно выводить "минус"!!! Единственное, нельзя выводить десятичное значение температуры (по крайней мере, у меня не получилось. Но это не беда).

6 amid-   (21.11.2011 16:19)
вопрос к примеруь 13 градусов как эту 13 разделить на две переменные 1 и 3 для выдачи на 7 сегментный дисплей тоже самое со всеми цифрами (можно конешно использовать IF но это надо все значения перепесать должен же быть путь короче

7 ADMIN   (22.11.2011 17:05)
Оператор DIG тебе в помощь. Но вообще - это устаревший оператор и оставлен только для совместимости со старыми компиляторами. А вообще, здесь в каталоге статей есть статья о преобразовании форматов. Там есть выделение отдельно старшей и младшей цифры.

8 Andriy76   (04.06.2012 09:54)
При 5В сделал так :
VAR4 = ADIn 3 'Считываем с ADC3 . Который нужен
Temp = VAR4 / 204.6 ' Делаем 5В
TEMP11 = (Temp *100) - 50 'множим на 100 и отнимаем коефициент
biggrin

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]