# HG changeset patch # User Mychaela Falconia # Date 1514532509 0 # Node ID cce24b9de6db25319f430126d51e106727612569 # Parent 4c3d0586653136f847612d898844eaece8ce2e37 FCHG: CV control loop implemented diff -r 4c3d05866531 -r cce24b9de6db src/cs/drivers/drv_app/fchg/fchg_process.c --- a/src/cs/drivers/drv_app/fchg/fchg_process.c Fri Dec 29 07:06:06 2017 +0000 +++ b/src/cs/drivers/drv_app/fchg/fchg_process.c Fri Dec 29 07:28:29 2017 +0000 @@ -178,11 +178,9 @@ { if (pwr_ctrl->batt_mv < pwr_ctrl->config.overvoltage) return 0; - if (pwr_ctrl->cv_dac_curr >= pwr_ctrl->cv_dac_init) - return 0; - if ((pwr_ctrl->cv_dac_init - pwr_ctrl->cv_dac_curr) < - pwr_ctrl->config.cv_dac_max_decr) - return 0; + if (pwr_ctrl->cv_dac_curr != + (pwr_ctrl->cv_dac_init - pwr_ctrl->config.cv_dac_max_decr)) + return; rvf_send_trace("Stopping charge by overvoltage condition", 40, NULL_PARAM, RV_TRACE_LEVEL_DEBUG_HIGH, FCHG_USE_ID); ABB_Write_Register_on_page(PAGE0, BCICTL2, 0); @@ -191,6 +189,44 @@ return 1; } +static void cv_ctrl_loop_high_check(void) +{ + if (pwr_ctrl->batt_mv < pwr_ctrl->config.cv_ctrl_loop_high) { + pwr_ctrl->cv_high_vbat_count = 0; + return; + } + pwr_ctrl->cv_high_vbat_count++; + if (pwr_ctrl->cv_high_vbat_count < pwr_ctrl->config.cv_samples_needed) + return; + if (pwr_ctrl->cv_dac_curr == + (pwr_ctrl->cv_dac_init - pwr_ctrl->config.cv_dac_max_decr)) + return; + pwr_ctrl->cv_dac_curr--; + ABB_Write_Register_on_page(PAGE0, CHGREG, pwr_ctrl->cv_dac_curr); + rvf_send_trace("Sub CV DAC", 10, pwr_ctrl->cv_dac_curr, + RV_TRACE_LEVEL_DEBUG_MEDIUM, FCHG_USE_ID); + pwr_ctrl->cv_high_vbat_count = 0; +} + +static void cv_ctrl_loop_low_check(void) +{ + if (pwr_ctrl->batt_mv >= pwr_ctrl->config.cv_ctrl_loop_low) { + pwr_ctrl->cv_low_vbat_count = 0; + return; + } + pwr_ctrl->cv_low_vbat_count++; + if (pwr_ctrl->cv_low_vbat_count < pwr_ctrl->config.cv_samples_needed) + return; + if (pwr_ctrl->cv_dac_curr == + (pwr_ctrl->cv_dac_init + pwr_ctrl->config.cv_dac_max_incr)) + return; + pwr_ctrl->cv_dac_curr++; + ABB_Write_Register_on_page(PAGE0, CHGREG, pwr_ctrl->cv_dac_curr); + rvf_send_trace("Add CV DAC", 10, pwr_ctrl->cv_dac_curr, + RV_TRACE_LEVEL_DEBUG_MEDIUM, FCHG_USE_ID); + pwr_ctrl->cv_low_vbat_count = 0; +} + void pwr_process_adc(struct pwr_adc_ind_s *msg) { pwr_ctrl->batt_mv = madc_vbat_2_physical(msg->data[0]); @@ -263,7 +299,8 @@ return; if (overvoltage_end_charge_check()) return; - /* DAC control loop will go here */ + cv_ctrl_loop_high_check(); + cv_ctrl_loop_low_check(); return; default: rvf_send_trace("Invalid state in pwr_process_adc()", 32,