DSP

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

2019-07-13 10:36发布

什么是状态机,状态机就是状态转移图,我们把系统表现的行为,描述成几种状态,系统的行为就是在几种状态中相互转移,而状态转移需要触发条件。比如人有三个状态:健康,生病,恢复。触发条件有:受凉、吃药、休息等。 为什么需要状态机呢,笔者个人认为第一点应该是基于安全考虑,确保系统的状态能够被用户明确知道,第二点,是状态机,能够根据用户的指令,代替用户完成繁琐的操作,这是因为状态机能够根据触发条件自行判断、操作,比如并网,用户可以直接给状态机输入一个指令,然后状态机就会自动控制接触器动作,PWM动作等,让整个逆变器在安全情况下,并入电网。 对于一般的逆变器的状态机可以分为测试模式,正常模式。 测试模式逆变器的状态:故障状态、复位状态、准备就绪状态。 正常模式逆变器的状态:故障状态、复位状态、准备就绪状态、预充电状态、运行状态。 触发条件:交流接触器状态、预充电接触器状态、系统故障字、系统复位字、直流电压采集值、用户给定的指令。 整个逆变器的状态机可以用下面的框图表示:     从框图来看状态机,还是比较容易理解的,但具体落实到代码上,如何实现。其实代码可以分为这个三个部分:输入、处理、输出。输入即是状态机的触发条件,处理即是系统状态转移的过程,输出即是系统的动作
  • 输入:
我们可以用一个函数来实现状态机的触发条件。 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,系统模式切换指令。由多个函数实现这些功能,这里就不依次列举了。