/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file compressor_valve_switch.c * @author Motor Control SDK Team, Yuwell Software XiangenWang * @brief Voice Recognition Module Initialization Section, including peripheral initialization and message node insertion, etc. * @version 1.0 * @changelog version 1.0 初始版本 2025.12.10 - 新增:新建第一个版本的软件,待完善解析命令后的程序执行部分 ****************************************************************************** * @attention * *

© Copyright (c) 2025 Yuwell Software Danyang.Jiangsu.China. * All rights reserved.

* * Redistribution and use in source and binary forms, with or without * modification, are permitted, provided that the following conditions are met: * * 1. Redistribution of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of Yuwell Software nor the names of other * contributors to this software may be used to endorse or promote products * derived from this software without specific written permission. * 4. This software, including modifications and/or derivative works of this * software, must execute solely and exclusively on microcontroller or * microprocessor devices manufactured by or for Yuwell Software. * 5. Redistribution and use of this software other than as permitted under * this license is void and will automatically terminate your rights under * this license. * * THIS SOFTWARE IS PROVIDED BY Yuwell Software AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT * SHALL Yuwell Software OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ /* USER CODE END Header */ #include "compressor_valve_switch.h" // 刚开始上电时的电磁阀切换状态 typedef enum { ON_STAGE_1_3200_11, ON_STAGE_2_1820_10, ON_STAGE_3_120_00, ON_STAGE_4_2880_10, // 四阶段后切换到正常工作模式 } PowerOnValveStage; typedef enum { NORMAL_STAGE_1_500_11, NORMAL_STAGE_2_4820_01, NORMAL_STAGE_3_500_11, NORMAL_STAGE_4_4820_10, // 正常情况下四个阶段来回切换 } NormalValveStage; typedef enum { PHASE_1_POWER_ON, PHASE_2_NORMAL, } ValveShiftPhase; PowerOnValveStage on_valve_stage = ON_STAGE_1_3200_11; NormalValveStage normal_valve_stage = NORMAL_STAGE_1_500_11; ValveShiftPhase valve_phase = PHASE_1_POWER_ON; void compressor_valve_init(void) { /* 配置普通GPIO工作模式 */ FL_GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.mode = FL_GPIO_MODE_OUTPUT; GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.pull = FL_ENABLE; GPIO_InitStruct.remapPin = FL_DISABLE; GPIO_InitStruct.analogSwitch = FL_DISABLE; // 电磁阀控制GPIO初始化 GPIO_InitStruct.pin = VALVE_1_GPIO_PIN; FL_GPIO_Init(VALVE_1_GPIO_PORT, &GPIO_InitStruct); GPIO_InitStruct.pin = VALVE_2_GPIO_PIN; FL_GPIO_Init(VALVE_2_GPIO_PORT, &GPIO_InitStruct); //压缩机控制GPIO初始化 GPIO_InitStruct.pin = COMPRESSOR_GPIO_PIN; FL_GPIO_Init(COMPRESSOR_GPIO_PORT, &GPIO_InitStruct); // 初始化风扇控制GPIO GPIO_InitStruct.pin = FAN_1_GPIO_PIN; FL_GPIO_Init(FAN_1_GPIO_PORT, &GPIO_InitStruct); GPIO_InitStruct.pin = FAN_2_GPIO_PIN; FL_GPIO_Init(FAN_2_GPIO_PORT, &GPIO_InitStruct); GPIO_InitStruct.pin = FAN_3_GPIO_PIN; FL_GPIO_Init(FAN_3_GPIO_PORT, &GPIO_InitStruct); } static void power_on_valve_shift(void) { // 初始上电阶段进行电磁阀切换 static uint16_t time_counter = 0; time_counter++; switch(on_valve_stage) { case ON_STAGE_1_3200_11: // 初始上电阶段 VALVE_1_ON; VALVE_2_ON; if(time_counter == 160) // 3200/20 = 160 { time_counter = 0; on_valve_stage = ON_STAGE_2_1820_10; } break; case ON_STAGE_2_1820_10: VALVE_1_ON; VALVE_2_OFF; if(time_counter == 91) // 1820/20 = 91 { time_counter = 0; on_valve_stage = ON_STAGE_3_120_00; } break; case ON_STAGE_3_120_00: VALVE_1_OFF; VALVE_2_OFF; if(time_counter == 6) // 120/20 = 6 { time_counter = 0; on_valve_stage = ON_STAGE_4_2880_10; } break; case ON_STAGE_4_2880_10: VALVE_1_ON; VALVE_2_OFF; if(time_counter == 144) // 2880/20 = 144 { time_counter = 0; valve_phase = PHASE_2_NORMAL; } break; } } static void normal_valve_shift(void) { static uint16_t time_counter = 0; time_counter++; switch(normal_valve_stage) { case NORMAL_STAGE_1_500_11: VALVE_1_ON; VALVE_2_ON; if(time_counter == 25) // 500/20 = 25 { time_counter = 0; normal_valve_stage = NORMAL_STAGE_2_4820_01; } break; case NORMAL_STAGE_2_4820_01: VALVE_1_OFF; VALVE_2_ON; if(time_counter == 241) // 4820/20 = 241 { time_counter = 0; normal_valve_stage = NORMAL_STAGE_3_500_11; } break; case NORMAL_STAGE_3_500_11: VALVE_1_ON; VALVE_2_ON; if(time_counter == 25) // 500/20 = 25 { time_counter = 0; normal_valve_stage = NORMAL_STAGE_4_4820_10; } break; case NORMAL_STAGE_4_4820_10: VALVE_1_ON; VALVE_2_OFF; if(time_counter == 241) // 4820/20 = 241 { time_counter = 0; normal_valve_stage = NORMAL_STAGE_1_500_11; } break; } } void compressor_valve_task(void) { // 电磁阀 压缩机 风扇控制任务 20ms执行一次 // 实时获取当前状态机状态 切换电磁阀 MsgQueueItem stm_item; peek_queue_node_by_type(&global_queue, MSG_TYPE_OXG_STM, &stm_item); static uint16_t valve_off_delay = 200; static uint32_t fan_off_delay = 6000; switch(stm_item.data.state_machine.oxg_stm) { case STM_INIT: case STM_ERROR_NONE_STOP: case STM_NOM: case STM_CARLIB: case STM_DEBUG: // 非停机故障与正常状态都正常切换电磁阀 COMPRESSOR_ON; FAN_ALL_ON; if(valve_phase == PHASE_1_POWER_ON) { power_on_valve_shift(); }else{ normal_valve_shift(); } break; case STM_ERROR_SHOUNTDOWN: COMPRESSOR_OFF; if(valve_off_delay) { valve_off_delay--; VALVE_1_ON; VALVE_2_ON; }else{ VALVE_1_OFF; VALVE_2_OFF; } if(fan_off_delay) { fan_off_delay--; FAN_ALL_ON; }else{ FAN_ALL_OFF; } break; default: break; } }