int get_soc (void) { float upper_voltage = 14.7f; float duty_cycle; if (cc_state == FULLY_CHARGED) return 100; else if (cc_state == PULSED_CURRENT) return 90; else if (cc_state == VOLTAGE_SETTLE) return 80; else { batt_voltage = get_adc_voltage(ADC_BATT_V); set_temperature_compensation( get_adc_voltage(ADC_TEMP), &upper_voltage, &duty_cycle ); set_current_compensation(BATTERY_AHR*0.1f, batt_current, &upper_voltage ); //Linear appoximation return (int)( 80.0f*(batt_voltage - v_lvdc) / (upper_voltage - v_lvdc) ); } }
__task void adc_test(void) { float sol_v, sol_i, batt_v, batt_i, temp; init_pwm(40000); init_adc(); set_duty_cycle(82); while (1) { sol_v = get_adc_voltage(ADC_SOL_V); sol_i = get_adc_voltage(ADC_SOL_I); batt_v = get_adc_voltage(ADC_BATT_V); batt_i = get_adc_voltage(ADC_BATT_I); temp = get_adc_voltage(ADC_TEMP); TRACE_INFO("6,%f,%f,%f,%f,%f\n", sol_v, sol_i, batt_v, batt_i, temp ); os_dly_wait(100); } }
/* 功能:获取系统运行状态 * 参数: pskb网络数据指针 * 返回值:无 * */ void get_machine_stat(char *pskb) { struct CheckMachineStat *pBoardStat = (struct CheckMachineStat*)pskb; /* 填充消息结构*/ pBoardStat->CheckMachineStatMsg.MsgId = ARM_PC_CHECK_MACHINE_STAT_RSP; pBoardStat->CheckMachineStatMsg.MsgLen = sizeof(*pBoardStat) - sizeof(pBoardStat->CheckMachineStatMsg); pBoardStat->MachineStat = 1; pBoardStat->TempData = get_ds18b20_temperature(); pBoardStat->Voltage = get_adc_voltage(); pBoardStat->CpuFreq = get_cpu_freq(); pBoardStat->FreeMemSpace = get_freemem_space(); pBoardStat->FreeDiskSpace = get_freedisk_space(); }
/* 功能:获取系统运行状态 * 参数: MCM请求消息 * 返回值:无 * */ void get_machine_info_req(s8 *pskb) { struct stru_machine_info_req *prMachineInfoReq = (struct stru_machine_info_req *)pskb; struct stru_machine_info_rsp rMachineInfoRsp; memset(&rMachineInfoRsp, 0, sizeof(rMachineInfoRsp)); /* 构造反馈消息*/ rMachineInfoRsp.struMsgHeader.u16MsgType = O_MAINMCM_MACHINE_INFO_QUERY_RSP; rMachineInfoRsp.struMsgHeader.u16MsgLength = sizeof(rMachineInfoRsp) - sizeof(rMachineInfoRsp.struMsgHeader); rMachineInfoRsp.struMsgHeader.u8TransType = prMachineInfoReq->struMsgHeader.u8TransType; get_ds18b20_temperature(&rMachineInfoRsp.f32Temp); get_adc_voltage(&rMachineInfoRsp.f32Vol); get_cpu_freq(&rMachineInfoRsp.f32CpuFreq); get_freemem_space(&rMachineInfoRsp.u32FreeMem); get_freedisk_space(&rMachineInfoRsp.u32FreeDisk); /* 反馈消息到MCM*/ send_rsp_message(&rMachineInfoRsp, sizeof(rMachineInfoRsp), prMachineInfoReq->struMsgHeader.u8TransType); }
__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"); } } }