FreeCalypso > hg > fc-magnetite
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; |