From 9f3dea013e73863b132e2e12fb90ab9b25e2a532 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Sun, 19 Nov 2023 15:48:22 +0800 Subject: [PATCH] fix tmp117 some bug --- components/api/zi_temperature_sensor.hpp | 7 +- components/sensors/tmp117/tmp117.cpp | 109 +++++++++++++-------- components/sensors/tmp117/tmp117.hpp | 9 +- .../water_cooling_temperature_control_module.cpp | 36 ++++--- 4 files changed, 100 insertions(+), 61 deletions(-) diff --git a/components/api/zi_temperature_sensor.hpp b/components/api/zi_temperature_sensor.hpp index 2596790..937be52 100644 --- a/components/api/zi_temperature_sensor.hpp +++ b/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 \ No newline at end of file diff --git a/components/sensors/tmp117/tmp117.cpp b/components/sensors/tmp117/tmp117.cpp index d95c625..b0f2526 100644 --- a/components/sensors/tmp117/tmp117.cpp +++ b/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 + * 代码测试发现,当读取温度多次之后,会出现通信一直失败的现象(每30毫秒读一次,读5s左右),重启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 + * 代码测试发现,当读取温度多次之后,会出现通信一直失败的现象(每30毫秒读一次,读5s左右),重启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 \ No newline at end of file diff --git a/components/sensors/tmp117/tmp117.hpp b/components/sensors/tmp117/tmp117.hpp index d664018..e390ef7 100644 --- a/components/sensors/tmp117/tmp117.hpp +++ b/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 diff --git a/components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.cpp b/components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.cpp index 6a3936c..b60aa52 100644 --- a/components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.cpp +++ b/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);