comparison src/cs/drivers/drv_app/fchg/fchg_process.c @ 369:65d53dede3b2

FCHG: charging time limit implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 01 Jan 2018 18:11:24 +0000
parents 44795dbadbae
children e4d46979846f
comparison
equal deleted inserted replaced
368:6a753424d524 369:65d53dede3b2
75 /* Program the DAC with the constant current value */ 75 /* Program the DAC with the constant current value */
76 ABB_Write_Register_on_page(PAGE0, CHGREG, 76 ABB_Write_Register_on_page(PAGE0, CHGREG,
77 pwr_ctrl->config.ci_current + pwr_ctrl->i2v_offset); 77 pwr_ctrl->config.ci_current + pwr_ctrl->i2v_offset);
78 /* Enable the charger */ 78 /* Enable the charger */
79 ABB_Write_Register_on_page(PAGE0, BCICTL2, 0x0003); 79 ABB_Write_Register_on_page(PAGE0, BCICTL2, 0x0003);
80 /* The total charging time starts now */
81 pwr_ctrl->start_time = rvf_get_tick_count();
80 } 82 }
81 83
82 static void start_cv_charging(void) 84 static void start_cv_charging(void)
83 { 85 {
84 UINT16 code; 86 UINT16 code;
180 return 0; 182 return 0;
181 if (pwr_ctrl->cv_dac_curr != 183 if (pwr_ctrl->cv_dac_curr !=
182 (pwr_ctrl->cv_dac_init - pwr_ctrl->config.cv_dac_max_decr)) 184 (pwr_ctrl->cv_dac_init - pwr_ctrl->config.cv_dac_max_decr))
183 return 0; 185 return 0;
184 rvf_send_trace("Stopping charge by overvoltage condition", 40, 186 rvf_send_trace("Stopping charge by overvoltage condition", 40,
185 NULL_PARAM, RV_TRACE_LEVEL_DEBUG_HIGH, FCHG_USE_ID); 187 NULL_PARAM, RV_TRACE_LEVEL_WARNING, FCHG_USE_ID);
186 ABB_Write_Register_on_page(PAGE0, BCICTL2, 0); 188 ABB_Write_Register_on_page(PAGE0, BCICTL2, 0);
187 pwr_init_discharge(); 189 pwr_init_discharge();
188 pwr_ctrl->state = FCHG_STATE_READY_TO_RECHARGE; 190 pwr_ctrl->state = FCHG_STATE_READY_TO_RECHARGE;
189 return 1; 191 return 1;
190 } 192 }
223 pwr_ctrl->cv_dac_curr++; 225 pwr_ctrl->cv_dac_curr++;
224 ABB_Write_Register_on_page(PAGE0, CHGREG, pwr_ctrl->cv_dac_curr); 226 ABB_Write_Register_on_page(PAGE0, CHGREG, pwr_ctrl->cv_dac_curr);
225 rvf_send_trace("Add CV DAC", 10, pwr_ctrl->cv_dac_curr, 227 rvf_send_trace("Add CV DAC", 10, pwr_ctrl->cv_dac_curr,
226 RV_TRACE_LEVEL_DEBUG_MEDIUM, FCHG_USE_ID); 228 RV_TRACE_LEVEL_DEBUG_MEDIUM, FCHG_USE_ID);
227 pwr_ctrl->cv_low_vbat_count = 0; 229 pwr_ctrl->cv_low_vbat_count = 0;
230 }
231
232 static int charging_time_limit_check(void)
233 {
234 if ((rvf_get_tick_count() - pwr_ctrl->start_time) <
235 RVF_SECS_TO_TICKS(pwr_ctrl->config.charge_time_limit))
236 return 0;
237 rvf_send_trace("Stopping charge by time exceeded condition", 42,
238 NULL_PARAM, RV_TRACE_LEVEL_WARNING, FCHG_USE_ID);
239 ABB_Write_Register_on_page(PAGE0, BCICTL2, 0);
240 pwr_init_discharge();
241 pwr_ctrl->state = FCHG_STATE_RECHARGE_TIMER;
242 pwr_ctrl->start_time = rvf_get_tick_count();
243 return 1;
228 } 244 }
229 245
230 void pwr_process_adc(struct pwr_adc_ind_s *msg) 246 void pwr_process_adc(struct pwr_adc_ind_s *msg)
231 { 247 {
232 pwr_ctrl->batt_mv = madc_vbat_2_physical(msg->data[0]); 248 pwr_ctrl->batt_mv = madc_vbat_2_physical(msg->data[0]);
284 if (!(msg->data[9] & CHGPRES)) { 300 if (!(msg->data[9] & CHGPRES)) {
285 ABB_Write_Register_on_page(PAGE0, BCICTL2, 0); 301 ABB_Write_Register_on_page(PAGE0, BCICTL2, 0);
286 pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; 302 pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR;
287 return; 303 return;
288 } 304 }
305 if (charging_time_limit_check())
306 return;
289 if (pwr_ctrl->batt_mv >= pwr_ctrl->config.ci2cv_thresh) 307 if (pwr_ctrl->batt_mv >= pwr_ctrl->config.ci2cv_thresh)
290 start_cv_charging(); 308 start_cv_charging();
291 return; 309 return;
292 case FCHG_STATE_CV_CHARGING: 310 case FCHG_STATE_CV_CHARGING:
293 if (!(msg->data[9] & CHGPRES)) { 311 if (!(msg->data[9] & CHGPRES)) {
297 } 315 }
298 if (cv_ichg_process(msg->data[2])) 316 if (cv_ichg_process(msg->data[2]))
299 return; 317 return;
300 if (overvoltage_end_charge_check()) 318 if (overvoltage_end_charge_check())
301 return; 319 return;
320 if (charging_time_limit_check())
321 return;
302 cv_ctrl_loop_high_check(); 322 cv_ctrl_loop_high_check();
303 cv_ctrl_loop_low_check(); 323 cv_ctrl_loop_low_check();
324 return;
325 case FCHG_STATE_RECHARGE_TIMER:
326 handle_discharge();
327 if ((rvf_get_tick_count() - pwr_ctrl->start_time) <
328 RVF_SECS_TO_TICKS(pwr_ctrl->config.recharge_delay))
329 return;
330 rvf_send_trace("Restart time met, allowing new charging", 39,
331 NULL_PARAM, RV_TRACE_LEVEL_DEBUG_HIGH,
332 FCHG_USE_ID);
333 pwr_ctrl->state = FCHG_STATE_READY_TO_RECHARGE;
304 return; 334 return;
305 default: 335 default:
306 rvf_send_trace("Invalid state in pwr_process_adc()", 32, 336 rvf_send_trace("Invalid state in pwr_process_adc()", 32,
307 pwr_ctrl->state, RV_TRACE_LEVEL_ERROR, 337 pwr_ctrl->state, RV_TRACE_LEVEL_ERROR,
308 FCHG_USE_ID); 338 FCHG_USE_ID);
358 return; 388 return;
359 case FCHG_STATE_PWR_PLUG_TIMER: 389 case FCHG_STATE_PWR_PLUG_TIMER:
360 case FCHG_STATE_READY_TO_CHARGE: 390 case FCHG_STATE_READY_TO_CHARGE:
361 case FCHG_STATE_READY_TO_RECHARGE: 391 case FCHG_STATE_READY_TO_RECHARGE:
362 case FCHG_STATE_I2V_CAL_1: 392 case FCHG_STATE_I2V_CAL_1:
393 case FCHG_STATE_RECHARGE_TIMER:
363 case FCHG_STATE_NO_CHARGING: 394 case FCHG_STATE_NO_CHARGING:
364 rvf_send_trace("Charger unplug", 14, NULL_PARAM, 395 rvf_send_trace("Charger unplug", 14, NULL_PARAM,
365 RV_TRACE_LEVEL_DEBUG_LOW, FCHG_USE_ID); 396 RV_TRACE_LEVEL_DEBUG_LOW, FCHG_USE_ID);
366 pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR; 397 pwr_ctrl->state = FCHG_STATE_NO_EXT_PWR;
367 return; 398 return;
398 } 429 }
399 /* FALL THRU */ 430 /* FALL THRU */
400 case FCHG_STATE_PWR_PLUG_TIMER: 431 case FCHG_STATE_PWR_PLUG_TIMER:
401 case FCHG_STATE_READY_TO_CHARGE: 432 case FCHG_STATE_READY_TO_CHARGE:
402 case FCHG_STATE_READY_TO_RECHARGE: 433 case FCHG_STATE_READY_TO_RECHARGE:
434 case FCHG_STATE_RECHARGE_TIMER:
403 rvf_send_trace("Starting charge on user request", 31, 435 rvf_send_trace("Starting charge on user request", 31,
404 NULL_PARAM, RV_TRACE_LEVEL_DEBUG_HIGH, 436 NULL_PARAM, RV_TRACE_LEVEL_DEBUG_HIGH,
405 FCHG_USE_ID); 437 FCHG_USE_ID);
406 pwr_ctrl->state = FCHG_STATE_I2V_CAL_1; 438 pwr_ctrl->state = FCHG_STATE_I2V_CAL_1;
407 return; 439 return;
429 return; 461 return;
430 case FCHG_STATE_PWR_PLUG_TIMER: 462 case FCHG_STATE_PWR_PLUG_TIMER:
431 case FCHG_STATE_READY_TO_CHARGE: 463 case FCHG_STATE_READY_TO_CHARGE:
432 case FCHG_STATE_READY_TO_RECHARGE: 464 case FCHG_STATE_READY_TO_RECHARGE:
433 case FCHG_STATE_I2V_CAL_1: 465 case FCHG_STATE_I2V_CAL_1:
466 case FCHG_STATE_RECHARGE_TIMER:
434 rvf_send_trace("Charging disabled by user request", 33, 467 rvf_send_trace("Charging disabled by user request", 33,
435 NULL_PARAM, RV_TRACE_LEVEL_DEBUG_HIGH, 468 NULL_PARAM, RV_TRACE_LEVEL_DEBUG_HIGH,
436 FCHG_USE_ID); 469 FCHG_USE_ID);
437 pwr_ctrl->state = FCHG_STATE_NO_CHARGING; 470 pwr_ctrl->state = FCHG_STATE_NO_CHARGING;
438 return; 471 return;