Files
CCSModuleSW30Web/Core/Inc/psu_control.h

197 lines
7.8 KiB
C
Executable File
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.
/*
* ccs_control.h
*
* Created on: 19 авг. 2024 г.
* Author: colorbass
*/
#ifndef INC_PSU_CONTROL_H_
#define INC_PSU_CONTROL_H_
#include "main.h"
#include "charger_config.h"
void PSU_Init();
void PSU_Enable(uint8_t addr, uint8_t enable);
void PSU_Loop();
void CONT_Loop();
// --- Состояние силового модуля (DC30, один PSU) ---
typedef enum{
PSU_UNREADY, // отключен, не готов к использованию
PSU_INITIALIZING, // инициализация модуля
PSU_READY, // отключен, готов к использованию
PSU_WAIT_ACK_ON, // ждём подтверждение включения модуля (напряжение выше порога)
PSU_CONT_WAIT_ACK_ON, // включаем DC-контактор и ждём подтверждение
PSU_CONNECTED, // модуль включён, DC-контактор замкнут
PSU_CURRENT_DROP, // снижение тока перед отключением
PSU_WAIT_ACK_OFF, // ждём подтверждение выключения модуля (напряжение ниже порога)
PSU_CONT_WAIT_ACK_OFF, // выключаем DC-контактор и ждём подтверждение
PSU_OFF_PAUSE, // пауза после выключения модуля
} PSU_State_t;
/* Status0 (состояние модуля N, таблица 0 — modularForm0) */
typedef struct{
/* Bit0 */ uint8_t shortCircuitFault:1; /* 1: короткое замыкание на выходе */
/* Bit1 */ uint8_t unevenFlowAlarm:1; /* 1: перекос/неравномерность распределения тока между модулями */
/* Bit2 */ uint8_t internalCommunicationFault:1; /* 1: внутренняя ошибка связи модуля */
/* Bit3 */ uint8_t inputBusLineFault:1; /* 1: авария по входу или по шине постоянного тока */
/* Bit4 */ uint8_t lockProtection:1; /* 1: защита с защёлкой (латч, блокировка до сброса) */
/* Bit5 */ uint8_t dischargeFault:1; /* 1: неисправность цепи разряда (bleeder/разрядный резистор) */
/* Bit6 */ uint8_t eepromFault:1; /* 1: ошибка/неисправность EEPROM */
/* Bit7 */ uint8_t rsvd_s0:1; /* зарезервировано */
} PSU_Status0_t;
/* Status1 (состояние модуля N, таблица 1 — modularForm1) */
typedef struct{
/* Bit0 */ uint8_t dcSideOffStatus:1; /* 1: отключена сторона постоянного тока (DC-выход) */
/* Bit1 */ uint8_t moduleFaultAlarm:1; /* 1: общая авария модуля */
/* Bit2 */ uint8_t moduleProtectionAlarm:1; /* 1: сработала защита модуля */
/* Bit3 */ uint8_t fanFaultAlarm:1; /* 1: авария вентилятора */
/* Bit4 */ uint8_t overTempAlarm:1; /* 1: перегрев модуля */
/* Bit5 */ uint8_t outputOverVoltageAlarm:1; /* 1: перенапряжение на выходе */
/* Bit6 */ uint8_t outputOverCurrentAlarm:1; /* 1: сверхток на выходе */
/* Bit7 */ uint8_t canCommunicationInterruptAlarm:1; /* 1: нарушение связи по CAN */
} PSU_Status1_t;
/* Status2 (состояние модуля N, таблица 2 — modularForm2) */
typedef struct{
/* Bit0 */ uint8_t powerLimitStatus:1; /* 1: активен режим ограничения мощности */
/* Bit1 */ uint8_t moduleAddressDuplicate:1; /* 1: дублирование адреса модуля */
/* Bit2 */ uint8_t severeUnevenFlowFault:1; /* 1: сильный перекос токораспределения между модулями */
/* Bit3 */ uint8_t threePhaseInputPhaseLossAlarm:1; /* 1: авария по пропаданию фазы трёхфазного входа */
/* Bit4 */ uint8_t threePhaseInputUnbalanceAlarm:1; /* 1: авария по разбалансу трёхфазного входа */
/* Bit5 */ uint8_t inputUnderVoltageAlarm:1; /* 1: пониженное напряжение на входе */
/* Bit6 */ uint8_t inputOverVoltageAlarm:1; /* 1: повышенное напряжение на входе */
/* Bit7 */ uint8_t pfcSideOffStatus:1; /* 1: отключена сторона PFC */
} PSU_Status2_t;
typedef struct {
uint8_t enableAC; // состояние AC-контактора (желание)
uint8_t enableOutput; // разрешение выхода модуля (желание)
uint16_t outputVoltage; // измеренное выходное напряжение [В]
int16_t outputCurrent; // измеренный выходной ток [0.1 А]
uint8_t temperature; // температура модуля
PSU_State_t state; // состояние силового модуля и контакторов
uint8_t online; // модуль в сети (есть телеметрия)
uint8_t ready; // модуль готов к работе (online && нет ошибок)
uint8_t PSU_enabled; // на выходе есть напряжение (> порога)
uint8_t CONT_enabled; // DC-контактор замкнут (по обратной связи)
uint8_t cont_fault; // внутренняя ошибка контакторов
uint8_t psu_fault; // внутренняя ошибка силового модуля
uint32_t statetick; // время входа в состояние
// Дополнительные параметры для одного модуля DC30
uint32_t power_limit; // лимит мощности [кВт]
uint8_t hv_mode; // HV-режим (ограничение напряжения)
uint32_t tempAmbient; // температура окружающего воздуха (из PSU_04)
union { uint8_t raw; PSU_Status0_t bits; } status0; // modularForm0
union { uint8_t raw; PSU_Status1_t bits; } status1; // modularForm1
union { uint8_t raw; PSU_Status2_t bits; } status2; // modularForm2
} PSU_t;
extern PSU_t PSU0;
void PSU_Task(void);
#pragma pack(push, 1)
typedef struct{
uint8_t source:8;
uint8_t destination:8;
uint8_t command:6;
uint8_t device:4;
uint8_t error:3;
}CanId_t;
typedef struct{
uint8_t rsvd0[2];
uint16_t moduleNumber;
uint8_t rsvd1[5];
}PSU_02_t;
typedef struct{
uint8_t rsvd0[2];
uint16_t moduleGroupNumber;
uint8_t moduleTemperature;
uint8_t rsvd1;
uint8_t modularForm2;
uint8_t modularForm1;
uint8_t modularForm0;
}PSU_04_t;
typedef struct{
uint8_t VABHi;
uint8_t VABLo;
uint8_t VBCHi;
uint8_t VBCLo;
uint8_t VCAHi;
uint8_t VCALo;
uint8_t rsvd1[2];
uint32_t VAB;
uint32_t VBC;
uint32_t VCA;
}PSU_06_t;
typedef struct{
uint32_t totalSystemVoltage;
uint32_t totalSystemCurrent;
}PSU_08_t;
typedef struct{
uint8_t moduleNVoltage_[4];
uint8_t moduleNCurrent_[4];
uint32_t moduleNVoltage;
uint32_t moduleNCurrent;
}PSU_09_t;
// setup
typedef struct{
uint8_t enable;
uint8_t rsvd1[7];
}PSU_1A_t;
typedef struct{
uint8_t moduleVoltage[4];
uint8_t moduleCurrentTotal[4];
}PSU_1B_t;
//typedef struct{
// uint32_t moduleVoltage;
// uint32_t moduleCurrentTotal;
//}PSU_1B_t;
typedef struct{
uint8_t moduleVoltage[4];
uint8_t moduleCurrentTotal[4];
}PSU_1C_t;
typedef struct{
uint8_t enable;
uint8_t rsvd1[7];
}PSU_1D_t;
extern PSU_02_t PSU_02;
extern PSU_04_t PSU_04;
extern PSU_06_t PSU_06;
extern PSU_08_t PSU_08;
extern PSU_09_t PSU_09;
extern PSU_1A_t PSU_1A;
extern PSU_1B_t PSU_1B;
extern PSU_1C_t PSU_1C;
#pragma pack(pop)
#endif /* INC_PSU_CONTROL_H_ */