101 lines
2.7 KiB
C
101 lines
2.7 KiB
C
/*
|
|
* Copyright (c) 2022 HAW Hamburg FTZ-DIWIP
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
#ifndef _MAX31865_H
|
|
#define _MAX31865_H
|
|
|
|
#define DT_DRV_COMPAT maxim_max31865
|
|
|
|
#include <math.h>
|
|
|
|
#include <zephyr/drivers/sensor.h>
|
|
#include <zephyr/drivers/sensor/max31865.h>
|
|
#include <zephyr/drivers/spi.h>
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/logging/log.h>
|
|
#include <zephyr/sys/util_macro.h>
|
|
#include <zephyr/sys/byteorder.h>
|
|
LOG_MODULE_REGISTER(MAX31865, CONFIG_SENSOR_LOG_LEVEL);
|
|
|
|
#define MAX31865_FAULT_HIGH_THRESHOLD BIT(7)
|
|
#define MAX31865_FAULT_LOW_THRESHOLD BIT(6)
|
|
#define MAX31865_FAULT_REFIN BIT(5)
|
|
#define MAX31865_FAULT_REFIN_FORCE BIT(4)
|
|
#define MAX31865_FAULT_RTDIN_FORCE BIT(3)
|
|
#define MAX31865_FAULT_VOLTAGE BIT(2)
|
|
|
|
#define MAX31865_FAULT_DETECTION_NONE (0x00 << 2)
|
|
#define MAX31865_FAULT_DETECTION_AUTO (0x01 << 2)
|
|
#define MAX31865_FAULT_DETECTION_MANUAL_1 (0x02 << 2)
|
|
#define MAX31865_FAULT_DETECTION_MANUAL_2 (0x03 << 2)
|
|
|
|
/* Read Register Address */
|
|
#define REG_CONFIG 0x00
|
|
#define REG_RTD_MSB 0x01
|
|
#define REG_RTD_LSB 0x02
|
|
#define REG_HIGH_FAULT_THR_MSB 0x03
|
|
#define REG_HIGH_FAULT_THR_LSB 0x04
|
|
#define REG_LOW_FAULT_THR_MSB 0x05
|
|
#define REG_LOW_FAULT_THR_LSB 0x06
|
|
#define REG_FAULT_STATUS 0x07
|
|
#define WR(reg) ((reg) | 0x80)
|
|
|
|
/* Bitmask to clear fault status bits D5, D3, and D2 */
|
|
#define FAULT_BITS_CLEAR_MASK 0x2C
|
|
|
|
/**
|
|
* RTD data, RTD current, and measurement reference
|
|
* voltage. The ITS-90 standard is used; other RTDs
|
|
* may have coefficients defined by the DIN 43760 or
|
|
* the U.S. Industrial (American) standard.
|
|
*/
|
|
|
|
#define RTD_A_ITS90 3.9080e-3
|
|
#define RTD_A_USINDUSTRIAL 3.9692e-3
|
|
#define RTD_A_DIN43760 3.9848e-3
|
|
#define RTD_B_ITS90 -5.870e-7
|
|
#define RTD_B_USINDUSTRIAL -5.8495e-7
|
|
#define RTD_B_DIN43760 -5.8019e-7
|
|
|
|
/**
|
|
* RTD coefficient C is required only for temperatures
|
|
* below 0 deg. C. The selected RTD coefficient set
|
|
* is specified below.
|
|
*/
|
|
#define RTD_A (RTD_A_ITS90)
|
|
#define RTD_B (RTD_B_ITS90)
|
|
|
|
/*
|
|
* For under zero, taken from
|
|
* https://www.analog.com/media/en/technical-documentation/application-notes/AN709_0.pdf
|
|
*/
|
|
static const float A[6] = {-242.02, 2.2228, 2.5859e-3, 4.8260e-6, 2.8183e-8, 1.5243e-10};
|
|
|
|
struct max31865_data {
|
|
double temperature;
|
|
uint8_t config_control_bits;
|
|
};
|
|
|
|
/**
|
|
* Configuration struct to the MAX31865.
|
|
*/
|
|
struct max31865_config {
|
|
const struct spi_dt_spec spi;
|
|
uint16_t resistance_at_zero;
|
|
uint16_t resistance_reference;
|
|
bool conversion_mode;
|
|
bool one_shot;
|
|
bool three_wire;
|
|
uint8_t fault_cycle;
|
|
bool filter_50hz;
|
|
uint16_t low_threshold;
|
|
uint16_t high_threshold;
|
|
};
|
|
|
|
/* Bit manipulation macros */
|
|
#define TESTBIT(data, pos) ((0u == (data & BIT(pos))) ? 0u : 1u)
|
|
|
|
#endif
|