Найти тему
electricalcircuitmk

Подключаем термопары к микроконтроллеру с помощью MAX6675 и MAX31855KASA+.

Микросхемы MAX6675 и MAX31855KASA+ предназначены для получения температуры с термопар K типа. Микросхемы подключаются к мк при помощи SPI интерфейса по трем проводам (только чтение). Подробно все характеристика данных микросхем можно найти в даташитах, здесь же мы рассмотрим непосредственно получение температуры.

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

Для примера возьмем один из самых простых и распространенных микроконтроллеров - PIC16F628A. Для начала определяем пины для подключения микросхем:

#define CLK RB5
#define Din RB3
#define CS RB4

Далее инициализируем микроконтроллер:

void INIT_MK (void)
{
TRISA = 0b00000000; // направление работы ножек порта А
TRISB = 0b00001000; // направление работы ножек порта В
CMCON = 0x07; // отключение компараторов
PORTA = 0b00000000; // очищаем порт А
PORTB = 0b00000000; // очищаем порт Б
RBPU = 1; // подтягивающие R (0-вкл, 1-выкл)
INTCON = 0x00;// настраиваем регистр контроля прерываний
CLK = 0;
CS = 1;
}

Смотрим как выглядит посылка данных на осциллограмме из даташита:

-2

Теперь непосредственно пишем функцию которая будет считывать данные:

unsigned char ReadSPI (void)//функция чтения SPI
{
unsigned char data = 0;//переменная для данных
unsigned char count = 0;//счетчик бит
for(count = 0;count < 8;count++)//цикл для приема данных
{
data = data << 1;//сдвигаем на один разряд для принимаемого бита

data = data + Din;//читаем данные с пина
CLK = 1;
__delay_us(40);
CLK = 0;
__delay_us(40);}
return data;
}

Данные хранятся в двух регистрах, по биту номер 2 можно определять подключена ли термопара к микросхеме или нет:

-3

Теперь считываем оба регистра с данными и конвертируем в градусы Цельсия:

CS = 0;
a = ReadSPI();
b = ReadSPI();
CS = 1;//прочитали оба регистра

temp = a;temp = temp << 8;
temp = temp + b;
temp = temp >> 3;//объединили в одну переменную

if(b & 0x04)termocouple_state_1 = 0;
else termocouple_state_1 = 1;//определяем наличие термопары 1 есть, 0 нет

printf("\ra %d",a);//старший байт
printf("\rb %d",b);//младший байт
printf("\rtermocouple_state %d",termocouple_state_1);
printf("\rtemp %d",temp*25/100);//конвертируем в градусы Цельсия

__delay_ms(1000);//часто опрашивать max6675 нельзя, для стабильной работы не чаще чем каждые 250мс

Данные с датчика выводим в USART модуль, библиотека по работе с которым включена в прилагаемый исходник.

Далее разберем MAX31855KASA+. Функцию для чтения используем туже, что и для MAX6675. Отличие заключается в том, что ногу T- не нужно сажать на GND, а так же в регистрах чтения:

-4

По биту D0 можно определить подключена ли термопара или нет, по биту D1 замыкание датчика на землю и по биту D2 замыкание датчика на шину питания. Биты с 4 по 14, это внутренняя температура MAX31855KASA+. Бит D16 становится в 1, когда есть активные ошибки SCV, SCG или OC. Далее с D18 по D30 непосредственно значение полученное с термопары. Данные из регистров термопар обсчитывать не нужно, нужно тупо собрать в одну переменную для получения температуры в градусах Цельсий. Далее код:

CS = 0;
a = ReadSPI();
b = ReadSPI();
c = ReadSPI();
d = ReadSPI();
CS = 1; //читаем четыре регистра

temp = a;temp = temp << 8;
temp = temp + b;
temp = temp >> 4;// склеиваем две переменные в одну для получения температуры с термопары.

Флаги событий SCV, SCG или OC обрабатываются так же как и в случае с MAX6675.

Код проверять в железе, в Протеусе термопара работает криво, исходные файлы: https://yadi.sk/d/dBVGUK6ElmetOg

Мои другие публикации: https://electricalcircuitmk.wordpress.com/