2060|1

1140

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

Ti的C28x系列的DSP(28069)(28377D)使用经验,逆变器的状态机使用经验 [复制链接]

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


为什么需要状态机呢,笔者个人认为第一点应该是基于安全考虑,确保系统的状态能够被用户明确知道,第二点,是状态机,能够根据用户的指令,代替用户完成繁琐的操作,这是因为状态机能够根据触发条件自行判断、操作,比如并网,用户可以直接给状态机输入一个指令,然后状态机就会自动控制接触器动作,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,系统模式切换指令。由多个函数实现这些功能,这里就不依次列举了。
---------------------

最新回复

如果能够结合你的例子,详细说一下思路就更好  详情 回复 发表于 2018-12-25 08:51
点赞 关注
 

回复
举报

6366

帖子

4917

TA的资源

版主

沙发
 
如果能够结合你的例子,详细说一下思路就更好
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表