HVAC_M7_GpioPins/Gpios.c

158 lines
13 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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);
}