-
Notifications
You must be signed in to change notification settings - Fork 17.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
7 changed files
with
131 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
71 changes: 71 additions & 0 deletions
71
libraries/AP_TemperatureSensor/AP_TemperatureSensor_MLX90614.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
#include "AP_TemperatureSensor_MLX90614.h" | ||
|
||
#if AP_TEMPERATURE_SENSOR_MLX90614_ENABLED | ||
|
||
#include <utility> | ||
#include <stdio.h> | ||
#include <AP_HAL/AP_HAL.h> | ||
#include <AP_HAL/I2CDevice.h> | ||
#include <AP_Math/AP_Math.h> | ||
|
||
|
||
extern const AP_HAL::HAL &hal; | ||
|
||
|
||
void AP_TemperatureSensor_MLX90614::init() | ||
{ | ||
|
||
if ((_params.bus_address != MLX90614_I2CDEFAULTADDR) ) { | ||
_params.bus_address.set(MLX90614_I2CDEFAULTADDR); | ||
} | ||
|
||
_dev = std::move(hal.i2c_mgr->get_device(_params.bus, _params.bus_address)); | ||
if (!_dev) { | ||
printf("MLX90614: Device is not ready\n"); | ||
return; | ||
|
||
} | ||
|
||
|
||
WITH_SEMAPHORE(_dev->get_semaphore()); | ||
|
||
_dev->register_periodic_callback(50 * AP_USEC_PER_MSEC, | ||
FUNCTOR_BIND_MEMBER(&AP_TemperatureSensor_MLX90614::_timer, void)); | ||
|
||
printf("MLX90614: Device is ready\n"); | ||
} | ||
|
||
|
||
void AP_TemperatureSensor_MLX90614::_timer() | ||
{ | ||
|
||
_crude_value = read_data(MLX90614_TA); | ||
|
||
if(_crude_value > 0) | ||
{ | ||
|
||
WITH_SEMAPHORE(_dev->get_semaphore()); | ||
|
||
// temp * 0.02 - 273.15 = degrees, temp * 0.02 is temperature in kelvin | ||
const float tmp = _crude_value * 0.02 - 273.15; | ||
set_temperature(tmp); | ||
} | ||
|
||
|
||
} | ||
|
||
|
||
|
||
uint16_t AP_TemperatureSensor_MLX90614::read_data(uint8_t cmd) { | ||
uint8_t val[3]; | ||
|
||
if (!_dev->transfer(&cmd, 1, val, 3)) | ||
{ | ||
return 0; | ||
} | ||
hal.scheduler->delay_microseconds(MLX90614_XDLY); | ||
|
||
return UINT16_VALUE(val[1],val[0]); | ||
} | ||
#endif // AP_TEMPERATURE_SENSOR_MLX90614_ENABLED | ||
|
44 changes: 44 additions & 0 deletions
44
libraries/AP_TemperatureSensor/AP_TemperatureSensor_MLX90614.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
#pragma once | ||
#include "AP_TemperatureSensor_Backend.h" | ||
|
||
#if AP_TEMPERATURE_SENSOR_MLX90614_ENABLED | ||
|
||
#define MLX90614_I2CDEFAULTADDR 0x5A // Device default slave address | ||
#define MLX90614_BROADCASTADDR 0 // Device broadcast slave address | ||
#define MLX90614_CRC8POLY 7 // CRC polynomial = X8+X2+X1+1 | ||
#define MLX90614_XDLY 25 // Experimentally determined delay to prevent read | ||
|
||
// RAM addresses | ||
#define MLX90614_RAWIR1 0x04 // RAM reg - Raw temperature, source #1 | ||
#define MLX90614_RAWIR2 0x05 // RAM reg - Raw temperature, source #2 | ||
#define MLX90614_TA 0x06 // RAM reg - Linearized temperature, ambient | ||
#define MLX90614_TOBJ1 0x07 // RAM reg - Linearized temperature, source #1 | ||
#define MLX90614_TOBJ2 0x08 // RAM reg - Linearized temperature, source #2 | ||
|
||
|
||
class AP_TemperatureSensor_MLX90614 : public AP_TemperatureSensor_Backend { | ||
using AP_TemperatureSensor_Backend::AP_TemperatureSensor_Backend; | ||
|
||
public: | ||
void init(void) override; | ||
|
||
void update() override {}; | ||
|
||
|
||
private: | ||
|
||
// Hold return value in _timer | ||
uint16_t _crude_value; | ||
|
||
// update the temperature, called at 20Hz | ||
void _timer(void); | ||
|
||
uint16_t read_data(uint8_t cmd); | ||
|
||
|
||
uint16_t read_eeprom(uint8_t address) {return read_data(address | 0x20);}; | ||
|
||
}; | ||
|
||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters