158 lines
13 KiB
C
158 lines
13 KiB
C
//
|
||
// 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);
|
||
|
||
} |