2024-12-07 09:52:46 +00:00
|
|
|
|
|
|
|
|
|
#include "abnormalManage.h"
|
|
|
|
|
#include "parameter.h"
|
|
|
|
|
#include "capture.h"
|
2024-12-10 10:29:05 +00:00
|
|
|
|
#include "checkTime.h"
|
2024-12-11 09:51:48 +00:00
|
|
|
|
#include "FM_GPIO.h"
|
2024-12-14 09:52:26 +00:00
|
|
|
|
#include "task.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* 软件输出过载标志位 */
|
|
|
|
|
static BOOL disChargOverLoad = FALSE;
|
|
|
|
|
|
|
|
|
|
/* 短路标志位 */
|
|
|
|
|
static uint8_t shortCircuit = 0;
|
|
|
|
|
static BOOL shortCircuitFlag = FALSE;
|
|
|
|
|
|
|
|
|
|
/* 硬件过载状态位 */
|
|
|
|
|
static uint8_t excessiveLoad = 0;
|
|
|
|
|
static BOOL excessiveLoadFlag = FALSE;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 设定放电过载状态
|
2024-12-24 06:43:20 +00:00
|
|
|
|
* @param
|
2024-12-14 09:52:26 +00:00
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void setDisChargOverLoad(void)
|
|
|
|
|
{
|
2024-12-24 06:43:20 +00:00
|
|
|
|
/* 三段式保护中的两段 */
|
|
|
|
|
static int num1 = 0;
|
2024-12-14 09:52:26 +00:00
|
|
|
|
if (getDischargCurrent() > 30.0f) {
|
2024-12-24 06:43:20 +00:00
|
|
|
|
// disChargOverLoad = TRUE;
|
|
|
|
|
num1++;
|
|
|
|
|
} else {
|
|
|
|
|
// disChargOverLoad = FALSE;
|
|
|
|
|
num1 = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 过载时间过长关闭输出(120S) */
|
|
|
|
|
if (num1 >= 1200000) {
|
|
|
|
|
num1 = 0;
|
|
|
|
|
disChargOverLoad = TRUE;
|
|
|
|
|
setPowerOutput(FALSE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int num2 = 0;
|
|
|
|
|
if (getDischargCurrent() > 35.0f) {
|
|
|
|
|
num2++;
|
|
|
|
|
} else {
|
|
|
|
|
num2 = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 过载时间过长关闭输出(5S) */
|
|
|
|
|
if (num1 >= 50000) {
|
|
|
|
|
num1 = 0;
|
2024-12-14 09:52:26 +00:00
|
|
|
|
disChargOverLoad = TRUE;
|
2024-12-24 06:43:20 +00:00
|
|
|
|
setPowerOutput(FALSE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 软件短路保护
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void setSoftShortCircuit(void)
|
|
|
|
|
{
|
|
|
|
|
static int num = 0;
|
|
|
|
|
if (getDischargCurrent() > 50.0f) {
|
|
|
|
|
num++;
|
2024-12-14 09:52:26 +00:00
|
|
|
|
} else {
|
2024-12-24 06:43:20 +00:00
|
|
|
|
num = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 200uS内都短路则关闭输出 */
|
|
|
|
|
if (num >= 2) {
|
|
|
|
|
shortCircuitFlag = TRUE;
|
|
|
|
|
shortCircuit++;
|
|
|
|
|
setPowerOutput(FALSE);
|
|
|
|
|
startSoftShortCircuitProtection();
|
2024-12-14 09:52:26 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 得到放电过载状态
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
BOOL getChargOverLoad(void)
|
|
|
|
|
{
|
|
|
|
|
return disChargOverLoad;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 设置短路状态位
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void setShortCircuit(void)
|
|
|
|
|
{
|
|
|
|
|
shortCircuit++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 清零短路状位
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void zeroShortCircuit(void)
|
|
|
|
|
{
|
|
|
|
|
shortCircuit = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 得到短路状位
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
uint8_t getShortCircuit(void)
|
|
|
|
|
{
|
|
|
|
|
return shortCircuit;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 设定短路标志位
|
|
|
|
|
* @param state TRUE 短路
|
|
|
|
|
* FALSE 未短路
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void setShortCircuitFlag(BOOL state)
|
|
|
|
|
{
|
|
|
|
|
if (state == TRUE || state == FALSE) {
|
|
|
|
|
shortCircuitFlag = state;
|
2024-12-24 06:43:20 +00:00
|
|
|
|
}
|
2024-12-14 09:52:26 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 得到短路标志位
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
BOOL getShortCircuitFlag(void)
|
|
|
|
|
{
|
|
|
|
|
return shortCircuitFlag;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 设置硬件过载状态位
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void setExcessiveLoad(void)
|
|
|
|
|
{
|
|
|
|
|
excessiveLoad++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 清零硬件过载状态位
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void zeroExcessiveLoad(void)
|
|
|
|
|
{
|
|
|
|
|
excessiveLoad = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 得到硬件过载状态位
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
uint8_t getExcessiveLoad(void)
|
|
|
|
|
{
|
|
|
|
|
return excessiveLoad;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 设定硬件过载标志位
|
|
|
|
|
* @param state TRUE 过载
|
|
|
|
|
* FALSE 未过载
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void setExcessiveLoadFlag(BOOL state)
|
|
|
|
|
{
|
|
|
|
|
if (state == TRUE || state == FALSE) {
|
|
|
|
|
excessiveLoadFlag = state;
|
2024-12-24 06:43:20 +00:00
|
|
|
|
}
|
2024-12-14 09:52:26 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 得到硬件过载标志位
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
BOOL getExcessiveLoadFlag(void)
|
|
|
|
|
{
|
|
|
|
|
return excessiveLoadFlag;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 设置输出状态
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void setPowerOutput(BOOL state)
|
|
|
|
|
{
|
|
|
|
|
if (state == TRUE) {
|
2024-12-18 09:43:14 +00:00
|
|
|
|
if (get_OUT_VOLT_IN() < (get_PV_VOLT_OUT() - 0.1f)) {
|
|
|
|
|
POW_FF_PCON_Open();
|
|
|
|
|
POW_OUT_PCON_Open();
|
|
|
|
|
}
|
2024-12-14 09:52:26 +00:00
|
|
|
|
} else {
|
|
|
|
|
POW_FF_PCON_Close();
|
|
|
|
|
POW_OUT_PCON_Close();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 判断是否打开充电理想二极管
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void checkFFMOS_CON(void)
|
|
|
|
|
{
|
|
|
|
|
if (get_CHG_CURR() > 2.0f) {
|
|
|
|
|
FFMOS_CON_Open();
|
|
|
|
|
}
|
|
|
|
|
else if (get_CHG_CURR() < 1.0f) {
|
|
|
|
|
FFMOS_CON_Close();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-12-24 06:43:20 +00:00
|
|
|
|
// /**
|
|
|
|
|
// * @brief 判断是否短路
|
|
|
|
|
// * @param
|
|
|
|
|
// * @retval
|
|
|
|
|
// *
|
|
|
|
|
// */
|
|
|
|
|
// void checkShortCircuit(void)
|
|
|
|
|
// {
|
|
|
|
|
// static num = 0;
|
|
|
|
|
// if (getChargCurrent() > 50.0f) {
|
|
|
|
|
// num++;
|
|
|
|
|
// } else {
|
|
|
|
|
// num = 0;
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// if (num == g_cfgParameter.softShortTime) {
|
|
|
|
|
// setPowerOutput(FALSE);
|
|
|
|
|
// }
|
|
|
|
|
|
2024-12-14 09:52:26 +00:00
|
|
|
|
|
2024-12-24 06:43:20 +00:00
|
|
|
|
// }
|
2024-12-07 09:52:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void checkAbnormal(void)
|
|
|
|
|
{
|
2024-12-10 10:29:05 +00:00
|
|
|
|
// checkTimeInit();
|
2024-12-07 09:52:46 +00:00
|
|
|
|
/* 滤波 */
|
|
|
|
|
adcCaptureFir();
|
|
|
|
|
|
|
|
|
|
/* 转换 */
|
|
|
|
|
setChargCurrent();
|
|
|
|
|
setDischargCurrent();
|
|
|
|
|
setOutputVoltage();
|
|
|
|
|
setSolarInCircuitVoltage();
|
|
|
|
|
|
2024-12-11 09:51:48 +00:00
|
|
|
|
/* 判断 */
|
2024-12-14 09:52:26 +00:00
|
|
|
|
checkFFMOS_CON();
|
2024-12-24 06:43:20 +00:00
|
|
|
|
setDisChargOverLoad();
|
|
|
|
|
setSoftShortCircuit();
|
|
|
|
|
|
2024-12-07 09:52:46 +00:00
|
|
|
|
|
|
|
|
|
|
2024-12-24 06:43:20 +00:00
|
|
|
|
|
|
|
|
|
|
2024-12-11 09:51:48 +00:00
|
|
|
|
// checkAbnormalTime = getCheckTime();
|
2024-12-07 09:52:46 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-12-14 09:52:26 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief 工作电压异常中断,过载(输入大于输出)
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void WORK_VOLT_Interrupt(void)
|
|
|
|
|
{
|
2024-12-24 06:43:20 +00:00
|
|
|
|
setPowerOutput(FALSE);
|
2024-12-14 09:52:26 +00:00
|
|
|
|
setExcessiveLoad();
|
|
|
|
|
/* 第一次进入输出过载,启动过载保护任务 */
|
|
|
|
|
if (getExcessiveLoad() == 1) {
|
|
|
|
|
setExcessiveLoadFlag(TRUE);
|
|
|
|
|
startExcessiveLoadProtection();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* 多次进入输出过载,关闭输出 */
|
|
|
|
|
if (getExcessiveLoad() > 2) {
|
|
|
|
|
zeroExcessiveLoad();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 短路中断,输出电流大于一定值
|
|
|
|
|
* @param
|
|
|
|
|
* @retval
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
void DSG_PROT_Interrupt(void)
|
|
|
|
|
{
|
|
|
|
|
setShortCircuit();
|
|
|
|
|
/* 第一次进入输出短路,启动短路任务 */
|
|
|
|
|
if (getShortCircuit() == 1) {
|
|
|
|
|
setShortCircuitFlag(TRUE);
|
|
|
|
|
startShortCircuitProtection();
|
2024-12-24 06:43:20 +00:00
|
|
|
|
}
|
2024-12-14 09:52:26 +00:00
|
|
|
|
|
|
|
|
|
/* 一定时间内第二次进入输出短路保护,关闭输出 */
|
|
|
|
|
else if (getShortCircuit() >= 2) {
|
|
|
|
|
stopShortCircuitProtection();
|
|
|
|
|
setPowerOutput(FALSE);
|
|
|
|
|
zeroShortCircuit();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|