Browse Source

fix tmp117 some bug

master
zhaohe 2 years ago
parent
commit
9f3dea013e
  1. 7
      components/api/zi_temperature_sensor.hpp
  2. 109
      components/sensors/tmp117/tmp117.cpp
  3. 9
      components/sensors/tmp117/tmp117.hpp
  4. 36
      components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.cpp

7
components/api/zi_temperature_sensor.hpp

@ -10,8 +10,9 @@ using namespace std;
class ZITemperatureSensor {
public:
virtual ~ZITemperatureSensor() {}
virtual float getTemperature() = 0; // ÉãÊ϶È
virtual bool isOnline() = 0;
virtual bool isError() = 0;
virtual float getTemperature() = 0; // ÉãÊ϶È
virtual bool isOnline() = 0;
virtual bool isError() = 0;
virtual const char* errorInfo() = 0;
};
} // namespace iflytop

109
components/sensors/tmp117/tmp117.cpp

@ -13,7 +13,7 @@ using namespace iflytop;
return 0; \
}
#ifdef HAL_I2C_MODULE_ENABLED
#define TAG "TMP117"
TMP117::TMP117(/* args */) {}
TMP117::~TMP117() {}
@ -30,9 +30,7 @@ bool TMP117::isOnline() {
getTemperature();
return m_lastCallStatus == HAL_OK;
}
bool TMP117::isError() {
return m_lastCallStatus != HAL_OK;
}
bool TMP117::isError() { return m_lastCallStatus != HAL_OK; }
const char* TMP117::getLastCallStatusString() {
switch (m_lastCallStatus) {
@ -50,54 +48,79 @@ const char* TMP117::getLastCallStatusString() {
}
float TMP117::getTemperature() {
uint8_t buf[3];
buf[0] = TemperatureRegister;
IF_FAIL_RETURN0(HAL_I2C_Master_Transmit(m_i2c, (uint16_t)m_id, buf, 1, 10));
HAL_Delay(1);
IF_FAIL_RETURN0(HAL_I2C_Master_Receive(m_i2c, (uint16_t)m_id, buf, 2, 10));
HAL_Delay(1);
return ((((buf[0] << 8) | buf[1])) * 0.0078125);
uint16_t ret = 0;
readreg(TemperatureRegister, (uint16_t*)&ret);
return ret * 0.0078125;
}
uint16_t TMP117::getConfiguration() {
uint8_t buf[3];
buf[0] = ConfigurationRegister;
IF_FAIL_RETURN0(HAL_I2C_Master_Transmit(m_i2c, (uint16_t)m_id, buf, 1, 10));
HAL_Delay(1);
IF_FAIL_RETURN0(HAL_I2C_Master_Receive(m_i2c, (uint16_t)m_id, buf, 2, 10));
HAL_Delay(1);
return ((buf[0] << 8) | buf[1]);
}
void TMP117::setConfiguration(uint16_t value) {
static uint8_t buf[3];
buf[0] = ConfigurationRegister;
buf[1] = (value >> 8) & 0x0f;
buf[2] = value & 0x0f;
IF_FAIL_RETURN_VOID(HAL_I2C_Master_Transmit(m_i2c, (uint16_t)m_id, buf, 2, 10));
HAL_Delay(1);
uint16_t ret = 0;
readreg(ConfigurationRegister, (uint16_t*)&ret);
return ret;
}
void TMP117::setConfiguration(uint16_t value) { writereg(ConfigurationRegister, value); }
void TMP117::setTemperatureOffset(uint16_t tempoffset) { //
setTemperatureOffset((tempoffset >> 8) & 0x0f, tempoffset & 0x0f);
// setTemperatureOffset((tempoffset >> 8) & 0x0f, tempoffset & 0x0f);
writereg(Temperature_Offset, tempoffset);
}
void TMP117::setTemperatureOffset(uint8_t first, uint8_t second) {
static uint8_t buf[3];
buf[0] = Temperature_Offset;
buf[1] = first;
buf[2] = second;
IF_FAIL_RETURN_VOID(HAL_I2C_Master_Transmit(m_i2c, (uint16_t)m_id, buf, 2, 10));
HAL_Delay(1);
}
uint16_t TMP117::getTemperatureOffset() {
static uint8_t buf[3];
buf[0] = Temperature_Offset;
IF_FAIL_RETURN0(HAL_I2C_Master_Transmit(m_i2c, (uint16_t)m_id, buf, 1, 10));
uint16_t ret = 0;
readreg(Temperature_Offset, (uint16_t*)&ret);
return ret;
}
bool TMP117::writereg(uint8_t regoff, uint16_t data) {
bool suc = false;
for (int32_t i = 0; i < 3; i++) {
suc = _writereg(regoff, data);
if (suc) break;
/**
* @brief
* 305s左右I2C之后可以恢复正常
* I2C来解决这个问题
*/
ZLOGW(TAG, "writereg fail, reset i2c");
HAL_I2C_DeInit(m_i2c);
HAL_I2C_Init(m_i2c);
}
HAL_Delay(1);
IF_FAIL_RETURN0(HAL_I2C_Master_Receive(m_i2c, (uint16_t)m_id, buf, 2, 10));
return suc;
}
bool TMP117::readreg(uint8_t regoff, uint16_t* data) {
bool suc = false;
for (int32_t i = 0; i < 3; i++) {
suc = _readreg(regoff, data);
if (suc) break;
/**
* @brief
* 305s左右I2C之后可以恢复正常
* I2C来解决这个问题
*/
HAL_I2C_DeInit(m_i2c);
HAL_I2C_Init(m_i2c);
}
HAL_Delay(1);
return ((buf[0] << 8) | buf[1]);
return suc;
}
bool TMP117::_writereg(uint8_t regoff, uint16_t data) {
uint8_t buf[3] = {0};
buf[0] = regoff;
buf[1] = (data >> 8) & 0x0f;
buf[2] = data & 0x0f;
m_lastCallStatus = HAL_I2C_Master_Transmit(m_i2c, (uint16_t)m_id, buf, 3, 10);
if (m_lastCallStatus != HAL_OK) return false;
return true;
}
bool TMP117::_readreg(uint8_t regoff, uint16_t* data) {
uint8_t buf[3] = {0};
buf[0] = regoff;
m_lastCallStatus = HAL_I2C_Master_Transmit(m_i2c, (uint16_t)m_id, buf, 1, 10);
if (m_lastCallStatus != HAL_OK) return false;
m_lastCallStatus = HAL_I2C_Master_Receive(m_i2c, (uint16_t)m_id, &buf[1], 2, 10);
if (m_lastCallStatus != HAL_OK) return false;
// return ((buf[1] << 8) | buf[2]);
*data = ((buf[1] << 8) | buf[2]);
return true;
}
#endif

9
components/sensors/tmp117/tmp117.hpp

@ -74,8 +74,9 @@ class TMP117 : public ZITemperatureSensor {
* @brief
*
*/
virtual bool isOnline() override;
virtual bool isError() override;
virtual bool isOnline() override;
virtual bool isError() override;
virtual const char* errorInfo() override { return getLastCallStatusString(); }
/**
* @brief
@ -100,6 +101,10 @@ class TMP117 : public ZITemperatureSensor {
uint16_t getIdRegister();
private:
bool writereg(uint8_t regoff, uint16_t data);
bool readreg(uint8_t regoff, uint16_t* data);
bool _writereg(uint8_t regoff, uint16_t data);
bool _readreg(uint8_t regoff, uint16_t* data);
};
} // namespace iflytop

36
components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.cpp

@ -5,7 +5,7 @@
using namespace iflytop;
#define TAG "WaterCoolingTemperatureControlModule"
#define TAG "WCTCM"
#define ACTION_TEST_PELTIER_SET_POWER_LEVEL 1
#define ACTION_TEST_PUMP_SET_LEVEL 2
@ -71,10 +71,10 @@ int32_t WaterCoolingTemperatureControlModule::module_xxx_reg(int32_t param_id, b
PROCESS_REG(kreg_pid_nowoutput, REG_GET(m_pidmodule.get_output()), ACTION_NONE);
PROCESS_REG(kreg_pid_feedbackval, REG_GET(read_pid_temperature()), ACTION_NONE);
PROCESS_REG(kreg_sensor_temperature0, REG_GET(getTemperatureSensorVal(0)), ACTION_NONE);
PROCESS_REG(kreg_sensor_temperature1, REG_GET(getTemperatureSensorVal(1)), ACTION_NONE);
PROCESS_REG(kreg_sensor_temperature2, REG_GET(getTemperatureSensorVal(2)), ACTION_NONE);
PROCESS_REG(kreg_sensor_temperature3, REG_GET(getTemperatureSensorVal(3)), ACTION_NONE);
PROCESS_REG(kreg_sensor_temperature0, REG_GET(getTemperatureSensorVal(0) * 100), ACTION_NONE);
PROCESS_REG(kreg_sensor_temperature1, REG_GET(getTemperatureSensorVal(1) * 100), ACTION_NONE);
PROCESS_REG(kreg_sensor_temperature2, REG_GET(getTemperatureSensorVal(2) * 100), ACTION_NONE);
PROCESS_REG(kreg_sensor_temperature3, REG_GET(getTemperatureSensorVal(3) * 100), ACTION_NONE);
default:
return err::kmodule_not_find_config_index;
@ -155,19 +155,21 @@ void WaterCoolingTemperatureControlModule::workloop() {
break;
}
m_thread.sleep(m_cfg.pidcompute_periodms);
// m_thread.sleep(m_cfg.pidcompute_periodms);
m_thread.sleep(100);
float val = read_pid_temperature();
// float val = read_pid_temperature();
float error = m_target_temperature - val;
float out = 0;
m_pidmodule.compute(error, &out);
// float error = m_target_temperature - val;
// float out = 0;
// m_pidmodule.compute(error, &out);
if (m_enable_log) {
ZLOGI(TAG, "temperature: %.2f %.2f integral_err:%.2f out:%d", m_target_temperature, val, m_pidmodule.get_integral_err(), (int32_t)out);
// ZLOGI(TAG, "temperature: %.2f %.2f integral_err:%.2f out:%d", m_target_temperature, val, m_pidmodule.get_integral_err(), (int32_t)out);
ZLOGI(TAG, "temperature: %.2f", read_pid_temperature());
}
peltier_set_power_level(out);
// peltier_set_power_level(out);
}
pump_stop();
@ -192,7 +194,15 @@ int32_t WaterCoolingTemperatureControlModule::checkdevice() {
* BASIC *
*******************************************************************************/
float WaterCoolingTemperatureControlModule::read_pid_temperature() { return m_temperature_sensor[m_hardwared_config.temp_fb_index]->getTemperature(); }
float WaterCoolingTemperatureControlModule::read_pid_temperature() {
ZITemperatureSensor* sensor = m_temperature_sensor[m_hardwared_config.temp_fb_index];
float val = sensor->getTemperature();
if (sensor->isError()) {
ZLOGW(TAG, "get temperature fail %s", sensor->errorInfo());
return 0;
}
return val;
}
void WaterCoolingTemperatureControlModule::pump_start(int32_t pump_speed) {
ZLOGI(TAG, "pump_start %d", pump_speed);

Loading…
Cancel
Save