fix: 修复放电功能相关的若干问题
1. 修改apps/chrg/applications/utils/chrg_sink.c: - 调整寄存器数组长度,新增继电器控制相关的初始化配置 - 在放电初始化前先关闭所有功率板继电器 2. 修改apps/chrg/applications/thread/chrg_north.c: - 修复变量类型不匹配问题,将uint8_t改为rt_uint8_t - 新增参数合法性校验逻辑,避免空指针和越界访问 - 新增电压状态标记,仅在电压有效后才将低压视为故障 - 修复无符号整数溢出问题,避免电压差值计算异常 - 优化电流异常时的状态机切换逻辑 - 非工作状态下重置所有状态标记
This commit is contained in:
@@ -207,11 +207,17 @@ void chrg_source_setting(rt_uint8_t *frame_data, eIDX_SOU_CH idx,
|
|||||||
void chrg_sink_parse(rt_uint8_t *frame_data, eIDX_SOU_CH idx,
|
void chrg_sink_parse(rt_uint8_t *frame_data, eIDX_SOU_CH idx,
|
||||||
struct chrg_switch_t *pSW, struct chrg_north_t *pNOR)
|
struct chrg_switch_t *pSW, struct chrg_north_t *pNOR)
|
||||||
{
|
{
|
||||||
rt_uint16_t volt_mv = ((frame_data[4] << 8) | frame_data[5])*10;
|
rt_uint16_t volt_mv = ((frame_data[4] << 8) | frame_data[5]) * 10;
|
||||||
static uint8_t volt_low[TOTAL_SOU_CHS] = {0};
|
static rt_uint8_t volt_low[TOTAL_SOU_CHS] = {0};
|
||||||
static uint8_t no_curr[TOTAL_SOU_CHS] = {0};
|
static rt_uint8_t no_curr[TOTAL_SOU_CHS] = {0};
|
||||||
pSW->VZ = ((frame_data[14] << 8) | frame_data[15]);
|
static rt_uint8_t volt_set_ok[TOTAL_SOU_CHS] = {0};
|
||||||
pSW->VF = ((frame_data[16] << 8) | frame_data[17]);
|
|
||||||
|
if ((idx >= TOTAL_SOU_CHS) || (pSW == RT_NULL)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pSW->VZ = ((frame_data[14] << 8) | frame_data[15]);
|
||||||
|
pSW->VF = ((frame_data[16] << 8) | frame_data[17]);
|
||||||
|
|
||||||
#if DEBUG_NORTH
|
#if DEBUG_NORTH
|
||||||
LOG_D("Sink[%d] real volt: %d mV", idx, volt_mv);
|
LOG_D("Sink[%d] real volt: %d mV", idx, volt_mv);
|
||||||
@@ -220,25 +226,42 @@ void chrg_sink_parse(rt_uint8_t *frame_data, eIDX_SOU_CH idx,
|
|||||||
if(pSW->sink.On_work == 1 && pSW->sink.test.test_mode == 0) {
|
if(pSW->sink.On_work == 1 && pSW->sink.test.test_mode == 0) {
|
||||||
if (volt_mv <= WORK_MIN_VOLT) { // 电压过低,禁止进入工作状态机
|
if (volt_mv <= WORK_MIN_VOLT) { // 电压过低,禁止进入工作状态机
|
||||||
// volt_low[idx]++;
|
// volt_low[idx]++;
|
||||||
|
/* Treat low voltage as a fault only after voltage was once valid. */
|
||||||
|
if (volt_set_ok[idx] == 1) {
|
||||||
|
if (++volt_low[idx] >= 5) {
|
||||||
|
volt_set_ok[idx] = 0;
|
||||||
|
no_curr[idx] = 0;
|
||||||
|
pSW->sink.work_mode = SINK_WORK_LOW;
|
||||||
|
}
|
||||||
|
}
|
||||||
// if(volt_low[idx]>=5) pSW->sink.work_on_step = SINK_WORK_LOW; // 复位工作状态机
|
// if(volt_low[idx]>=5) pSW->sink.work_on_step = SINK_WORK_LOW; // 复位工作状态机
|
||||||
}
|
}
|
||||||
else{ // 电压稳定时执行工作状态机(继电器/工作模式切换)
|
else{ // 电压稳定时执行工作状态机(继电器/工作模式切换)
|
||||||
volt_low[idx] = 0;
|
volt_low[idx] = 0;
|
||||||
|
volt_set_ok[idx] = 1;
|
||||||
pSW->change_flag = 0;
|
pSW->change_flag = 0;
|
||||||
if((pSW->sink.pro_loadv - volt_mv) <= 2000){
|
/* Avoid unsigned underflow when actual voltage is above target. */
|
||||||
|
if ((rt_uint32_t)volt_mv + 2000 >= pSW->sink.pro_loadv) {
|
||||||
pSW->sink.work_mode = SINK_WORK_RUNING;
|
pSW->sink.work_mode = SINK_WORK_RUNING;
|
||||||
if(pSW->Now_current<=200){
|
/* Voltage is normal but current is still zero: retry from WAIT. */
|
||||||
if(no_curr[idx]++>=5){
|
if (pSW->Now_current <= 200) {
|
||||||
|
if (++no_curr[idx] >= 5) {
|
||||||
pSW->sink.work_mode = SINK_WORK_WAIT;
|
pSW->sink.work_mode = SINK_WORK_WAIT;
|
||||||
no_curr[idx] = 0;
|
no_curr[idx] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else no_curr[idx] = 0;
|
else {
|
||||||
|
no_curr[idx] = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
no_curr[idx] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
volt_low[idx] = 0;
|
volt_low[idx] = 0;
|
||||||
|
no_curr[idx] = 0;
|
||||||
|
volt_set_ok[idx] = 0;
|
||||||
// pSW->sink.work_on_step = SINK_WORK_STOP; // 复位工作状态机
|
// pSW->sink.work_on_step = SINK_WORK_STOP; // 复位工作状态机
|
||||||
}
|
}
|
||||||
chrg_sink_work(idx,pSW);
|
chrg_sink_work(idx,pSW);
|
||||||
|
|||||||
@@ -448,8 +448,8 @@ static int chrg_sink_work_init(eIDX_SOU_CH idx, struct chrg_switch_t *pSW)
|
|||||||
{
|
{
|
||||||
struct chrg_south_t *pSOU = &chrgsouth;
|
struct chrg_south_t *pSOU = &chrgsouth;
|
||||||
struct chrg_north_t *pNOR = &chrgnorth;
|
struct chrg_north_t *pNOR = &chrgnorth;
|
||||||
rt_uint16_t regs[3] = {REG_CURRENT_OUT + 1, REG_MODE, 0};
|
rt_uint16_t regs[4] = {REG_CURRENT_OUT + 1, REG_MODE, 0, 0};
|
||||||
rt_uint16_t vals[3] = {0, pSW->CV_mode, 0};
|
rt_uint16_t vals[4] = {0, pSW->CV_mode, 0, 0};
|
||||||
rt_uint8_t count = 2;
|
rt_uint8_t count = 2;
|
||||||
|
|
||||||
if (pSW->sink.test.test_mode_old == 1) {
|
if (pSW->sink.test.test_mode_old == 1) {
|
||||||
@@ -459,6 +459,9 @@ static int chrg_sink_work_init(eIDX_SOU_CH idx, struct chrg_switch_t *pSW)
|
|||||||
regs[count] = ModbusRTU_DYNA_CMD_MODE_FLAG;
|
regs[count] = ModbusRTU_DYNA_CMD_MODE_FLAG;
|
||||||
vals[count++] = ModbusRTU_DYNA_CMD_MODE_STOP;
|
vals[count++] = ModbusRTU_DYNA_CMD_MODE_STOP;
|
||||||
}
|
}
|
||||||
|
/* Close both power-board relays before starting sink init. */
|
||||||
|
regs[count] = REG_REL_ON;
|
||||||
|
vals[count++] = ALL_REL_OFF;
|
||||||
if (chrg_sou_com_batch_submit(idx, regs, vals, count) != 0) {
|
if (chrg_sou_com_batch_submit(idx, regs, vals, count) != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,130 @@
|
|||||||
|
*** Using Compiler 'V6.16', folder: 'D:\Program Files\Keil_v5\ARM\ARMCLANG\Bin'
|
||||||
|
Rebuild target 'chrg'
|
||||||
|
compiling main.c...
|
||||||
|
compiling chrg_switch.c...
|
||||||
|
compiling chrg_wdt.c...
|
||||||
|
compiling chrg_gpio.c...
|
||||||
|
compiling chrg_tmr.c...
|
||||||
|
compiling chrg_fal.c...
|
||||||
|
compiling chrg_tty.c...
|
||||||
|
compiling chrg_led.c...
|
||||||
|
compiling chrg_vcom.c...
|
||||||
|
compiling chrg_rel.c...
|
||||||
|
compiling chrg_roll_nor.c...
|
||||||
|
compiling chrg_north.c...
|
||||||
|
compiling chrg_south.c...
|
||||||
|
compiling chrg_comm.c...
|
||||||
|
compiling chrg_roll_sou.c...
|
||||||
|
compiling chrg_lcd.c...
|
||||||
|
compiling chrg_thread.c...
|
||||||
|
compiling chrg_source.c...
|
||||||
|
compiling chrg_sink.c...
|
||||||
|
compiling chrg_north_pkg.c...
|
||||||
|
compiling chrg_eload.c...
|
||||||
|
compiling chrg_utils.c...
|
||||||
|
compiling syscall_mem.c...
|
||||||
|
compiling syscalls.c...
|
||||||
|
compiling cctype.c...
|
||||||
|
compiling cstdlib.c...
|
||||||
|
compiling cstring.c...
|
||||||
|
compiling ctime.c...
|
||||||
|
compiling cunistd.c...
|
||||||
|
compiling cwchar.c...
|
||||||
|
compiling device.c...
|
||||||
|
compiling hwtimer.c...
|
||||||
|
compiling completion_comm.c...
|
||||||
|
compiling completion_up.c...
|
||||||
|
compiling condvar.c...
|
||||||
|
compiling dataqueue.c...
|
||||||
|
compiling pipe.c...
|
||||||
|
compiling ringblk_buf.c...
|
||||||
|
compiling ringbuffer.c...
|
||||||
|
compiling waitqueue.c...
|
||||||
|
compiling workqueue.c...
|
||||||
|
compiling dev_pin.c...
|
||||||
|
compiling dev_serial.c...
|
||||||
|
compiling dev_watchdog.c...
|
||||||
|
compiling stm32f4xx_hal_msp.c...
|
||||||
|
compiling board.c...
|
||||||
|
compiling drv_flash_f4.c...
|
||||||
|
compiling drv_gpio.c...
|
||||||
|
compiling drv_tim.c...
|
||||||
|
compiling drv_usart.c...
|
||||||
|
compiling drv_usbd.c...
|
||||||
|
compiling drv_wdt.c...
|
||||||
|
compiling drv_common.c...
|
||||||
|
compiling fal.c...
|
||||||
|
compiling fal_flash.c...
|
||||||
|
compiling fal_partition.c...
|
||||||
|
compiling fal_rtt.c...
|
||||||
|
compiling shell.c...
|
||||||
|
compiling msh_parse.c...
|
||||||
|
compiling cmd.c...
|
||||||
|
compiling msh.c...
|
||||||
|
compiling clock.c...
|
||||||
|
compiling components.c...
|
||||||
|
compiling cpu_up.c...
|
||||||
|
compiling defunct.c...
|
||||||
|
compiling idle.c...
|
||||||
|
compiling ipc.c...
|
||||||
|
compiling irq.c...
|
||||||
|
compiling kservice.c...
|
||||||
|
compiling memheap.c...
|
||||||
|
compiling mempool.c...
|
||||||
|
compiling object.c...
|
||||||
|
compiling scheduler_comm.c...
|
||||||
|
compiling scheduler_up.c...
|
||||||
|
compiling thread.c...
|
||||||
|
compiling timer.c...
|
||||||
|
compiling rt_vsnprintf_tiny.c...
|
||||||
|
compiling kerrno.c...
|
||||||
|
compiling kstring.c...
|
||||||
|
compiling rt_vsscanf.c...
|
||||||
|
compiling kstdio.c...
|
||||||
|
compiling atomic_arm.c...
|
||||||
|
compiling div0.c...
|
||||||
|
compiling showmem.c...
|
||||||
|
assembling context_rvds.S...
|
||||||
|
compiling cpuport.c...
|
||||||
|
compiling usbdevice.c...
|
||||||
|
compiling cdc_vcom.c...
|
||||||
|
compiling usbdevice_core.c...
|
||||||
|
assembling startup_stm32f405xx.s...
|
||||||
|
compiling system_stm32f4xx.c...
|
||||||
|
compiling stm32f4xx_hal_gpio.c...
|
||||||
|
compiling stm32f4xx_hal_flash.c...
|
||||||
|
compiling stm32f4xx_hal_usart.c...
|
||||||
|
compiling stm32f4xx_hal_rng.c...
|
||||||
|
compiling stm32f4xx_hal_uart.c...
|
||||||
|
compiling stm32f4xx_hal_wwdg.c...
|
||||||
|
compiling stm32f4xx_hal_tim.c...
|
||||||
|
compiling stm32f4xx_hal_cryp_ex.c...
|
||||||
|
compiling stm32f4xx_hal_pwr.c...
|
||||||
|
compiling stm32f4xx_hal_rcc.c...
|
||||||
|
compiling stm32f4xx_hal_hcd.c...
|
||||||
|
compiling stm32f4xx_ll_usb.c...
|
||||||
|
compiling stm32f4xx_hal_pccard.c...
|
||||||
|
compiling stm32f4xx_hal_flash_ex.c...
|
||||||
|
compiling stm32f4xx_hal_flash_ramfunc.c...
|
||||||
|
compiling stm32f4xx_hal_tim_ex.c...
|
||||||
|
compiling stm32f4xx_hal_lptim.c...
|
||||||
|
compiling stm32f4xx_hal_cec.c...
|
||||||
|
compiling stm32f4xx_hal_cryp.c...
|
||||||
|
compiling stm32f4xx_hal.c...
|
||||||
|
compiling stm32f4xx_hal_iwdg.c...
|
||||||
|
compiling stm32f4xx_hal_pcd_ex.c...
|
||||||
|
compiling stm32f4xx_hal_pcd.c...
|
||||||
|
compiling stm32f4xx_hal_crc.c...
|
||||||
|
compiling stm32f4xx_hal_dma_ex.c...
|
||||||
|
compiling stm32f4xx_hal_cortex.c...
|
||||||
|
compiling stm32f4xx_hal_dma.c...
|
||||||
|
compiling stm32f4xx_hal_rcc_ex.c...
|
||||||
|
compiling stm32f4xx_hal_pwr_ex.c...
|
||||||
|
compiling ulog.c...
|
||||||
|
compiling console_be.c...
|
||||||
|
linking...
|
||||||
|
Program Size: Code=140360 RO-data=15152 RW-data=8544 ZI-data=13712
|
||||||
|
FromELF: creating hex file...
|
||||||
|
After Build - User command #1: fromelf --bin .\build\keil\Obj\chrg.axf -o build/chrg.bin
|
||||||
|
".\build\keil\Obj\chrg.axf" - 0 Error(s), 0 Warning(s).
|
||||||
|
Build Time Elapsed: 00:00:29
|
||||||
Reference in New Issue
Block a user