MBED + MAX6675

Сегодня разберемся с подключением модуля термопары MAX6675 к отладочной плате NUCLEO F410RB. Напрямую термопару к микроконтроллеру подключить не получится, так как ЭДС термопары слишком мала, чтобы микроконтроллер адекватно реагировал на неё. Поэтому будем использовать микросхему MAX6675. Она определяет температуру с помощью термопары K-типа и передает её по SPI шине на микроконтроллер.

MAX6675 – конвертер для подключения термопары к микроконтроллеру.

Работает по шине SPI. Имеет 7 выводов:

  • GND – минус питания
  • VCC – плюс питания
  • SCK – синхросигнал
  • CS – выбор чипа (chip select). Нужен для подключения нескольких устройств на одну шину SPI
  • SO – вывод данных на микроконтроллер
  • Клеммы (+ -) – для подключения термопары

Подключать будем к интерфейсу SPI1

  • PA_5 к SCK
  • PA_6 к SO
  • PA_8 к CS

Разберемся немного с протоколом передачи данных. Для начала передачи данных нам необходимо подать низкий уровень сигнала на вывод CS. Следом необходимо подать 16 импульсов на вход синхронизации SCK. При этом на выводе SO микросхема выдаст нам два байта информации, из которых нам нужно выбрать 12 бит, содержащих температуру.

Из этих двух байт нас интересуют с 3 по 14 биты. Они содержат информацию о температуре. Второй бит содержит информацию о том подключена ли термопара к устройству.

Исходный код программы

Программа считывает данные с термопары и выводит их в COM порт. (исходный код на mbed)

#include "mbed.h"
#include "max6675.h"

SPI spi(PA_7, PA_6, PA_5); // MOSI, MISO, SCLK
max6675 max(spi,PA_8);

int main() {
    float temp;
    while (1) {
      
        temp = max.read_temp();
        printf("\n\r Температура: %f",temp );
       
        wait(.25);
    }
}

#ifndef MAX6675_h
#define MAX6675_h

#include "mbed.h"

class max6675
{
    SPI& spi;
    DigitalOut ncs;// pin CS для выбора чипа
  public:
  
    max6675(SPI& _spi, PinName _ncs); 
    void select(); //захват линии SPI для данного чипа
    void deselect();// освобождение SPI
    
    float read_temp(); //чтение температуры
  private:
    PinName _CS_pin;
    PinName _SO_pin;
    PinName _SCK_pin;
};

#endif
#include <mbed.h>
#include "max6675.h"

max6675::max6675(SPI& _spi, PinName _ncs) : spi(_spi), ncs(_ncs) {

}

float max6675::read_temp() {
    short value = 0;
    float temp = 0;
    
    uint8_t highByte=0;
    uint8_t lowByte=0;
    
    select();  //выбор чипа устанавливает CS в 0
    wait(.25); //Эта задержка нужна для обновления данных о температуре

    highByte = spi.write(0); // отправляем два пустых
    lowByte = spi.write(0);  // байта, при этом одновременно получаем два байта с данными 
    deselect(); //устанавливаем CS в 1 (освобождаем SPI интерфейс) после того как считали температуру.


    if (lowByte & (1<<2)) {  // проверяем третий бит, если равен 1, то термопара отключена
        return -1;
    } else {
        value = (highByte << 5 | lowByte>>3); // выделим из полученных данных инф. о температуре (с 3 по 14 бит)
    }

    temp = (value*0.25); // умножаем значение на чтобы получить ˚C или
                         //  * (9.0/5.0)) + 32.0;   // чтобы получить ˚F 

return temp;
}

void max6675::select() {
    ncs = 0;
}

void max6675::deselect() {
    ncs = 1;
}

Результат работы программы

Для просмотра результата воспользуемся монитором COM порта, встроенного в Arduino IDE. Можно использовать любую другую удобную программу.

У этой записи 2 комментариев

Добавить комментарий

Закрыть меню