From 4f3281be538ec41e8cc186cdfbf9e4f7e2d4b96c Mon Sep 17 00:00:00 2001 From: tianjialong Date: Mon, 1 May 2023 15:02:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B8=95=E5=B0=94=E8=B4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/board/hardware.cpp | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/board/hardware.hpp | 14 ++++++++++ 2 files changed, 88 insertions(+) diff --git a/src/board/hardware.cpp b/src/board/hardware.cpp index 06dfdfd..7a5c4b4 100644 --- a/src/board/hardware.cpp +++ b/src/board/hardware.cpp @@ -15,11 +15,13 @@ void Hardware::hardwareinit() { debug_light_init(); can_init(); temperature_init(); + peltier_init(); } void Hardware::periodicJob() { debug_light_periodicJob(); can_periodicJob(); temperature_periodicJob(); + peltier_periodicJob(); } /******************************************************************************* @@ -150,3 +152,75 @@ void Hardware::temperature_periodicJob() { } } } + +/******************************************************************************* + * 帕尔贴 * + *******************************************************************************/ +void Hardware::peltier_cold_ctr_pwm(int pwm) { STM32_HAL::setPWMDuty(&htim1, TIM_CHANNEL_1, pwm); } +// PB0 HOT_CTR_PWM0 +void Hardware::peltier_hot_ctr_pwm(int pwm) { STM32_HAL::setPWMDuty(&htim3, TIM_CHANNEL_3, pwm); } +void Hardware::peltier_init() { // + STM32_HAL::gpioInitAsOutput(GPIOB, GPIO_PIN_1, GPIO_MODE_OUTPUT_PP, GPIO_PULLUP, GPIO_SPEED_FREQ_LOW, GPIO_PIN_RESET); + STM32_HAL::gpioInitAsOutput(GPIOE, GPIO_PIN_10, GPIO_MODE_OUTPUT_PP, GPIO_PULLUP, GPIO_SPEED_FREQ_LOW, GPIO_PIN_RESET); + STM32_HAL::setPWMFreq(&htim1, 100); + STM32_HAL::setPWMFreq(&htim3, 100); +} +int Hardware::peltier_get_pwm() { return m_peltier.pwm; } + +void Hardware::peltier_set_pwm(int pwm) { + /** + * @brief + * + * 待机状态 + * HOT_CTR_PWM0(AL) = 0 + * HOT_CTR(AH) = 0 + * COLD_CTR_PWM0(BL) = 0 + * COLD_CTR(BH) = 0 + * 加热时 + * HOT_CTR_PWM0(AL) = 1(PWM) + * HOT_CTR(AH) = 0 + * COLD_CTR_PWM0(BL) = 0 + * COLD_CTR(BH) = 1(IO/保持) + * 制冷时 + * HOT_CTR_PWM0(AL) = 0 + * HOT_CTR(AH) = 1(IO/保持) + * COLD_CTR_PWM0(BL) = 1(PWM) + * COLD_CTR(BH) = 0 + */ + if (m_peltier.pwm * pwm < 0) { + peltier_hot_ctr_pwm(0); /*HOT_CTR_PWM0*/ + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); /*HOT_CTR*/ + peltier_cold_ctr_pwm(0); /*COLD_CTR_PWM0*/ + HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_RESET); /*COLD_CTR*/ + } + m_peltier.pwm = pwm; + if (pwm == 0) { + peltier_hot_ctr_pwm(0); /*HOT_CTR_PWM0*/ + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); /*HOT_CTR*/ + peltier_cold_ctr_pwm(0); /*COLD_CTR_PWM0*/ + HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_RESET); /*COLD_CTR*/ + } else if (pwm > 0) { + peltier_hot_ctr_pwm(pwm); /*HOT_CTR_PWM0*/ + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); /*HOT_CTR*/ + peltier_cold_ctr_pwm(0); /*COLD_CTR_PWM0*/ + HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_SET); /*COLD_CTR*/ + } else { + peltier_hot_ctr_pwm(0); /*HOT_CTR_PWM0*/ + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); /*HOT_CTR*/ + peltier_cold_ctr_pwm(-pwm); /*COLD_CTR_PWM0*/ + HAL_GPIO_WritePin(GPIOE, GPIO_PIN_10, GPIO_PIN_RESET); /*COLD_CTR*/ + } +} +void Hardware::peltier_periodicJob() { + if (testHardwareFlag) { + static uint32_t lastcall; + static int duty = 0; + if (hasPassedMS(lastcall) > 1000) { + lastcall = getTicket(); + duty += 10; + if (duty > 100) duty = 0; + peltier_set_pwm(duty); + ZLOGI(TAG, "paltier set pwm:%d", duty); + } + } +} diff --git a/src/board/hardware.hpp b/src/board/hardware.hpp index 363b32c..759745b 100644 --- a/src/board/hardware.hpp +++ b/src/board/hardware.hpp @@ -33,8 +33,12 @@ class Hardware { struct temperature_res_t { TMP117 tmp117[4]; }; + struct peltier_res_t { + int32_t pwm; + }; can_res_t m_can; temperature_res_t m_temperature; + peltier_res_t m_peltier; bool testHardwareFlag; public: @@ -74,6 +78,16 @@ class Hardware { virtual uint32_t getTicket() { return HAL_GetTick(); }; virtual uint32_t getNowMS() { return HAL_GetTick(); }; virtual void sleepus(uint32_t us) { sys_delay_us(&DELAY_US_TIMER, us); } + + /******************************************************************************* + * 帕尔贴 * + *******************************************************************************/ + void peltier_init(); + void peltier_cold_ctr_pwm(int pwm); + void peltier_hot_ctr_pwm(int pwm); + void peltier_set_pwm(int pwm); + int peltier_get_pwm(); + void peltier_periodicJob(); }; } // namespace iflytop