Changeset - f602474ad6c6
[Not reviewed]
default
0 4 2
Ethan Zonca (ethanzonca) - 8 years ago 2017-06-26 18:19:08
e@ethanzonca.com
Initial work on max31856 driver, etc
6 files changed with 129 insertions and 2 deletions:
0 comments (0 inline, 0 general)
inc/states.h
Show inline comments
 
@@ -27,6 +27,7 @@ typedef union
 
        int32_t setpoint_brew;
 
        int32_t setpoint_steam;
 
        uint32_t control_mode;
 
        uint32_t sensor_type;
 
        uint32_t plant_type;
 
        uint32_t hysteresis;
 
    } val;
 
@@ -42,6 +43,7 @@ enum tempunits {
 
enum state {
 
    STATE_IDLE = 0,
 
    
 
	STATE_SETSENSORTYPE,
 
    STATE_SETMODE,
 
    STATE_SETPLANTTYPE,
 
    STATE_SETHYSTERESIS,
 
@@ -89,4 +91,14 @@ enum RESET_MODE {
 
	RESET_SIZE,
 
};
 

	
 
enum SENSOR_TYPE {
 
	SENSOR_NTC = 0,
 
	SENSOR_TC_K,
 
	SENSOR_TC_E,
 
	SENSOR_TC_N,
 
	SENSOR_TC_R,
 
	SENSOR_TC_S,
 
	SENSOR_TC_T,
 
};
 

	
 
#endif
lib/max31856/max31856.c
Show inline comments
 
new file 100644
 
//
 
// MAX31856: Driver to configure and read temperature from the MAX31856 thermoouple-to-Digital IC
 
//
 

	
 
#include "max31856.h"
 
#include "states.h"
 

	
 
// Private variables
 
static float temp_latest = 0.0;
 
static float temp_avg = 0.0;
 

	
 
static SPI_HandleTypeDef* spiport;
 

	
 

	
 
// Initialize the MAX31856 driver
 
void max31856_init(SPI_HandleTypeDef* spi_port, GPIO_TypeDef* cs_port, uint32_t cs_pin, uint32_t sensor_type)
 
{
 
	// Set SPI port reference
 
	spiport = spi_port;
 

	
 
	// Configure the CS pin for output
 
	GPIO_InitTypeDef GPIO_InitStruct;
 
	GPIO_InitStruct.Pin = cs_pin;
 
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 
	GPIO_InitStruct.Pull = GPIO_NOPULL;
 
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 
	HAL_GPIO_Init(cs_port, &GPIO_InitStruct);
 

	
 
	// MAX31856
 
	// - set to continuous conversion mode
 
	// - probably no filtering, we'll do that on this side of things
 
	// - set up to read the typical open/short faults but not the high/low alarms
 

	
 
	uint8_t data[] = {0,0,0,0};
 
	HAL_SPI_Transmit(spiport, data, 1, 100);
 

	
 
	// sensor type - could we just mask bits off? maybe optimize the enum for this
 
}
 

	
 
void max31856_process(void)
 
{
 
	// Read temperature from the MAX31856 (approx 10hz optimally)
 
	uint8_t data[] = {0,0,0,0};
 
	HAL_SPI_Transmit(spiport, data, 1, 100);
 

	
 
}
 

	
 

	
 
// Return latest temperature reading (unaveraged, deg C)
 
float max31856_latest_temp(void)
 
{
 
	return temp_latest;
 
}
 

	
 
// Return average temperature reading (deg C)
 
float max31856_avg_temp(void)
 
{
 
	return temp_latest;
 
}
lib/max31856/max31856.h
Show inline comments
 
new file 100644
 
#ifndef MAX31856_H
 
#define MAX31856_H
 

	
 
#include "stm32f3xx_hal.h"
 

	
 

	
 
#endif
src/display.c
Show inline comments
 
@@ -114,7 +114,7 @@ void display_process(void)
 
                        status->state = STATE_PREHEAT;
 
                        break;
 
                    case MODE_SETUP:
 
                        status->state = STATE_SETMODE;
 
                        status->state = STATE_SETSENSORTYPE;
 
                        break;
 
                    case MODE_RESET:
 
                        status->state = STATE_RESET;
 
@@ -149,6 +149,32 @@ void display_process(void)
 

	
 

	
 

	
 
        case STATE_SETSENSORTYPE:
 
        {
 
            // Write text to OLED
 
            // [ therm :: set mode ]
 
            // [ m =          ]
 
            ssd1306_drawstring("Sensor Type", 0, 40);
 
            ssd1306_drawlogo();
 

	
 
            // change scope to global?
 
            char* sensor_lookup[] = {"NTC", "K  ", "E  ", "N  ", "R  ", "S  ", "T  "};
 
			ssd1306_drawstring(sensor_lookup[set->val.sensor_type], 1, 60);
 
            ssd1306_drawstring("Press to accept", 3, 40);
 

	
 
            // Button handler
 
            if(SW_BTN_PRESSED) {
 
                status->state = STATE_SETMODE;
 
            }
 
            else
 
            {
 
            	user_input((uint16_t*)&set->val.hysteresis);
 
            }
 
            // Event Handler
 
            // N/A
 

	
 
        } break;
 

	
 
        case STATE_SETMODE:
 
        {
 
            // Write text to OLED
src/pid.c
Show inline comments
 
@@ -20,6 +20,7 @@ void pid_init()
 
float pid_process(void)
 
{
 

	
 

	
 
//            #ifdef MAX31865_RTD_SENSOR
 
//            max31865_readtemp(spi_get(), &set, &status);
 
//			#else
src/tempsense.c
Show inline comments
 
@@ -8,13 +8,35 @@
 

	
 
void tempsense_init(void)
 
{
 
	// Maybe don't perform temp sensor setup in here, but in readtemp?
 
	// what happens if the user changes the tempsense type while running?
 
	// we need to re-init...
 

	
 

	
 
}
 

	
 
// Returns the latest reading from the configured temperature sensor
 
float tempsense_readtemp(void)
 
{
 
	// TODO: Support multiple temperature sensors
 

	
 
	switch(flash_getsettings()->val.sensor_type)
 
	{
 
		case SENSOR_TC_K:
 
		case SENSOR_TC_E:
 
		case SENSOR_TC_N:
 
		case SENSOR_TC_R:
 
		case SENSOR_TC_S:
 
		case SENSOR_TC_T:
 
		{
 
			// Read MAX31856
 
		} break;
 

	
 
		case SENSOR_NTC:
 
		{
 
			// Read analog value from internal ADC, linearize the reading, etc
 
		} break;
 

	
 
	}
 

	
 
	// either return latest reading from DMA loop (NTC, etc)
 
	// or initiate a blocking read and return it.
0 comments (0 inline, 0 general)