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) );
	}

}
Exemple #2
0
__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);
	}
}
Exemple #3
0
/* 功能:获取系统运行状态 
 * 参数: 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();
}
Exemple #4
0
/* 功能:获取系统运行状态 
 * 参数: 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");
		}
	}
}