Ti的C28x系列的DSP(28069)(28377D)使用经验,逆变器的状态机使用经验

什么是状态机,状态机就是状态转移图,我们把系统表现的行为,描述成几种状态,系统的行为就是在几种状态中相互转移,而状态转移需要触发条件。比如人有三个状态:健康,生病,恢复。触发条件有:受凉、吃药、休息等。

为什么需要状态机呢,笔者个人认为第一点应该是基于安全考虑,确保系统的状态能够被用户明确知道,第二点,是状态机,能够根据用户的指令,代替用户完成繁琐的操作,这是因为状态机能够根据触发条件自行判断、操作,比如并网,用户可以直接给状态机输入一个指令,然后状态机就会自动控制接触器动作,PWM动作等,让整个逆变器在安全情况下,并入电网。

对于一般的逆变器的状态机可以分为测试模式,正常模式。

测试模式逆变器的状态:故障状态、复位状态、准备就绪状态。

正常模式逆变器的状态:故障状态、复位状态、准备就绪状态、预充电状态、运行状态。

触发条件:交流接触器状态、预充电接触器状态、系统故障字、系统复位字、直流电压采集值、用户给定的指令。

整个逆变器的状态机可以用下面的框图表示:

 

Ti的C28x系列的DSP(28069)(28377D)使用经验,逆变器的状态机使用经验_第1张图片

 

从框图来看状态机,还是比较容易理解的,但具体落实到代码上,如何实现。其实代码可以分为这个三个部分:输入、处理、输出。输入即是状态机的触发条件,处理即是系统状态转移的过程,输出即是系统的动作

Ti的C28x系列的DSP(28069)(28377D)使用经验,逆变器的状态机使用经验_第2张图片

  • 输入:

我们可以用一个函数来实现状态机的触发条件。

void StateMachine_Input(StMaInput *K)
{

	if( DiHandle.bit.DI4 != 0) //交流接触器
	{
		K->bit.AcBreakerSt = 1;
	}
	else
	{
		K->bit.AcBreakerSt = 0;

	}

	if(DiHandle.bit.DI6 != 0)//预充电接触器
	{
		K->bit.ChargeSwitchSt = 1;
	}
	else
	{
		K->bit.ChargeSwitchSt = 0;

	}


	if( SysFaultReg.all != 0) //系统故障字
	{
		K->bit.SysFault = 1;
	}
	else
	{
		K->bit.SysFault = 0;

	}

	if(SystemReset != 0) //系统复位字
	{
		K->bit.SysReset = 1;
	}
	else
	{
		K->bit.SysReset = 0;

	}

	if(AdcFilter.Udc > UdcChargeValue)  //直流电压采样值
	{
		K->bit.ChargeFinishFlag = 1;
	}
}

用户指令,单独用个函数实现,因为这是用户设定当前系统的模式,高于一般的状态机触发条件。

void StateMachine_UserOrder( void )
{
	Uint16 StopOrder;


	if(gvar[cpu1_group8_14].Typ.ul != 0)  //急停与关机按钮屏蔽
	{
		StopOrder = 0;
	}
	else
	{
		if((DiHandle.bit.DI8 != 0) || (DiHandle.bit.DI3 == 0)) //停机按钮或者急停时,关机
			{
				StopOrder = 1;
			}
			else
			{
				StopOrder = 0;
			}
	}


	if( StopOrder != 0)
	{

		gvar[cpu1_group4_2].Typ.ul = 1; //停机命令

		StM.UiStamp = Hvdc_UI_STOP;//停机命令

	}
	else
	{
		switch(gvar[cpu1_group4_2].Typ.ul)  //在系统硬件无异常情况下,用户输入指令
		{
			case 0:;
			break;
			case 1:
			{
				StM.UiStamp = Hvdc_UI_STOP;//停机命令


			}
			break;
			case 2:
			{
				StM.UiStamp = Hvdc_UI_RUN; //运行命令


			}
			break;
			case 3:
			{
				StM.UiStamp = Hvdc_UI_Test;   //测试命令


			}
			break;
			default:
			gvar[cpu1_group4_2].Typ.ul = 1;      //命令异常
			break;
			}

	}


}
  • 处理:

笔者将系统的每个状态,用一个函数表示。在这些函数中,状态机自行按照触发条件,控制接触器动作、PWM动作。

void StateMachine_Manage(HvdcConsole *V)
{
	    StateMachine_Input( &V->Input); //触发条件输入

        switch(V->MainState)
		{
		 case HVDC_Fault_St:          //故障状态
		 StateMachine_FaultHandle(V);
		 break;
		 case HVDC_Reset_St:          //复位状态
		 StateMachine_ResetHandle(V);
		 break;
		 case HVDC_NormalRun_St:       //正常运行状态
		 StateMachine_NormalRunHandle(V);
		 break;
		 case HVDC_Ready_ST:          //准备就绪待机状态
		 StateMachine_ReadyHandle(V);
		 break;
		 case HVDC_Charge_ST:           //预充电状态
		 StateMachine_ChargeHandle(V);
		 break;
		 default:
		 V->MainNextState= HVDC_Fault_St; //状态机模式切换异常
		 StateMachine_FaultHandle(V);
		 break;
		 }

}
  • 输出

状态机的输出,即是系统发生的动作,这些动作比较多,比如开或关接触器,释放或闭锁PWM,系统模式切换指令。由多个函数实现这些功能,这里就不依次列举了。

 

你可能感兴趣的:(DSP使用经验)