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