Xmega & MAX31855 (SPI)


    Датчик температуры MAX31855 генерирует компенсацию холодного спая и оцифровывает сигнал от термопары типа K, J, N, T, S, R или E. Различные данные датчика можно легко считывать с помощью одного из модулей SPI Xmega. Датчик передает информацию в  14-битном формате через стандартный интерфейс SPI. Преобразователь имеет температурное разрешение до 0,25 ° C и позволяет проводить измерения в диапазоне температур от -270 ° C до 1800 ° C. Специально для термопар типа K датчик имеет точность ± 2 ° C в температурном диапазоне от -200 ° C до +700 ° C.
    Характеристики:
- Компенсация холодного спая
- Разрешение 14-бит, 0,25 ° C
- Версии, доступные для термопар K, J, N, T, S, R и E
- Простой SPI-совместимый интерфейс (только  чтения)
- Обнаруживает выводы термопары для GND или VCC
- Обнаруживает рабочую термопару

    В следующем примере показаны функции для считывания датчика:
#define sbi(ADDRESS,BIT) ADDRESS |= (1<<BIT)
#define cbi(ADDRESS,BIT) ADDRESS &= ~(1<<BIT)
#define toggle(ADDRESS,BIT) ADDRESS ^= (1<<BIT) 
#define bis(ADDRESS,BIT) ADDRESS & (1<<BIT)
#define bic(ADDRESS,BIT) !(ADDRESS & (1<<BIT)) 
  
//################################################## read_max31855 
int read_max31855(void) 
{  
unsigned char data[4] = {0xff, 0xff, 0xff, 0xff};  
  
// SPI SS low 
cbi(PORTD.OUT,4); 
for (int i=0; i<4; i++) 
{
data[i] = SPI_MasterTransceiveByte(&spiMasterD,0xff); 
}
 
// SPI SS high
sbi(PORTD.OUT,4); 
 
if (bis(data[3],0)) {usart_puts(&USART_data,"Open Circuit\r");return 1000;}
else if (bis(data[3],1)) {usart_puts(&USART_data,"Short to GND\r");return 1001;}
else if (bis(data[3],2)) {usart_puts(&USART_data,"Short to VCC\r");return 1002;}
 
else 
{
double tempCuple = 0;
double tempDevic = 0;
double ganz   = 0; 
double komma   = 0;
 

ganz = (((data[0] << 8) | data[1])>> 4); 
komma = ((data[1]>> 2) & 0x03)*0.25 ;
if (ganz>0) tempCuple = ganz+komma;
else tempCuple = ganz-komma;
 
ganz = data[2]; 
komma = (data[3]>> 4)*0.0625;  
if (ganz>0) tempDevic = ganz+komma;
else tempDevic = ganz-komma;
 
double vout= 0.041276*(tempCuple-tempDevic);
double kompen = tempDevic*100 
  + 2508.355*vout 
  + 7.860106*vout*vout
  - 25.03131*vout*vout*vout
  +  8.31527*vout*vout*vout*vout
  - 1.228034*vout*vout*vout*vout*vout;
// round into Integer and return value
return (int)(kompen+0.005);
}
}
    Blogger Comment
    Facebook Comment

0 коммент.:

Отправить комментарий