凌欧通用FOC框架解析(4.电机状态机)

 

目录

 

一.电机状态机state_machine.c

(1). 启动标志位1,如果未则在等待和空闲状态来回切换


本文章用于个人学习使用,也是出于个人学习习惯,喜欢在过程中做记录方便后期查看,程序和视频教程在凌欧官网可以获取,希望咱们国产芯片越来越好,之后我也会持续更新这些文档,以及自己的使用心得


官网:南京凌鸥创芯电子有限公司

培训视频:培训视频-南京凌鸥创芯电子有限公司

一.电机状态机state_machine.c

void Sys_State_Machine(void)

  if (struFOC_CtrProc.bMC_RunFlg)//电机开始工作的标志位

void Sys_State_Machine(void)
{
    switch (struFOC_CtrProc.eSysState)
    {
    case IDLE:
    {
        /* 空闲状态 */

        if (struFOC_CtrProc.bMC_RunFlg)//电机开始工作的标志位
        {
            StateInit();
#if ((ROTOR_SENSOR_TYPE == ROTOR_SENSORLESS) && (HALL2SENSORLESS_ANGLE_VERIFY == TRUE))
            userApp.appFlag.hall2SensorlessFlag = HALLANGLE;
            userApp.hall2SensorlessWaitT = 0;
            userApp.sensorless2HallWaitT = 0;
#endif

#if ((ROTOR_SENSOR_TYPE == ROTOR_SENSORLESS) && (HALL2SENSORLESS_ANGLE_VERIFY == FALSE))
            struFOC_CtrProc.eSysState = CHARGE; /* 进入充电状态 */
#else
#if ((ROTOR_SENSOR_TYPE == ROTOR_HALL_SENSOR) || (HALL2SENSORLESS_ANGLE_VERIFY == TRUE))
            if (GET_HALL_LEARN_STATE())
            {
                /* 进入HALL自学习状态 */

                PWMOutputs(ENABLE);
                struFOC_CtrProc.eSysState = HALL_LEARN;
            }
            else
            {
                StateInit();
                PWMOutputs(ENABLE);
                struFOC_CtrProc.eSysState = HALL_RUN;   //有Hall运行
            }
#endif
#endif
        }
        break;
    }
    case CHARGE:
    {
        StateCharge();                         //预充电处理函数
        break;
    }
		case BEMF_CHECK:                          /*反电动势检测*/
    {
        StateBemfDirCheck();                  //反电势检测函数
        break;
    }		
    case DIR_CHECK:                           //顺逆风检测状态
    {
#if(CURRENT_SAMPLE_TYPE == CURRENT_SAMPLE_1SHUNT)
        struFOC_CtrProc.eSysState = POS_SEEK;
#else
        StateDirCheck();                      //顺逆风处理函数
#endif
        break;
    }
    case INIT:
    {
        /* 初始化状态 */

        StateInit();

        PWMOutputs(ENABLE);
        struFOC_CtrProc.eSysState = ALIGN;

        break;
    }
    case POS_SEEK:                            //初始位置检测状态
    {
        StatePosSeek();                       //初始位置检测处理函数

        struFOC_CtrProc.eSysState = INIT;

        break ;
    }
    case ALIGN:                                //预定位状态
    {
        StateAlign();                          //预定位处理函数

        break ;
    }
    case OPEN_RUN:                                //开环强拖状态
    {
        StateOpen();                              //开环处理函数
        break ;
    }
    case RUN:
    {
        /* 运行状态  */

        StateRun();                               //闭环处理函数
        break;
    }
    case HALL_RUN:
    {
        StateHallRun();
        break;
    }

    case HALL_LEARN:
    {
        if (GET_HALL_LEARN_STATE() == HALL_LEARN_FINISH)
        {
            PWMOutputs(DISABLE);

            SetTimeOut_Counter(struFOC_CtrProc.nSetTimeLeftCnt, STATE_MACHINE_200MS);
            struFOC_CtrProc.eSysState = WAIT;
        }
        break;
    }
    case BRAKE:
    {
        /* 电机刹车状态 */
        StateStop();                          //停止判定处理函数
        SetTimeOut_Counter(struFOC_CtrProc.nSetTimeLeftCnt, STATE_MACHINE_200MS);
        break;
    }
		case BEMF_BRAKE:  /* 反电势刹车处理*/
    {
        StateBemfStop();
        break;
    }
    case WAIT:
    {
        /* 等待状态 */
        if (SetTime_IsElapsed(struFOC_CtrProc.nSetTimeLeftCnt))
        {
            struFOC_CtrProc.eSysState = IDLE;
        }

        break;
    }
    case FAULT:
    {
        /* 故障状态 */
        StateFault();                         //故障处理函数

        if (stru_Faults.R == 0)
        {
            struFOC_CtrProc.eSysState = IDLE;
        }

        break;
    }
    default:
    {
        break;
    }
    }

    if ((struFOC_CtrProc.bMC_RunFlg == 0) && (stru_Faults.R == 0))  //无故障并且启动标志位清0,关闭输出,进入空闲状态
    {
        PWMOutputs(DISABLE);
        SetTimeOut_Counter(struFOC_CtrProc.nSetTimeLeftCnt, STATE_MACHINE_200MS);
        struFOC_CtrProc.eSysState = WAIT;
    }
}

(1). 启动标志位1,如果未则在等待和空闲状态来回切换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值