MCP9800/1/2/3 — высокоточный цифровой датчик температуры

Высокоточный цифровой датчик температуры MCP9800/1/2/3 компании Microchip Technology Inc выпускается в миниатюрных корпусах SOT-23-5, MSOP-8 и SOIC-8. Может работать с разрешением 9, 10, 11 и 12 бит. Имеет небольшой рабочий ток порядка  200 мкА. Работает в диапазоне температур от -55°C до +125°C. Основное назначение — измерение температуры окружающей среды.

Основные параметры датчика MCP9800/1/2/3:

  •  Точность с 12-битным разрешением:
    •  ±0,5°C (тип.) при +25°C
    • ±1°C (макс.) от -10°C до +85°C
    • ±2°C (макс.) от -10°C до +125°C
    • ±3°C (макс.) от -55°C до +125°С
  • Выбираемое пользователем разрешение: 9-12 бит
  • Диапазон рабочего напряжения: от 2,7 В до 5,5 в
  • 2-проводный интерфейс: совместимость с I2C ™ / SMBus
  • Рабочий ток: 200 мкА (тип.)
  • Ток отключения: 1 мкА (макс.)
  • Время измерения:
    • 9-bit — 30 ms 33 samples/sec (typ.)
    • 10-bit  — 60 ms 17 samples/sec (typ.)
    • 11-bit  — 120 ms 8 samples/sec (typ.)
    • 12-bit  — 240 ms 4 samples/sec (typ.)

Вывод ALERT — выход управления нагревательным элементов, сигнала тревоги. Позволяет программно задавать значения температуры регулирования по двум значениям температуры: Tset и Thyst, для верхнего и нижнего значения температуры.

 

Пока температура ниже Thyst выход ALERT неактивен, как только значение окружающей температуры превысит значение Thyst, выход ALERT станет активным, при достижении температуры значения Tset, выход ALERT снова станет неактивным, далее при уменьшении температуры ниже значения Thyst выход ALERT снова станет активным (можно инвертировать выход ALERT).

Датчики температуры MCP9800/1/2/3  имеют разные настраиваемые и назначенные на заводе изготовителе адреса. Старшие биты адреса не меняются (1001), младшие три бита можно изменить подав на выводы A2, A1, A0 напряжение питания или GND.

Управление датчиком температуры осуществляется при помощи четырех регистров:

  • 00 = Temperature Register
  • 01 = Configuration Register
  • 10 = Temperature Hysteresis Register
  • 11 = Temperature Limit-set Register

Первый регистр Temperature Register (16 бит) позволяет считывать значение измеренной температуры.

В зависимости от разрядности в младшем бите (7:0) считываются старшие биты 7:4 которые содержать дробную часть температуры (0,5 0,25 0,125 0,0625 °С).

Второй регистр Configuration Register (8 бит) который позволят настроить все параметры датчика.

Третий и четвертый регистры Temperature Hysteresis Register, Temperature Limit-set Register позволяют установить параметры Tset и Thyst. Эти регистры 16 бит, но передавать нужно только 9 бит. Разрешение температуры регулирования четно 0,5 °С.

В младшем байте в старшем бите передается четное 0,5 °С значение температуры.

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

Выход ALERT подключите ко входу D2 платы Arduino (Nano Uno), выход D13 (светодиод на плате) используется как индикатор работы выхода ALERT.

#define ADDR 0x4D
 
#include <Wire.h>
void setup(){
    Wire.begin();    
    Serial.begin(9600);
    pinMode(2,INPUT); 
    pinMode(13,OUTPUT);
} 
 
void loop(){
    Serial.println(wire9800(26.0, 27.5, 12),4);
    if(digitalRead(2)==HIGH){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}
    delay(1000);
}
 
float wire9800(float regL, float regH, byte bites){
  byte minus;
  /// TEMPERATURE LIMIT-SET REGISTER 9 BIT
  if(regH<0){minus=0b10000000;}else{minus=0b00;}
  Wire.beginTransmission(ADDR);
  Wire.write (0x02);
  Wire.write (int(regH) + minus);
  Wire.write ((int(regH*10)&0b01)<<7);
  Wire.endTransmission();
  /// TEMPERATURE HYSTERESIS REGISTER 9 BIT
  if(regL<0){minus=0b10000000;}else{minus=0b00;}
  Wire.beginTransmission(ADDR);
  Wire.write (0x03);
  Wire.write (int(regL) + minus);
  Wire.write ((int(regL*10)&0b01)<<7);
  Wire.endTransmission();
  ///  CONFIGURATION REGISTER
  Wire.beginTransmission(ADDR);
  Wire.write (0x01);
  Wire.write (0b00000000 + ((bites-9) << 5));
  Wire.endTransmission();
  ///  AMBIENT TEMPERATURE REGISTER
  Wire.beginTransmission(ADDR);
  Wire.write (0x00);
  Wire.endTransmission();
  delay(10);
  Wire.requestFrom(ADDR,2);
  while(Wire.available()<2);
  float value;
  switch(bites){
  case 9:   value = Wire.read() + float(Wire.read()>>7)*0.5;break;
  case 10:  value = Wire.read() + float(Wire.read()>>6)*0.25;break;
  case 11:  value = Wire.read() + float(Wire.read()>>5)*0.125;break;
  case 12:  value = Wire.read() + float(Wire.read()>>4)*0.0625;break;
  }
  return value;
  }

Температура считывается и задаются все остальные параметры с помощью одной функции:

wire9800(Thyst, Tset, разрядность)

Где:

  • Thyst — нижний предел значения регулируемой температуры (четное 0,5 °С)
  • Tset — верхний предел значения регулируемой температуры (четное 0,5 °С)
  • разрядность — от 9 до 12 бит (разрешение 0,5 0,25 0,125 0,0625 °С)

Форум — http://forum.rcl-radio.ru/viewtopic.php?pid=2656#p2656

Даташит — mcp9800.pdf

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

Войти с помощью: