From 95bf1917c6b821b815a92bdb5c3d983759c92453 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 7 Nov 2023 21:02:07 +0800 Subject: [PATCH] update --- chip/basic/chip_helper.cpp | 92 ++++++++++++++++++++++ chip/basic/chip_helper.hpp | 2 + chip/zgpio.hpp | 2 +- chip/zpwm_generator_muti_channel.cpp | 16 ++-- chip/zpwm_generator_muti_channel.hpp | 13 ++- components/api/zi_temperature_sensor.hpp | 4 +- components/sensors/tmp117/tmp117.cpp | 8 ++ components/sensors/tmp117/tmp117.hpp | 7 ++ components/ti/drv8710.cpp | 7 +- components/ti/drv8710.hpp | 6 +- .../pwm_ctrl_module.cpp | 6 +- .../pwm_ctrl_module.hpp | 5 +- .../water_cooling_temperature_control_module.cpp | 15 +++- .../water_cooling_temperature_control_module.hpp | 2 + 14 files changed, 166 insertions(+), 19 deletions(-) diff --git a/chip/basic/chip_helper.cpp b/chip/basic/chip_helper.cpp index 1aff0f6..53f4fd4 100644 --- a/chip/basic/chip_helper.cpp +++ b/chip/basic/chip_helper.cpp @@ -103,6 +103,97 @@ uint16_t chip_get_pinoff(Pin_t pin) { return 0; } +// TIM2 +// TIM3 +// TIM4 +// TIM5 +// TIM6 +// TIM7 +// TIM12 +// TIM13 +// TIM14 +// TIM1 +// TIM8 +// TIM9 +// TIM10 +// TIM11 +// TIM_CR1_CEN_Pos + +const char* chip_tim_get_name(TIM_TypeDef* tim) { +#ifdef TIM1 + if (tim == TIM1) { + return "TIM1"; + } +#endif +#ifdef TIM2 + if (tim == TIM2) { + return "TIM2"; + } +#endif +#ifdef TIM3 + if (tim == TIM3) { + return "TIM3"; + } +#endif +#ifdef TIM4 + if (tim == TIM4) { + return "TIM4"; + } +#endif +#ifdef TIM5 + if (tim == TIM5) { + return "TIM5"; + } +#endif +#ifdef TIM6 + if (tim == TIM6) { + return "TIM6"; + } +#endif +#ifdef TIM7 + if (tim == TIM7) { + return "TIM7"; + } +#endif +#ifdef TIM8 + if (tim == TIM8) { + return "TIM8"; + } +#endif +#ifdef TIM9 + if (tim == TIM9) { + return "TIM9"; + } +#endif +#ifdef TIM10 + if (tim == TIM10) { + return "TIM10"; + } +#endif +#ifdef TIM11 + if (tim == TIM11) { + return "TIM11"; + } +#endif +#ifdef TIM12 + if (tim == TIM12) { + return "TIM12"; + } +#endif +#ifdef TIM13 + if (tim == TIM13) { + return "TIM13"; + } +#endif +#ifdef TIM14 + if (tim == TIM14) { + return "TIM14"; + } +#endif + + return "unknowntim"; +} + const char* chip_gpio_group_get_name(GPIO_TypeDef* gpio_group) { if (gpio_group == GPIOA) { return "GPIOA"; @@ -290,6 +381,7 @@ static float zfeq(float val0, float val1, float eps = 0.0001) { float dv = val0 - val1; if (dv < 0) dv = -dv; if (dv < eps) return true; + return false; } bool chip_calculate_prescaler_and_autoreload_by_expect_freq(uint32_t timerInClk, float infreqhz, uint32_t* prescaler, uint32_t* autoreload) { diff --git a/chip/basic/chip_helper.hpp b/chip/basic/chip_helper.hpp index 34cc833..742f3c2 100644 --- a/chip/basic/chip_helper.hpp +++ b/chip/basic/chip_helper.hpp @@ -11,6 +11,8 @@ const char* chip_gpio_group_get_name(GPIO_TypeDef* gpio_group); uint16_t chip_get_pinoff(Pin_t pin); const char* chip_pinoff_get_name(uint16_t pinoff); +const char* chip_tim_get_name(TIM_TypeDef* tim); + void chip_critical_enter(void); void chip_critical_exit(void); diff --git a/chip/zgpio.hpp b/chip/zgpio.hpp index bf44d3b..936b545 100644 --- a/chip/zgpio.hpp +++ b/chip/zgpio.hpp @@ -72,7 +72,7 @@ class ZGPIO { initAsOutput(outputcfg->pin, outputcfg->mode, outputcfg->mirror, outputcfg->initLevel); } void initAsInput(InputGpioCfg_t *inputcfg) { initAsInput(inputcfg->pin, inputcfg->mode, inputcfg->irqtype, inputcfg->mirror); } - + void enableTrace(bool enable) { m_log_when_setstate = enable; } void regListener(onirq_t listener); bool isMirror(); diff --git a/chip/zpwm_generator_muti_channel.cpp b/chip/zpwm_generator_muti_channel.cpp index 56b9eab..88536b4 100644 --- a/chip/zpwm_generator_muti_channel.cpp +++ b/chip/zpwm_generator_muti_channel.cpp @@ -2,11 +2,15 @@ #include "zirq_dispatcher.hpp" using namespace iflytop; - -void ZPWMGeneratorMutiChannel::initialize(zchip_tim_t *htim, float freq, bool polarity) { - m_htim = htim; - m_polarity = polarity; - m_freq = freq; +#define TAG "ZPWM_GMC" +void ZPWMGeneratorMutiChannel::initialize(hardware_config_t *cfg) { + ZEARLY_ASSERT(cfg); + ZEARLY_ASSERT(cfg->name); + ZEARLY_ASSERT(cfg->htim); + m_cfg = *cfg; + m_htim = m_cfg.htim; + m_polarity = m_cfg.polarity; + m_freq = m_cfg.freq; ZEARLY_ASSERT(m_htim->Init.AutoReloadPreload == TIM_AUTORELOAD_PRELOAD_ENABLE); ZEARLY_ASSERT(m_htim->Init.CounterMode == TIM_COUNTERMODE_UP); @@ -61,6 +65,7 @@ void ZPWMGeneratorMutiChannel::updatePWMState(int32_t channelindex /*1 if (HAL_TIM_PWM_ConfigChannel(m_htim, &sConfigOC, channel) != HAL_OK) { Error_Handler(); } + // m_htim-> HAL_TIM_PWM_Stop(m_htim, channel); if (HAL_TIM_PWM_Start(m_htim, channel) != HAL_OK) { Error_Handler(); @@ -70,6 +75,7 @@ void ZPWMGeneratorMutiChannel::updatePWMState(int32_t channelindex /*1 void ZPWMGeneratorMutiChannel::startPWM(int32_t channelindex /*1,2,3,4*/, float duty) { if (channelindex < 1 || channelindex > 4) return; m_pwmstate[channelindex] = true; + ZEARLY_LOGI(TAG, "[%s] startPWM tim:%s channelindex:%d duty:%f", m_cfg.name, chip_tim_get_name(m_htim->Instance), channelindex, duty); updatePWMState(channelindex, duty); } void ZPWMGeneratorMutiChannel::stopPWM(int32_t channelindex) { diff --git a/chip/zpwm_generator_muti_channel.hpp b/chip/zpwm_generator_muti_channel.hpp index c5cdfea..f0dd918 100644 --- a/chip/zpwm_generator_muti_channel.hpp +++ b/chip/zpwm_generator_muti_channel.hpp @@ -9,9 +9,17 @@ namespace iflytop { using namespace iflytop; +// https://iflytop1.feishu.cn/wiki/DhNhwteIGijHy5kC53Dcfp83nZ6 class ZPWMGeneratorMutiChannel { public: typedef function ontimirq_t; + typedef struct { + const char *name; + zchip_tim_t *htim; + float freq; + bool polarity; // Polarity 1:高为有效电平,0:低为有效电平 + bool calltrace; // 使能追踪日志 + } hardware_config_t; private: zchip_tim_t *m_htim; @@ -19,6 +27,9 @@ class ZPWMGeneratorMutiChannel { float m_freq; bool m_pwmstate[4] = {0}; + bool m_enablelog = false; + + hardware_config_t m_cfg; public: ZPWMGeneratorMutiChannel() {} @@ -29,7 +40,7 @@ class ZPWMGeneratorMutiChannel { * @param Channel PWM通道 TIM_CHANNEL_1 TIM_CHANNEL_2 TIM_CHANNEL_3 TIM_CHANNEL_4 * @param Polarity 1:高为有效电平,0:低为有效电平 */ - void initialize(zchip_tim_t *htim, float freq, bool polarity); + void initialize(hardware_config_t *cfg); /******************************************************************************* * PWM_MODE * *******************************************************************************/ diff --git a/components/api/zi_temperature_sensor.hpp b/components/api/zi_temperature_sensor.hpp index ba5031a..2596790 100644 --- a/components/api/zi_temperature_sensor.hpp +++ b/components/api/zi_temperature_sensor.hpp @@ -10,6 +10,8 @@ using namespace std; class ZITemperatureSensor { public: virtual ~ZITemperatureSensor() {} - virtual float getTemperature() = 0; // 摄氏度 + virtual float getTemperature() = 0; // 摄氏度 + virtual bool isOnline() = 0; + virtual bool isError() = 0; }; } // namespace iflytop \ No newline at end of file diff --git a/components/sensors/tmp117/tmp117.cpp b/components/sensors/tmp117/tmp117.cpp index 3d5d51a..d95c625 100644 --- a/components/sensors/tmp117/tmp117.cpp +++ b/components/sensors/tmp117/tmp117.cpp @@ -26,6 +26,14 @@ void TMP117::initializate(I2C_HandleTypeDef* i2c, ID_t id) { setTemperatureOffset(0x0000); } +bool TMP117::isOnline() { + getTemperature(); + return m_lastCallStatus == HAL_OK; +} +bool TMP117::isError() { + return m_lastCallStatus != HAL_OK; +} + const char* TMP117::getLastCallStatusString() { switch (m_lastCallStatus) { case HAL_OK: diff --git a/components/sensors/tmp117/tmp117.hpp b/components/sensors/tmp117/tmp117.hpp index 854f331..d664018 100644 --- a/components/sensors/tmp117/tmp117.hpp +++ b/components/sensors/tmp117/tmp117.hpp @@ -71,6 +71,13 @@ class TMP117 : public ZITemperatureSensor { virtual float getTemperature() override; /** + * @brief 温度传感器状态 + * + */ + virtual bool isOnline() override; + virtual bool isError() override; + + /** * @brief 获取最后一次调用的状态 * * @return HAL_StatusTypeDef diff --git a/components/ti/drv8710.cpp b/components/ti/drv8710.cpp index 7f42411..e5aafce 100644 --- a/components/ti/drv8710.cpp +++ b/components/ti/drv8710.cpp @@ -2,12 +2,15 @@ using namespace iflytop; void DRV8710::initialize(config_t* cfg) { // - m_cfg = *cfg; - m_pwmCtrl.initialize(cfg->tim, 10 * 1000, false); + m_cfg = *cfg; + cfg->pwm_cfg.calltrace = cfg->enableTrace; + m_pwmCtrl.initialize(&cfg->pwm_cfg); m_nsleep.initAsOutput(cfg->nsleep, ZGPIO::kMode_nopull, false, false); + m_nsleep.enableTrace(cfg->enableTrace); m_nfault.initAsInput(cfg->nfault, ZGPIO::kMode_pullup, ZGPIO::kIRQ_noIrq, false); m_in2.initAsOutput(cfg->in2, ZGPIO::kMode_nopull, false, false); + m_in2.enableTrace(cfg->enableTrace); enable(false); } diff --git a/components/ti/drv8710.hpp b/components/ti/drv8710.hpp index 366e7b4..96f4c0e 100644 --- a/components/ti/drv8710.hpp +++ b/components/ti/drv8710.hpp @@ -27,13 +27,15 @@ namespace iflytop { class DRV8710 { public: typedef struct { - TIM_HandleTypeDef* tim; - int32_t in1_chnannel_index; + ZPWMGeneratorMutiChannel::hardware_config_t pwm_cfg; + int32_t in1_chnannel_index; Pin_t in2; Pin_t nsleep; Pin_t nfault; bool shaft; + bool enableTrace; + } config_t; ZPWMGeneratorMutiChannel m_pwmCtrl; diff --git a/components/water_cooling_temperature_control_module/pwm_ctrl_module.cpp b/components/water_cooling_temperature_control_module/pwm_ctrl_module.cpp index 3ec6b78..c67eb5a 100644 --- a/components/water_cooling_temperature_control_module/pwm_ctrl_module.cpp +++ b/components/water_cooling_temperature_control_module/pwm_ctrl_module.cpp @@ -5,7 +5,7 @@ using namespace iflytop; void PWMSpeedCtrlModule::initialize(config_t* pcfg) { ZASSERT(pcfg); - ZASSERT(pcfg->fanCtrlTim); + // ZASSERT(pcfg->fanCtrlTim); cfg = *pcfg; m_enablefbcheck = pcfg->enablefbcheck; @@ -29,10 +29,12 @@ void PWMSpeedCtrlModule::initialize(config_t* pcfg) { cfg.fanPowerGpioCfg[i].mode, // cfg.fanPowerGpioCfg[i].initLevel, // cfg.fanPowerGpioCfg[i].mirror); + m_fanPowerGpio[i].enableTrace(pcfg->enableTrace); m_nfanPowerPin++; } } - m_fanCtrlPwm.initialize(cfg.fanCtrlTim, 1000, false); + cfg.pwm_cfg.calltrace = pcfg->enableTrace; + m_fanCtrlPwm.initialize(&cfg.pwm_cfg); } void PWMSpeedCtrlModule::onfbgpioirq(int32_t fanindex) { diff --git a/components/water_cooling_temperature_control_module/pwm_ctrl_module.hpp b/components/water_cooling_temperature_control_module/pwm_ctrl_module.hpp index a060cad..2081a89 100644 --- a/components/water_cooling_temperature_control_module/pwm_ctrl_module.hpp +++ b/components/water_cooling_temperature_control_module/pwm_ctrl_module.hpp @@ -24,12 +24,15 @@ namespace iflytop { class PWMSpeedCtrlModule { public: typedef struct { - TIM_HandleTypeDef* fanCtrlTim; + // TIM_HandleTypeDef* fanCtrlTim; + ZPWMGeneratorMutiChannel::hardware_config_t pwm_cfg; + int32_t nfan; int32_t fan0Channel[4]; ZGPIO::InputGpioCfg_t fanFBGpioCfg[4]; ZGPIO::OutputGpioCfg_t fanPowerGpioCfg[4]; bool enablefbcheck; + bool enableTrace; } config_t; typedef struct { 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 4b88375..fd16816 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 @@ -21,6 +21,7 @@ void WaterCoolingTemperatureControlModule::initialize(int32_t id, config_t* cfg, ZGPIO::OutputGpioCfg_t ext_input[10]; ZGPIO::InputGpioCfg_t ext_output[10]; #endif + m_id = id; for (int32_t i = 0; i < ZARRAY_SIZE(hardwaredconfig->temperature_sensor); i++) { if (!hardwaredconfig->temperature_sensor[i]) break; @@ -58,6 +59,7 @@ void WaterCoolingTemperatureControlModule::initialize(int32_t id, config_t* cfg, m_pidmodule.initialize(&cfg->pid_cfg); m_thread.init("WaterCoolingTemperatureControlModule"); + m_cfg = *cfg; ZLOGI(TAG, "WaterCoolingTemperatureControlModule initialized..."); } @@ -103,6 +105,8 @@ int32_t WaterCoolingTemperatureControlModule::module_xxx_reg(int32_t param_id, b PROCESS_REG(kreg_compute_interval, REG_GET(m_cfg.pidcompute_periodms), REG_SET(m_cfg.pidcompute_periodms)); PROCESS_REG(kreg_pid_target, REG_GET_FLOAT(m_target_temperature, 0.1), REG_SET_FLOAT(m_target_temperature, 0.1)); + PROCESS_REG(kreg_module_private0, gettemperature_sensor_state(val), ACTION_NONE); + 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); @@ -112,10 +116,6 @@ int32_t WaterCoolingTemperatureControlModule::module_xxx_reg(int32_t param_id, b PROCESS_REG(kreg_module_errorcode, REG_GET(m_errorcode), ACTION_NONE); PROCESS_REG(kreg_module_initflag, REG_GET(module_get_inited_flag()), ACTION_NONE); PROCESS_REG(kreg_module_errorbitflag0, REG_GET(geterrorbitflag0()), ACTION_NONE); - PROCESS_REG(kreg_module_errorbitflag1, REG_GET(geterrorbitflag1()), ACTION_NONE); - - PROCESS_REG(kreg_module_input_state, REG_GET(read_input_state()), ACTION_NONE); - PROCESS_REG(kreg_module_output_state, REG_GET(read_output_io_state()), ACTION_NONE); PROCESS_REG(kreg_sensor_temperature0, REG_GET(getTemperatureSensorVal(0)), ACTION_NONE); PROCESS_REG(kreg_sensor_temperature1, REG_GET(getTemperatureSensorVal(1)), ACTION_NONE); @@ -129,6 +129,13 @@ int32_t WaterCoolingTemperatureControlModule::module_xxx_reg(int32_t param_id, b } return 0; } +int32_t WaterCoolingTemperatureControlModule::gettemperature_sensor_state(int32_t& state) { + for (int32_t i = 0; i < m_n_temperature_sensor; i++) { + state |= m_temperature_sensor[i]->isOnline() << i; + } + return 0; +} + int32_t WaterCoolingTemperatureControlModule::do_action(int32_t actioncode) { if (actioncode == ACTION_TEST_PELTIER_SET_POWER_LEVEL) { return test_peltier_set_power_level(m_reg.module_action_param1); diff --git a/components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.hpp b/components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.hpp index e1923a5..510f693 100644 --- a/components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.hpp +++ b/components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.hpp @@ -153,6 +153,8 @@ class WaterCoolingTemperatureControlModule : public ZIModule { int32_t geterrorbitflag0(); int32_t geterrorbitflag1(); + int32_t gettemperature_sensor_state(int32_t& state); + float getTemperatureSensorVal(int32_t index); int32_t do_action(int32_t actioncode); };