From 9607ffe45a1c9f33ebce1c8fb93956b0a3e4bdbb Mon Sep 17 00:00:00 2001 From: cfif Date: Tue, 3 Feb 2026 13:02:31 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gpios.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- Gpios.h | 41 ++++++++++++++++++++++-- 2 files changed, 136 insertions(+), 4 deletions(-) diff --git a/Gpios.c b/Gpios.c index ab64041..90a737f 100644 --- a/Gpios.c +++ b/Gpios.c @@ -55,9 +55,104 @@ void Gpios_Init() { // Разрешение диагностики (1 - ВКЛ) env->power.BTS5180_2EKA_ShutOFFValveFrontRear.ShutOff_EN_Diag = vInitGpioPinPull(GPIO_A, PORT_PIN_21, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); // Вывод диагностики (0 - Канал 0; 1 - Канал 1) - env->power.BTS5180_2EKA_ShutOFFValveFrontRear.ShutSel_SEL_Diag = vInitGpioPinPull(GPIO_A, PORT_PIN_29, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + env->power.BTS5180_2EKA_ShutOFFValveFrontRear.ShutSel_SEL_Diag = vInitGpioPinPull(GPIO_A, PORT_PIN_23, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); // Канал 1 (1 - ВКЛ) - env->power.BTS5180_2EKA_ShutOFFValveFrontRear.ShutOffRear_EN = vInitGpioPinPull(GPIO_A, PORT_PIN_30, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + env->power.BTS5180_2EKA_ShutOFFValveFrontRear.ShutOffRear_EN = vInitGpioPinPull(GPIO_A, PORT_PIN_24, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + // Резервный источник разрешение (1 - ВКЛ) + env->power.BTS4175SGAXUMA1_ReservePowerOutput.EN_ReservePower = vInitGpioPinPull(GPIO_C, PORT_PIN_28, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + // Резервный источник состояния состояние (1 - ошибок нет) + // Когда устройство работает нормально (нет перегрузки, перегрева, обрыва нагрузки при выключенном состоянии), + // на выводе ST поддерживается высокий уровень напряжения (через внешний подтягивающий резистор) + env->power.BTS4175SGAXUMA1_ReservePowerOutput.ST_ReservePower = vInitGpioPinPull(GPIO_C, PORT_PIN_27, GPIO_IN, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_OPEN_DRAIN, PORT_PULL_DOWN); + + + // Резервный источник разрешение (1 - ВКЛ) + env->power.BTS4175SGAXUMA1_ShutOFFValveBatteryChiller.EN_BATTChiller = vInitGpioPinPull(GPIO_B, PORT_PIN_3, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + // Резервный источник состояния состояние (1 - ошибок нет) + // Когда устройство работает нормально (нет перегрузки, перегрева, обрыва нагрузки при выключенном состоянии), + // на выводе ST поддерживается высокий уровень напряжения (через внешний подтягивающий резистор) + env->power.BTS4175SGAXUMA1_ShutOFFValveBatteryChiller.ST_BATTChiller = vInitGpioPinPull(GPIO_B, PORT_PIN_4, GPIO_IN, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_OPEN_DRAIN, PORT_PULL_DOWN); + + + + // Основной сигнал включения/выключения силового канала (выхода OUTPUT) (1 - ВКЛ) + env->power.VN7008AJ_FrontLINActuatorPowerDriverAB.LIN_ActPower_AB = vInitGpioPinPull(GPIO_B, PORT_PIN_22, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + + // 1. Нормальный режим (SEn=1, INPUT=1, нет ошибок): + // Вывод работает как источник тока. + // Выдает ток (ISENSE), строго пропорциональный току через нагрузку (IOUT). + // Коэффициент K = IOUT / ISENSE задан в даташите (например, ~5890 для IOUT=6А). + // Формула для ADC: VSENSE = ISENSE * RSENSE = (IOUT / K) * RSENSE. + //2. Режим индикации неисправности (SEn=1, произошла ошибка): + // Вывод переключается в режим напряжения с ограничением тока. + // Выдает фиксированное напряжение VSENSEH (около 5-6.6В) при ограниченном токе ISENSEH (около 7-30 мА). + // Это цифровой сигнал для контроллера: "Произошла ошибка!" Конкретный тип ошибки (перегрев, перегрузка) определяется дополнительно, например, по времени возникновения. + // 3. Диагностика в выключенном состоянии (SEn=1, INPUT=0): + // Обрыв нагрузки (Open-Load): Если при выключенном выходе на нем (через внешний pull-up резистор) есть напряжение > VOL (порог ~2-4В), CS выдает VSENSEH + // Короткое замыкание на VCC: Если выход притянут к питанию, CS также выдает VSENSEH + // Если нагрузки исправна и подключена, CS выдает низкий уровень (~0В) + + // VSENSE = N × (VREF / 4095) = N × (5 / 4095) ≈ N × 0.001221 В + // 1. VSENSE = N × 0.001221 В + // 2. ISENSE = VSENSE / RSENSE + // 3. IOUT = K × ISENSE = K × (VSENSE / RSENSE) = K × N × 0.001221 / RSENSE + + + /* + // Конфигурация +#define VREF 5.0f // Опорное напряжение АЦП +#define RSENSE 2490.0f // Сопротивление датчика, Ом +#define K_TYPICAL 5890.0f // Типичный коэффициент из даташита +#define ADC_MAX 4095 // Максимальный код АЦП + +// Порог ошибки (VSENSEH - 5.5В с запасом) +#define ERROR_THRESHOLD_V 4.5f +#define ERROR_THRESHOLD_CODE (uint16_t)(ERROR_THRESHOLD_V * 4095.0f / VREF) + +// Функция чтения тока +float VN7008AJ_ReadCurrent(uint16_t adc_value) { + // 1. Проверка на ошибку + if (adc_value >= ERROR_THRESHOLD_CODE) { + return -999.9f; // Код ошибки + } + + // 2. Преобразование в напряжение + float vsense = (float)adc_value * VREF / 4095.0f; + + // 3. Вычисление тока + float isense = vsense / RSENSE; + float iout = isense * K_TYPICAL; + + return iout; +} + */ + + + // Fault_RSTAB: Низкий уровень (0): режим автоматического перезапуска (autorestart). При срабатывании защиты (перегрев, перегрузка) выход отключится, а затем автоматически включится, когда причина срабатывания защиты устранится. + // Fault_RSTAB: Высокий уровень (1): режим фиксации (latch-off). При срабатывании защиты выход отключается и остается выключенным до тех пор, пока не будет подан сброс (импульс низкого уровня на FaultRST) или не будет перезапущено питание. + + env->power.VN7008AJ_FrontLINActuatorPowerDriverAB.Fault_RST_AB = vInitGpioPinPull(GPIO_B, PORT_PIN_23, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + // Разрешение диагностики + env->power.VN7008AJ_FrontLINActuatorPowerDriverAB.EN_CurrentSensing_AB = vInitGpioPinPull(GPIO_B, PORT_PIN_25, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + + + + // Основной сигнал включения/выключения силового канала (выхода OUTPUT) (1 - ВКЛ) + env->power.VN7008AJ_FrontLINActuatorPowerDriverAB.LIN_ActPower_AB = vInitGpioPinPull(GPIO_B, PORT_PIN_27, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + + env->power.VN7008AJ_FrontLINActuatorPowerDriverAB.Fault_RST_AB = vInitGpioPinPull(GPIO_B, PORT_PIN_28, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + // Разрешение диагностики + env->power.VN7008AJ_FrontLINActuatorPowerDriverAB.EN_CurrentSensing_AB = vInitGpioPinPull(GPIO_B, PORT_PIN_29, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + + + // Канал 0 (1 - ВКЛ) + env->power.BTS5120_2EKA_ShutoffValvePowerTXV.ShutOffTXV1_EN = vInitGpioPinPull(GPIO_E, PORT_PIN_25, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + // Разрешение диагностики (1 - ВКЛ) + env->power.BTS5120_2EKA_ShutoffValvePowerTXV.ShutOffTXV_EN_Diag = vInitGpioPinPull(GPIO_E, PORT_PIN_26, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + // Вывод диагностики (0 - Канал 0; 1 - Канал 1) + env->power.BTS5120_2EKA_ShutoffValvePowerTXV.ShutSelTXV_SEL_Diag = vInitGpioPinPull(GPIO_E, PORT_PIN_27, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + // Канал 1 (1 - ВКЛ) + env->power.BTS5120_2EKA_ShutoffValvePowerTXV.ShutOffTXV2_EN = vInitGpioPinPull(GPIO_E, PORT_PIN_29, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); } \ No newline at end of file diff --git a/Gpios.h b/Gpios.h index 74184d4..54ccb0a 100644 --- a/Gpios.h +++ b/Gpios.h @@ -64,14 +64,51 @@ typedef struct { tGpioPin ShutOffRear_EN; // Канал 1 (1 - ВКЛ) } tBTS5180_2EKA_ShutOFFValveFrontRear; +typedef struct { + tGpioPin EN_ReservePower; // Резервный источник разрешение (1 - ВКЛ) + tGpioPin ST_ReservePower; // Резервный источник состояния состояние (1 - ошибок нет) +} tBTS4175SGAXUMA1_ReservePowerOutput; + +typedef struct { + tGpioPin LIN_ActPower_AB; // Основной сигнал включения/выключения силового канала (выхода OUTPUT) (1 - ВКЛ) + tGpioPin Fault_RST_AB; + tGpioPin EN_CurrentSensing_AB; // Разрешение диагностики +} tVN7008AJ_FrontLINActuatorPowerDriverAB; + +typedef struct { + tGpioPin LIN_ActPower_C; // Основной сигнал включения/выключения силового канала (выхода OUTPUT) (1 - ВКЛ) + tGpioPin Fault_RST_C; + tGpioPin EN_CurrentSensing_C; // Разрешение диагностики +} tVN7008AJ_RearLINActuatorPowerDriverC; + +typedef struct { + tGpioPin ShutOffTXV1_EN; // Канал 0 (1 - ВКЛ) + tGpioPin ShutOffTXV_EN_Diag; // Разрешение диагностики (1 - ВКЛ) + tGpioPin ShutSelTXV_SEL_Diag; // Вывод диагностики (0 - Канал 0; 1 - Канал 1) + tGpioPin ShutOffTXV2_EN; // Канал 1 (1 - ВКЛ) +} tBTS5120_2EKA_ShutoffValvePowerTXV; + +typedef struct { + tGpioPin EN_BATTChiller; // Холодильник разрешение (1 - ВКЛ) + tGpioPin ST_BATTChiller; // Холодильник состояния (1 - ошибок нет) +} tBTS4175SGAXUMA1_ShutOFFValveBatteryChiller; + typedef struct { tTPS7B6850QPWPRQ1 TPS7B6850QPWPRQ1; + tGpioPin PBATT_CK_EN; // Контроль напряжения борт-сети (0 - ВКЛ) + tGpioPin SW5V_EN; // Включение 5V (0 - ВКЛ) tBTS5180_2EKA_FrontAndRearIncarMotor BTS5180_2EKA_FrontRearIncarMotor; tBTS5180_2EKA_TwoWayValveAndReservePowerSupply BTS5180_2EKA_TwoWayValveAndReservePowerSupply; tBTS5180_2EKA_2xChannelPTCPowerControl BTS5180_2EKA_2xChannelPTCPower; tBTS5180_2EKA_ShutOFFValveFrontRear BTS5180_2EKA_ShutOFFValveFrontRear; - tGpioPin PBATT_CK_EN; // Контроль напряжения борт-сети (0 - ВКЛ) - tGpioPin SW5V_EN; // Включение 5V (0 - ВКЛ) + tBTS4175SGAXUMA1_ReservePowerOutput BTS4175SGAXUMA1_ReservePowerOutput; + tBTS4175SGAXUMA1_ShutOFFValveBatteryChiller BTS4175SGAXUMA1_ShutOFFValveBatteryChiller; + tVN7008AJ_FrontLINActuatorPowerDriverAB VN7008AJ_FrontLINActuatorPowerDriverAB; + tVN7008AJ_RearLINActuatorPowerDriverC VN7008AJ_RearLINActuatorPowerDriverC; + tBTS5120_2EKA_ShutoffValvePowerTXV BTS5120_2EKA_ShutoffValvePowerTXV; + + + } tPower;