__task void interrupted_charging (void) { float sol_voltage = 0.0f, sol_current = 0.0f, sol_power = 0.0f; int pulse = 0; int counter = 0; //TODO: initialise hardware init_pwm(40000); init_adc(); set_mppt(); while (1) { batt_voltage = get_adc_voltage(ADC_BATT_V); batt_current = get_adc_voltage(ADC_BATT_I); sol_voltage = get_adc_voltage(ADC_SOL_V); sol_current = get_adc_voltage(ADC_SOL_I); sol_power = sol_voltage * sol_current; temp = get_adc_voltage(ADC_TEMP); set_temperature_compensation( temp, &v_high, &pulse_duty ); TRACE_INFO("1,%.0f,%i,%.2f,%.2f,%.2f,%.3f,%.1f,%.2F\n", ((double)get_time_t()), cc_state, batt_voltage, batt_current, sol_voltage, sol_current, duty_cycle, temp); //Check for LVDC voltage calc_lvdc(batt_current); if ( batt_voltage < v_lvdc ) { //Turn off outputs and screen. //send os event to turn off os_evt_set( UI_LVDC, ui_t ); } switch (cc_state) { case BULK_CHARGING: //Start charging battery with 0.1C current or as high as possible if 0.1C cannot be met perturb_and_observe_cc_itter(BATTERY_AHR*0.1f); if (++counter > 10) set_current_compensation(BATTERY_AHR*0.1f, batt_current, &v_high); if (sol_power < P_NIGHT_MODE) { if (set_mppt() < (P_NIGHT_MODE*1.2)) { cc_state = NIGHT_MODE; counter = 0; TRACE_DEBUG("Starting Night Mode State\n"); break; } TRACE_DEBUG("Rescaned Power and Night mode not entered \n"); } if (batt_voltage > v_high) { cc_state = VOLTAGE_SETTLE; counter = 0; TRACE_DEBUG("Starting Voltage Settle Charging State at V=%f \n", batt_voltage); break; } os_dly_wait( P_AND_O_PERIOD ); break; case VOLTAGE_SETTLE: //Diable the MPPT Charging Circuit GPIO_ResetBits(GPIOB, GPIO_Pin_0); if (batt_voltage < v_low) { GPIO_SetBits(GPIOB, GPIO_Pin_0); cc_state = PULSED_CURRENT; TRACE_DEBUG("Starting Pulsed Current Charging State at V=%f \n", batt_voltage); break; } //5s delay os_dly_wait(50); break; case PULSED_CURRENT: counter++; if (pulse) { //If greater than high period seconds, pulse is low. i.e sets up x% duty cycle if ( counter > (300 * pulse_duty) ) pulse = 0; //Enable MPPT hardware GPIO_SetBits(GPIOB, GPIO_Pin_0); //Run p&o itteration perturb_and_observe_cc_itter(BATTERY_AHR*0.05f); if ( counter > 10 ) { //set_current_compensation(BATTERY_AHR*0.05f, batt_current); if (sol_power < P_NIGHT_MODE) { if (set_mppt() < (P_NIGHT_MODE*1.2)) { cc_state = NIGHT_MODE; counter = 0; TRACE_DEBUG("Starting Night Mode State\n"); break; } TRACE_DEBUG("Rescaned Power and Night mode not entered \n"); } } } else { //If greater than 30s, reset. if ( counter > 300) { counter = 0; pulse = 1; } //Diable the MPPT Charging Circuit GPIO_ResetBits(GPIOB, GPIO_Pin_0); } if (batt_voltage > v_high) { counter = 0; cc_state = FULLY_CHARGED; TRACE_DEBUG("Starting Fully Charged Charging State at V=%f \n", batt_voltage); break; } //100ms delay os_dly_wait(10); break; case FULLY_CHARGED: //Regulate so that Battery current = 0 //This means that the battery is no longer charged //But the panel is used to power any connected load //Diable the MPPT Charging Circuit GPIO_ResetBits(GPIOB, GPIO_Pin_0); //Check when to start recharging again. if (batt_voltage < v_restart) { cc_state = BULK_CHARGING; TRACE_DEBUG("Restarting the Bulk Charging State \n"); break; } //5s delay os_dly_wait(500); break; case NIGHT_MODE: //Check every 5 minutes //Counter used so that LVDC is still //checked every 5 seconds if (++counter > 2) { //Enable MPPT Circuit GPIO_SetBits(GPIOB, GPIO_Pin_0); if (set_mppt() > (P_NIGHT_MODE*1.2)) { cc_state = BULK_CHARGING; TRACE_DEBUG("Exiting Night Mode\n"); break; } //Diable the MPPT Charging Circuit //GPIO_ResetBits(GPIOB, GPIO_Pin_0); set_duty_cycle(100); counter = 0; } //5 second wait time os_dly_wait(500); break; default: cc_state = BULK_CHARGING; TRACE_ERROR("Charging State machine entered Unknown State. Restarting with Bulk Charging \n"); } } }
// Disable debug on target void main_disable_debug_event(void) { os_evt_set(FLAGS_MAIN_DISABLEDEBUG, main_task_id); return; }
void GUI_X_SignalEvent(void) { if (GUI_Task) { os_evt_set (0x0001, GUI_Task); } }
// Power down the interface void main_powerdown_event(void) { os_evt_set(FLAGS_MAIN_POWERDOWN, main_task_id); return; }