Skyward boardcore
Loading...
Searching...
No Matches
MAX6675.cpp
Go to the documentation of this file.
1/* Copyright (c) 2021 Skyward Experimental Rocketry
2 * Author: Matteo Pignataro
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 * THE SOFTWARE.
21 */
22
23#include "MAX6675.h"
24
26
27namespace Boardcore
28{
29
30MAX6675::MAX6675(SPIBusInterface& bus, miosix::GpioPin cs, SPIBusConfig config)
31 : slave(bus, cs, config)
32{
33}
34
36{
37 SPIBusConfig spiConfig{};
39 spiConfig.mode = SPI::Mode::MODE_1;
40 return spiConfig;
41}
42
43bool MAX6675::init() { return true; }
44
45bool MAX6675::selfTest() { return true; }
46
48{
49 uint16_t sample;
50
51 {
52 SPITransaction spi{slave};
53 sample = spi.read16();
54 }
55
56 // The third bit (D2) indicates whether the thermocouple is connected or not
57 // It is high if open
58 if ((sample & 0x4) != 0)
59 {
61 LOG_ERR(logger, "Self test failed, the thermocouple is not connected");
62 return false;
63 }
64
65 return true;
66}
67
69{
70 uint16_t sample;
71
72 {
73 SPITransaction spi{slave};
74 sample = spi.read16();
75 }
76
77 TemperatureData result{};
79
80 // Extract bits 14-3
81 sample &= 0x7FF8;
82
83 // Convert the integer and decimal part separately
84 result.temperature += static_cast<float>(sample >> 3) * 0.25;
85
86 return result;
87}
88
89} // namespace Boardcore
#define LOG_ERR(logger,...)
SensorErrors lastError
Definition Sensor.h:54
bool selfTest()
Checks whether the thermocouple is connected or not.
Definition MAX6675.cpp:45
TemperatureData sampleImpl() override
Read a data sample from the sensor. In case of errors, the method should return the last available co...
Definition MAX6675.cpp:68
bool init()
Initialize the sensor.
Definition MAX6675.cpp:43
bool checkConnection()
Checks whether the thermocouple is connected or not.
Definition MAX6675.cpp:47
MAX6675(SPIBusInterface &bus, miosix::GpioPin cs, SPIBusConfig config=getDefaultSPIConfig())
Definition MAX6675.cpp:30
static SPIBusConfig getDefaultSPIConfig()
Definition MAX6675.cpp:35
Interface for low level access of a SPI bus as a master.
Provides high-level access to the SPI Bus for a single transaction.
@ MODE_1
CPOL = 1, CPHA = 0 -> Clock high when idle, sample on first edge.
uint64_t getTimestamp()
Returns the current timer value in microseconds.
This file includes all the types the logdecoder script will decode.
@ SELF_TEST_FAIL
Definition SensorData.h:44
SPI Bus configuration for a specific slave.
SPI::ClockDivider clockDivider
< Peripheral clock division