// // Created by cfif on 05.05.23. // #include "Gpios.h" #include "SystemDelayInterface.h" tGpios GPIOS; void Gpios_Init() { tGpios *env = &GPIOS; 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); // Канал 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_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_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); }