From 03621e29814345afd06acc564191e243c3481641 Mon Sep 17 00:00:00 2001 From: cfif Date: Mon, 2 Feb 2026 15:19:22 +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 | 51 ++++++++++++++++++++++++++++++++++++++++++---- Gpios.h | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 4 deletions(-) diff --git a/Gpios.c b/Gpios.c index 5a4c7fe..ab64041 100644 --- a/Gpios.c +++ b/Gpios.c @@ -10,11 +10,54 @@ tGpios GPIOS; void Gpios_Init() { tGpios *env = &GPIOS; - env->led.LED1 = vInitGpioPinPull(GPIO_A, PORT_PIN_8, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, false, PORT_PULL_DOWN); - env->led.LED2 = vInitGpioPinPull(GPIO_A, PORT_PIN_11, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, false, PORT_PULL_DOWN); - env->led.LED3 = vInitGpioPinPull(GPIO_A, PORT_PIN_15, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, false, PORT_PULL_DOWN); + env->power.TPS7B6850QPWPRQ1.WD_EN = vInitGpioPinPull(GPIO_C, PORT_PIN_12, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_HIGH, GPIO_PUSH_PULL, PORT_PULL_DOWN); + // В схеме нет внешней подтяжки (ошибка) !!! + env->power.TPS7B6850QPWPRQ1.WDO = vInitGpioPinPull(GPIO_C, PORT_PIN_13, GPIO_IN, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_OPEN_DRAIN, PORT_PULL_DOWN); + env->power.TPS7B6850QPWPRQ1.WD = vInitGpioPinPull(GPIO_C, PORT_PIN_14, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_HIGH, GPIO_PUSH_PULL, PORT_PULL_DOWN); + + // Контроль напряжения борт-сети (0 - ВКЛ) + env->power.PBATT_CK_EN = vInitGpioPinPull(GPIO_C, PORT_PIN_17, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_HIGH, GPIO_PUSH_PULL, PORT_PULL_UP); + // Включение 5V (0 - ВКЛ) + env->power.SW5V_EN = vInitGpioPinPull(GPIO_C, PORT_PIN_18, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_HIGH, GPIO_PUSH_PULL, PORT_PULL_UP); + + // Канал 0 (1 - ВКЛ) + env->power.BTS5180_2EKA_FrontRearIncarMotor.Incar_Motor_Front_EN = vInitGpioPinPull(GPIO_A, PORT_PIN_9, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + // Разрешение диагностики (1 - ВКЛ) + env->power.BTS5180_2EKA_FrontRearIncarMotor.Incar_EN_Diag = vInitGpioPinPull(GPIO_A, PORT_PIN_10, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + // Вывод диагностики (0 - Канал 0; 1 - Канал 1) + env->power.BTS5180_2EKA_FrontRearIncarMotor.Incar_SEL_Diag = vInitGpioPinPull(GPIO_A, PORT_PIN_11, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + // Канал 1 (1 - ВКЛ) + env->power.BTS5180_2EKA_FrontRearIncarMotor.Incar_Motor_Rear_EN = vInitGpioPinPull(GPIO_A, PORT_PIN_17, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); -// env->led.LED1 = vInitGpioPinPull(GPIO_B, PORT_PIN_8, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, false, PORT_PULL_DOWN); + // Канал 0 (1 - ВКЛ) + env->power.BTS5180_2EKA_TwoWayValveAndReservePowerSupply.TwoWayValve_EN = vInitGpioPinPull(GPIO_D, PORT_PIN_24, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + // Разрешение диагностики (1 - ВКЛ) + env->power.BTS5180_2EKA_TwoWayValveAndReservePowerSupply.TwoWayValve_EN_Diag = vInitGpioPinPull(GPIO_D, PORT_PIN_25, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + // Вывод диагностики (0 - Канал 0; 1 - Канал 1) + env->power.BTS5180_2EKA_TwoWayValveAndReservePowerSupply.TwoWayValve_SEL_Diag = vInitGpioPinPull(GPIO_D, PORT_PIN_26, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + // Канал 1 (1 - ВКЛ) + env->power.BTS5180_2EKA_TwoWayValveAndReservePowerSupply.ReservePower_EN = vInitGpioPinPull(GPIO_D, PORT_PIN_27, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + + + // Канал 0 (1 - ВКЛ) + env->power.BTS5180_2EKA_2xChannelPTCPower.PtcRelayDriver1_EN = vInitGpioPinPull(GPIO_C, PORT_PIN_20, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + // Разрешение диагностики (1 - ВКЛ) + env->power.BTS5180_2EKA_2xChannelPTCPower.PtcRelayDriver_EN_Diag = vInitGpioPinPull(GPIO_C, PORT_PIN_23, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + // Вывод диагностики (0 - Канал 0; 1 - Канал 1) + env->power.BTS5180_2EKA_2xChannelPTCPower.PtcRelayDriver_SEL_Diag = vInitGpioPinPull(GPIO_C, PORT_PIN_24, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + // Канал 1 (1 - ВКЛ) + env->power.BTS5180_2EKA_2xChannelPTCPower.PtcRelayDriver2_EN = vInitGpioPinPull(GPIO_C, PORT_PIN_21, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + + + // Канал 0 (1 - ВКЛ) + env->power.BTS5180_2EKA_ShutOFFValveFrontRear.ShutOffFront_EN = vInitGpioPinPull(GPIO_A, PORT_PIN_20, GPIO_OUT, GPIO_PIN_NOREVERSE, GPIO_LOW, GPIO_PUSH_PULL, PORT_PULL_DOWN); + // Разрешение диагностики (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); + // Канал 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); + } \ No newline at end of file diff --git a/Gpios.h b/Gpios.h index 4d14eb3..74184d4 100644 --- a/Gpios.h +++ b/Gpios.h @@ -14,8 +14,71 @@ typedef struct { tGpioPin LED3; } tLed; +typedef struct { + tGpioPin WD_EN; // Разрешение работы WD (0 - ВКЛ) + tGpioPin WDO; // При возникновении ошибки сторожевого таймера этот вывод подтягивается к низкому уровню напряжения (OpenDrain HIGH) + tGpioPin WD; // Watchdog service-signal (подавать меандр не менее 100 мкс) +} tTPS7B6850QPWPRQ1; + + +// Допустим, вы выбрали R_резистора = 1.2 кОм (1200 Ом). Микроконтроллер измерил U_на_резисторе = 1.1 В (U_на_резисторе = ADC_reading * (Vref / 4095)). +// Сначала находим ток диагностики: I_IS = U / R = 1.1 В / 1200 Ом ≈ 0.000917 А (0.917 мА). +// Затем находим ток нагрузки: I_мотора = I_IS * kILIS = 0.000917 А * 550 ≈ 0.504 А. +// kILIS = 550 (константа микросхемы из документации) +// Результат: ток через мотор составляет примерно 0.5 А. +// IL(NOM)1 - номинальный ток нагрузки при активном одном канале (2А) +// IL(NOM)2 - номинальный ток нагрузки при активных двух каналах (1.5А) + +// IL(SC) — ток нагрузки в режиме короткого замыкания (ограниченный схемой защиты) +// 5 В Минимум 8 А (типично ~10 А) +// 28 В Типично 4 А (IL28(SC)) + +// IL(OL) (5-30 mA) — пороговый ток для обнаружения обрыва нагрузки (Open Load), когда канал включен. Если IL < IL(OL), система диагностирует обрыв + + +typedef struct { + tGpioPin Incar_Motor_Front_EN; // Канал 0 (1 - ВКЛ) + tGpioPin Incar_EN_Diag; // Разрешение диагностики (1 - ВКЛ) + tGpioPin Incar_SEL_Diag; // Вывод диагностики (0 - Канал 0; 1 - Канал 1) + tGpioPin Incar_Motor_Rear_EN; // Канал 1 (1 - ВКЛ) +} tBTS5180_2EKA_FrontAndRearIncarMotor; + +typedef struct { + tGpioPin TwoWayValve_EN; // Канал 0 (1 - ВКЛ) + tGpioPin TwoWayValve_EN_Diag; // Разрешение диагностики (1 - ВКЛ) + tGpioPin TwoWayValve_SEL_Diag; // Вывод диагностики (0 - Канал 0; 1 - Канал 1) + tGpioPin ReservePower_EN; // Канал 1 (1 - ВКЛ) +} tBTS5180_2EKA_TwoWayValveAndReservePowerSupply; + +typedef struct { + tGpioPin PtcRelayDriver1_EN; // Канал 0 (1 - ВКЛ) + tGpioPin PtcRelayDriver_EN_Diag; // Разрешение диагностики (1 - ВКЛ) + tGpioPin PtcRelayDriver_SEL_Diag; // Вывод диагностики (0 - Канал 0; 1 - Канал 1) + tGpioPin PtcRelayDriver2_EN; // Канал 1 (1 - ВКЛ) +} tBTS5180_2EKA_2xChannelPTCPowerControl; + +typedef struct { + tGpioPin ShutOffFront_EN; // Канал 0 (1 - ВКЛ) + tGpioPin ShutOff_EN_Diag; // Разрешение диагностики (1 - ВКЛ) + tGpioPin ShutSel_SEL_Diag; // Вывод диагностики (0 - Канал 0; 1 - Канал 1) + tGpioPin ShutOffRear_EN; // Канал 1 (1 - ВКЛ) +} tBTS5180_2EKA_ShutOFFValveFrontRear; + +typedef struct { + tTPS7B6850QPWPRQ1 TPS7B6850QPWPRQ1; + 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 - ВКЛ) + + +} tPower; + typedef struct { tLed led; + tPower power; } tGpios; extern tGpios GPIOS;