You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
3.8 KiB
147 lines
3.8 KiB
#include "MAX31855.h" |
|
|
|
#if defined (__AVR_ATmega640__) \ |
|
|| defined (__AVR_ATmega1280__) \ |
|
|| defined (__AVR_ATmega1281__) \ |
|
|| defined (__AVR_ATmega2560__) \ |
|
|| defined (__AVR_ATmega2561__) |
|
|
|
// Arduino Mega |
|
#define DATAIN 50//MISO |
|
#define DATAOUT 51//MOSI |
|
#define SPICLOCK 52//sck |
|
#define SS 53 |
|
|
|
#elif defined (__AVR_ATmega168__) \ |
|
|| defined (__AVR_ATmega168P__) \ |
|
|| defined (__AVR_ATmega88P__) \ |
|
|| defined (__AVR_ATmega88__) \ |
|
|| defined (__AVR_ATmega48P__) \ |
|
|| defined (__AVR_ATmega48__) \ |
|
|| defined (__AVR_ATmega328P__) |
|
|
|
#define DATAIN 12//MISO |
|
#define DATAOUT 11//MOSI |
|
#define SPICLOCK 13//sck |
|
#define SS 10 |
|
|
|
#endif |
|
|
|
byte clr; |
|
|
|
MAX31855::MAX31855(uint8_t csPin, uint32_t updateIntervalMs){ |
|
this->status.csPin = csPin; |
|
|
|
this->status.stat = 0; |
|
this->status.temperature = 0.0; |
|
|
|
|
|
this->updateIntervalMs = updateIntervalMs; |
|
this->lastUpdate = 0; |
|
|
|
for(uint8_t i = 0; i< NUMTCAVGSAMPLES; i++){ |
|
readings[i] = 0; |
|
} |
|
counter = 0; |
|
} |
|
|
|
void MAX31855::setup(){ |
|
if(!setupDone){ |
|
setupDone = true; |
|
pinMode(DATAOUT, OUTPUT); |
|
pinMode(SPICLOCK,OUTPUT); |
|
pinMode(DATAIN, INPUT); |
|
//pinMode(10,OUTPUT); |
|
digitalWrite(SS,HIGH); // set the pull up on the SS pin (SPI doesn't work otherwise!!) |
|
|
|
clr = 0; |
|
//The SPI control register (SPCR) has 8 bits, each of which control a particular SPI setting. |
|
|
|
// SPCR |
|
// | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |0000000000000000000 |
|
// | SPIE | SPE | DORD | MSTR | CPOL | CPHA | SPR1 | SPR0 | |
|
|
|
// SPIE - Enables the SPI interrupt when 1 |
|
// SPE - Enables the SPI when 1 |
|
// DORD - Sends data least Significant Bit First when 1, most Significant Bit first when 0 |
|
// MSTR - Sets the Arduino in master mode when 1, slave mode when 0 |
|
// CPOL - Sets the data clock to be idle when high if set to 1, idle when low if set to 0 |
|
// CPHA - Samples data on the falling edge of the data clock when 1, rising edge when 0' |
|
// SPR1 and SPR0 - Sets the SPI speed, 00 is fastest (4MHz) 11 is slowest (250KHz) |
|
|
|
SPCR = (1<<SPE)|(1<<MSTR)|(1<<CPHA);// SPI enable bit set, master, data valid on falling edge of clock |
|
|
|
clr=SPSR; |
|
clr=SPDR; |
|
//Serial.println("setup done"); |
|
} |
|
pinMode(status.csPin, OUTPUT); |
|
digitalWrite(status.csPin, HIGH); |
|
|
|
// take one reading and fill the array |
|
readThermocouple(&status); |
|
|
|
for(uint8_t i = 0; i< NUMTCAVGSAMPLES; i++){ |
|
readings[i] = status.temperature; |
|
} |
|
} |
|
|
|
char MAX31855::spi_transfer(volatile char data) |
|
{ |
|
SPDR = data; // Start the transmission |
|
while (!(SPSR & (1 << SPIF))) // Wait the end of the transmission |
|
{ |
|
}; |
|
return SPDR; // return the received byte |
|
} |
|
|
|
void MAX31855::readThermocouple(struct max31855Status* input) { |
|
digitalWrite(input->csPin, LOW); |
|
|
|
uint32_t result = 0x0000; |
|
byte reply = 0; |
|
|
|
char data = 0; // dummy data to write |
|
|
|
for (int i = 0; i < 4; i++) { // read the 32 data bits from the MAX31855 |
|
reply = spi_transfer(data); |
|
result = result << 8; |
|
result |= reply; |
|
} |
|
//Serial.print("Read result is: "); |
|
//Serial.print(result, BIN); |
|
|
|
result >>= 18; |
|
|
|
uint16_t value = 0xFFF & result; // mask off the sign bit and shit to the correct alignment for the temp data |
|
|
|
input->stat = reply & B111; |
|
|
|
input->temperature = value * 0.25; |
|
|
|
digitalWrite(input->csPin, HIGH); |
|
|
|
} |
|
|
|
void MAX31855::update(){ |
|
if(millis() - lastUpdate >= updateIntervalMs){ |
|
lastUpdate = millis(); |
|
|
|
readThermocouple(&status); |
|
|
|
//remove this after testing! haha |
|
//status.temperature = random(25, 30); |
|
//status.stat = 0; |
|
|
|
readings[counter] = status.temperature; |
|
counter++; |
|
if(counter>=NUMTCAVGSAMPLES){ |
|
counter = 0; |
|
} |
|
double total = 0; |
|
for(uint8_t i = 0; i< NUMTCAVGSAMPLES; i++){ |
|
total += readings[i]; |
|
} |
|
temperature = total / NUMTCAVGSAMPLES; |
|
} |
|
}
|
|
|