From 1bd70501d5a0510dd24117f0dbb912ecac78d222 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Fri, 9 Aug 2024 19:41:41 +0800 Subject: [PATCH] update --- app_protocols/transmit_disfection_protocol | 2 +- usrc/app/dmapp.cpp | 80 ++++++++++++++++++---- .../app_share/air_compressor_controller.hpp | 1 + usrc/board_base/app_share/blower_controller.hpp | 76 ++++++++++++++++++-- .../board_base/baseboard/dbdm_power_ctrl_board.cpp | 58 ++++++++++++++++ .../board_base/baseboard/dbdm_power_ctrl_board.hpp | 13 ++++ usrc/board_base/board_base.hpp | 1 + zsdk | 2 +- zstm32/halport/gins.c | 1 + zstm32/halport/gins.h | 1 + 10 files changed, 211 insertions(+), 24 deletions(-) create mode 100644 usrc/board_base/baseboard/dbdm_power_ctrl_board.cpp create mode 100644 usrc/board_base/baseboard/dbdm_power_ctrl_board.hpp diff --git a/app_protocols/transmit_disfection_protocol b/app_protocols/transmit_disfection_protocol index 72a9aad..38ea8db 160000 --- a/app_protocols/transmit_disfection_protocol +++ b/app_protocols/transmit_disfection_protocol @@ -1 +1 @@ -Subproject commit 72a9aadd6793193e8b1c475d4774ad0fc4d05590 +Subproject commit 38ea8db7c4b148c6f21b03b1099a82258ed8cd3f diff --git a/usrc/app/dmapp.cpp b/usrc/app/dmapp.cpp index 99184e1..091e7f1 100644 --- a/usrc/app/dmapp.cpp +++ b/usrc/app/dmapp.cpp @@ -6,15 +6,20 @@ * * 小空间和大空间硬件一样 * - * 管道式-液路控制板 - * 相比于大空间消毒机,不同的点: - * 1.增加比例阀控制 - * 2.空压机通道控制 - * 管道式-功率板 - * 相比于大空间消毒机,不同的点: - * 1. 风机改成鼓风机(可控风速) * - * 拉杆箱- + * 管道式----- + * 液路控制板 + * 相比于大空间消毒机,不同的点: + * 1.增加比例阀控制 + * 2.空压机通道控制 + * 功率板 + * 相比于大空间消毒机,不同的点: + * 1. 风机改成鼓风机(可控风速) + * + * 拉杆箱------ + * 液路控制板 + * + * 功率板 * */ @@ -33,28 +38,60 @@ void DisinfectionApp::initialize() { int btid = PublicBoard::ins()->getBoardTypeId(); // - if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kPipeDMPowerCtrlBoard, kDrawBarDMPowerCtrlBoard)) { + // 加热片 + if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kPipeDMPowerCtrlBoard)) { LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT(); heaterCtrler.initialize(PC7, &hadc1, ADC_CHANNEL_2, &hadc1, ADC_CHANNEL_8); bindHeaterCtrler(); + } else if (isBoardType(kDrawBarDMPowerCtrlBoard)) { + LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT(); + heaterCtrler.initialize(PC7, NULL, 0, &hadc1, ADC_CHANNEL_1); + bindHeaterCtrler(); } - if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kDrawBarDMPowerCtrlBoard)) { + // 风机 + if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard)) { LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT(); blowerCtrler.initialize(PC5, &hadc1, ADC_CHANNEL_1); bindBlowerCtrler(); } else if (isBoardType(kPipeDMPowerCtrlBoard)) { + LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT(); LargeSpaceDmPowerCtrlBoardHal::HUART2_INIT(9600, UART_STOPBITS_1); - blowerCtrler.initializeAsHighPowerUartBlower(&huart2); + blowerCtrler.initializeAsHighPowerUartBlower(&huart2, &hadc1, ADC_CHANNEL_1); + bindBlowerCtrler(); + } else if (isBoardType(kDrawBarDMPowerCtrlBoard)) { + DBDMPowerCtrlBoard::HTIM3_INIT(); + blowerCtrler.initializeAsMiniPwmBlower(&htim3, TIM_CHANNEL_3, PC6 /*en*/, PC9 /*fb*/); bindBlowerCtrler(); } - if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kPipeDMPowerCtrlBoard, kDrawBarDMPowerCtrlBoard)) { + // 空压机 + if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kPipeDMPowerCtrlBoard)) { LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT(); airComCtrler.initialize(PC3, &hadc1, ADC_CHANNEL_0); bindAirComCtrler(); + } else if (isBoardType(kDrawBarDMLiquidCtrlBoard)) { + airComCtrler.initialize(PD14, NULL, 0); } + // 气密性测试空压机 + // kfn_air_tightness_test_ac_ctrl + if (isBoardType(kPipeDMPowerCtrlBoard)) { + REG_LAMADA_FN(kfn_air_tightness_test_ac_ctrl, [&](ProcessContext* cxt) { + airComCtrler.air_compressor_ctrl(GET_PARAM(0)); + airComCtrler.air_compressor_ctrl_safe_valve(GET_PARAM(0)); + zcanbus_send_ack(cxt->packet, NULL, 0); + }); + } else if (isBoardType(kDrawBarDMLiquidCtrlBoard)) { + static ZGPIO airCompressorCtrlGpio; + airCompressorCtrlGpio.initAsOutput(PD15, kxs_gpio_nopull, true, false); + REG_LAMADA_FN(kfn_air_tightness_test_ac_ctrl, [&](ProcessContext* cxt) { + airCompressorCtrlGpio.write(GET_PARAM(0)); + zcanbus_send_ack(cxt->packet, NULL, 0); + }); + } + + // H2O2传感器 if (isBoardType(kLargeSpaceDMPowerCtrlBoard, kSmallSpaceDMPowerCtrlBoard, kPipeDMPowerCtrlBoard, kDrawBarDMPowerCtrlBoard)) { LargeSpaceDmPowerCtrlBoardHal::HUART3_INIT(19200, UART_STOPBITS_2); LargeSpaceDmPowerCtrlBoardHal::HADC1_INIT(); @@ -62,13 +99,24 @@ void DisinfectionApp::initialize() { bindH2o2Sensor(); } - if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard, kDrawBarDMLiquidCtrlBoard)) { + // 水浸传感器 + if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard)) { evaporationBinWS.initAsInput(PC7, kxs_gpio_nopull, kxs_gpio_no_irq, true /*mirror*/); deviceBottomWS.initAsInput(PC8, kxs_gpio_nopull, kxs_gpio_no_irq, true /*mirror*/); bindDeviceBottomWS(); bindEvaporationBinWS(); } + // TMC驱动 + // kfn_pump_rotate = 100, // cmd: index rpm ack:none + // kfn_pump_stop = 101, // cmd: index rpm ack:none + // kfn_pump_set_ihold_irun_idelay = 102, // cmd: index irun,ihold,idelay ack:none + // kfn_pump_set_acc = 104, // cmd: index acc ack:none , delete + // kfn_pump_ping = 105, // cmd: index, ack:none + // kfn_pump_set_ramp = 106, // cmd: index,vs,a1,amx,v1 ack:none + // kfn_pump_set_tzw = 107, // cmd: index,timeZeroWait ack:none + // kfn_pump_set_subic_reg = 110, // cmd: index,val ack:none + // kfn_pump_get_subic_reg = 111, // cmd: index, ack:val if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard, kDrawBarDMLiquidCtrlBoard)) { // TMC电机初始化 LargeSpaceDMLiquidCtrlBoardHal::HSPI1_INIT(); @@ -76,14 +124,15 @@ void DisinfectionApp::initialize() { bindTmcPowerGroup(); } - if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard, kDrawBarDMLiquidCtrlBoard)) { + // 三色指示灯 + if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard)) { // 三色指示灯初始化 wlDriver.initialize(PD8, PD7, PD9, PD10); bindWlDriver(); } + // 压力传感器初始化 if (isBoardType(kLargeSpaceDMLiquidCtrlBoard, kSmallSpaceDMLiquidCtrlBoard, kPipeDMLiquidCtrlBoard, kDrawBarDMLiquidCtrlBoard)) { - // 压力传感器初始化 osDelay(1500); // 等待传感器上电 LargeSpaceDMLiquidCtrlBoardHal::HUART3_INIT(9600, UART_STOPBITS_1); psBus.initialize(&huart3); @@ -130,6 +179,7 @@ void DisinfectionApp::bindBlowerCtrler() { BIND_FN(BlowerController, &blowerCtrler, fn_blower_ctrl); BIND_FN(BlowerController, &blowerCtrler, fn_blower_ctrl_safe_valve); BIND_FN(BlowerController, &blowerCtrler, fn_blower_read_electric_current); + BIND_FN(BlowerController, &blowerCtrler, fn_blower_is_error); } void DisinfectionApp::bindAirComCtrler() { diff --git a/usrc/board_base/app_share/air_compressor_controller.hpp b/usrc/board_base/app_share/air_compressor_controller.hpp index 41268e4..36d1ddd 100644 --- a/usrc/board_base/app_share/air_compressor_controller.hpp +++ b/usrc/board_base/app_share/air_compressor_controller.hpp @@ -17,6 +17,7 @@ class AirCompressorController { } void initialize(Pin_t ctrlGpio, ADC_HandleTypeDef* iadc, uint32_t ich) { + if (m_isInitialized) return; m_AirCompressor_ctrlGpio.initAsOutput(ctrlGpio, kxs_gpio_nopull, true, false); m_AirCompressor_iAdc.initialize("AirComAdc", iadc, ich); m_isInitialized = true; diff --git a/usrc/board_base/app_share/blower_controller.hpp b/usrc/board_base/app_share/blower_controller.hpp index 8109290..dda8e08 100644 --- a/usrc/board_base/app_share/blower_controller.hpp +++ b/usrc/board_base/app_share/blower_controller.hpp @@ -15,25 +15,42 @@ class BlowerController { // kIOBlower ZGPIO m_ctrlGpio; - ZADC m_iadc; // kHighPowerUartBlower ModbusBlockHost m_modbusblock; - bool m_isInitialized = false; + + // kMiniPwmBlower + static TIM_HandleTypeDef* m_miniPwmBlower_htim; + static uint32_t m_miniPwmBlower_channle; + static ZGPIO m_miniPwmBlower_enGpio; + static ZGPIO m_miniPwmBlower_fbGpio; + + ZADC m_iadc; + bool m_iadcIsInit = fasle; + + bool m_isInitialized = false; public: void initialize(Pin_t ctrlGpio, ADC_HandleTypeDef* iadc, uint32_t ich) { m_ctrlGpio.initAsOutput(ctrlGpio, kxs_gpio_nopull, true, false); m_iadc.initialize("Blower-iadc", iadc, ich); - m_blowerType = kIOBlower; + m_blowerType = kIOBlower; m_isInitialized = true; } bool isInitialized() { return m_isInitialized; } - void initializeAsHighPowerUartBlower(UART_HandleTypeDef* huart) { + void initializeAsHighPowerUartBlower(UART_HandleTypeDef* huart, ADC_HandleTypeDef* iadc, uint32_t ich) { m_modbusblock.initialize(huart); + m_iadc.initialize("Blower-iadc", iadc, ich); m_blowerType = kHighPowerUartBlower; } + void initializeAsMiniPwmBlower(TIM_HandleTypeDef* htim, uint32_t channel, Pin_t enGpio, Pin_t fbGpio) { + m_miniPwmBlower_htim = htim; + m_miniPwmBlower_channle = channel; + m_miniPwmBlower_enGpio.initAsOutput(enGpio, kxs_gpio_nopull, true, false); + m_miniPwmBlower_fbGpio.initAsInput(fbGpio, kxs_gpio_nopull, kxs_gpio_rising_irq, false); + m_blowerType = kMiniPwmBlower; + } /*********************************************************************************************************************** * FN * @@ -47,11 +64,32 @@ class BlowerController { } else { m_modbusblock.writeReg06(1, 0x2000, 6, 100); } + } else if (m_blowerType == kMiniPwmBlower) { + mini_pwm_blower_ctrl(val); } } void blower_ctrl_safe_valve(int32_t val) {} - int32_t blower_read_electric_current() { return blowserAdcToCurrent(m_iadc.getCacheVal()); } - int32_t blower_read_iadc() { return m_iadc.getCacheVal(); } + int32_t blower_read_electric_current() { + if (m_blowerType == kIOBlower || m_blowerType == kHighPowerUartBlower) { + return blowserAdcToCurrent(m_iadc.getCacheVal()); + } + return 0; + } + int32_t blower_read_iadc() { + if (m_blowerType == kIOBlower || m_blowerType == kHighPowerUartBlower) { + return m_iadc.getCacheVal(); + } + return 0; + } + + int32_t blower_is_error() { + // TODO: 栏杆箱消毒机添加故障检测 + return 0; + } + + void periodTask() { + if (m_iadc.isInited()) m_iadc.updateAdcValToCache(); + } /*********************************************************************************************************************** * PP * @@ -69,6 +107,30 @@ class BlowerController { zcanbus_send_ack(cxt->packet, (uint8_t*)val, sizeof(val)); } - void periodTask() { m_iadc.updateAdcValToCache(); } + void fn_blower_is_error(ProcessContext* cxt) { // + auto val = blower_is_error(); + zcanbus_send_ack(cxt->packet, (uint8_t*)val, sizeof(val)); + } + + private: + void mini_pwm_blower_ctrl(int32_t duty) { + duty = 100 - duty; + if (duty < 0) duty = 0; + if (duty > 100) duty = 100; + + TIM_OC_InitTypeDef sConfigOC = {0}; + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = duty / 100.0 * __HAL_TIM_GET_AUTORELOAD(m_miniPwmBlower_htim); + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; + sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; + + HAL_TIM_PWM_ConfigChannel(m_miniPwmBlower_htim, &sConfigOC, m_miniPwmBlower_channle); + HAL_TIM_PWM_Stop(m_miniPwmBlower_htim, m_miniPwmBlower_channle); + HAL_TIM_PWM_Start(m_miniPwmBlower_htim, m_miniPwmBlower_channle); + + m_miniPwmBlower_enGpio.write(duty != 0); + } }; } // namespace iflytop \ No newline at end of file diff --git a/usrc/board_base/baseboard/dbdm_power_ctrl_board.cpp b/usrc/board_base/baseboard/dbdm_power_ctrl_board.cpp new file mode 100644 index 0000000..4b0f477 --- /dev/null +++ b/usrc/board_base/baseboard/dbdm_power_ctrl_board.cpp @@ -0,0 +1,58 @@ +#pragma once +#include "dbdm_power_ctrl_board.hpp" +using namespace iflytop; +void DBDMPowerCtrlBoard::HTIM3_INIT() { + /* USER CODE BEGIN TIM3_Init 0 */ + + /* USER CODE END TIM3_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_OC_InitTypeDef sConfigOC = {0}; + + /* USER CODE BEGIN TIM3_Init 1 */ + + /* USER CODE END TIM3_Init 1 */ + htim3.Instance = TIM3; + htim3.Init.Prescaler = 143; + htim3.Init.CounterMode = TIM_COUNTERMODE_UP; + htim3.Init.Period = 9999; + htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim3) != HAL_OK) { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) { + Error_Handler(); + } + if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN TIM3_Init 2 */ + + /* USER CODE END TIM3_Init 2 */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**TIM3 GPIO Configuration + PC8 ------> TIM3_CH3 + */ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + GPIO_InitStruct.Pin = GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF2_TIM3; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); +} \ No newline at end of file diff --git a/usrc/board_base/baseboard/dbdm_power_ctrl_board.hpp b/usrc/board_base/baseboard/dbdm_power_ctrl_board.hpp new file mode 100644 index 0000000..e748263 --- /dev/null +++ b/usrc/board_base/baseboard/dbdm_power_ctrl_board.hpp @@ -0,0 +1,13 @@ +#pragma once +#include +#include + +#include "base/appdep.hpp" + +namespace iflytop { +class DBDMPowerCtrlBoard { + public: + static void HTIM3_INIT(); + private: +}; +} // namespace iflytop \ No newline at end of file diff --git a/usrc/board_base/board_base.hpp b/usrc/board_base/board_base.hpp index 7c242d5..7164c57 100644 --- a/usrc/board_base/board_base.hpp +++ b/usrc/board_base/board_base.hpp @@ -11,3 +11,4 @@ // #include "baseboard/large_space_dm_liquid_ctrl_board_hal.hpp" #include "baseboard/large_space_dm_power_ctrl_board.hpp" +#include "baseboard/dbdm_power_ctrl_board.hpp" \ No newline at end of file diff --git a/zsdk b/zsdk index 56b0595..e3bb71d 160000 --- a/zsdk +++ b/zsdk @@ -1 +1 @@ -Subproject commit 56b0595562d44d5ed960fcada360556ab816ce76 +Subproject commit e3bb71df415b83ce7e8224dc6b55dc0880d8895a diff --git a/zstm32/halport/gins.c b/zstm32/halport/gins.c index 8d0263d..3ed5e8a 100644 --- a/zstm32/halport/gins.c +++ b/zstm32/halport/gins.c @@ -6,6 +6,7 @@ DEFINE_GLOBAL(CAN_HandleTypeDef, hcan1); DEFINE_GLOBAL(TIM_HandleTypeDef, htim1); DEFINE_GLOBAL(TIM_HandleTypeDef, htim2); +DEFINE_GLOBAL(TIM_HandleTypeDef, htim3); DEFINE_GLOBAL(TIM_HandleTypeDef, htim6); DEFINE_GLOBAL(TIM_HandleTypeDef, htim7); DEFINE_GLOBAL(TIM_HandleTypeDef, htim11); diff --git a/zstm32/halport/gins.h b/zstm32/halport/gins.h index e43c83a..5783764 100644 --- a/zstm32/halport/gins.h +++ b/zstm32/halport/gins.h @@ -24,6 +24,7 @@ EXTERN_GLOBAL(CAN_HandleTypeDef, hcan1); EXTERN_GLOBAL(TIM_HandleTypeDef, htim1); EXTERN_GLOBAL(TIM_HandleTypeDef, htim2); +EXTERN_GLOBAL(TIM_HandleTypeDef, htim3); EXTERN_GLOBAL(TIM_HandleTypeDef, htim6); EXTERN_GLOBAL(TIM_HandleTypeDef, htim7); EXTERN_GLOBAL(TIM_HandleTypeDef, htim11);