| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322 |
- /**
- * @copyright None
- * @file MotorControl.c
- * @author Comment Vivre
- * @date 2024-08-26
- * @brief 电机状态机切换
- */
- #include <MyProject.h>
- MotStateType data mcState;
- MotStaM McStaSet;
- /**
- @brief 电机控制状态机
- @warning 电机的状态只能在电机状态控制中切换,禁止在其他地方切换电机状态
- @date 2022-07-14
- */
- void FiniteStateManger(void)
- {
- // 故障下状态调整
- if (mcFaultSource != FaultNoSource)
- { mcState = mcFault; }
- // 关机命令下状态调整
- else if ((mcState == mcInit) || (mcState == mcCharge)
- || (mcState == mcTailWind) || (mcState == mcPosiCheck)
- || (mcState == mcAlign) || (mcState == mcStart))
- {
- if (isCtrlPowOn == false)
- { mcState = mcStop; }
- }
-
- // 状态机执行
- switch (mcState)
- {
- case mcReady:
- {
- Motor_Ready();
-
- if ((mcCurOffset.OffsetFlag == 1) && (isCtrlPowOn))
- {
- mcState = mcInit;
- mcCurOffset.OffsetFlag = 0;
- mcCurOffset.OffsetCount = 0; // 偏置电压采集计数
- }
-
- break;
- }
-
- case mcInit:
- {
- if (mcCurOffset.OffsetFlag == 1)
- {
- Motor_Init();
- #if (CHARGE_EN == Enable)
- {
- mcFocCtrl.State_Count = CHARGE_TIME;
- mcState = mcCharge; // 跳入mcCharge状态
- }
- #else
- {
- #if (TAILWIND_MODE == NoTailWind)
- {
- #if (ALIGN_MOME != ALIGN_DSIABLE)
- {
- mcFocCtrl.mcPosCheckAngle = Align_Angle;
- mcState = mcAlign;
- mcFocCtrl.State_Count = Align_Time;
- }
- #else
- mcState = mcStart;
- #endif
- }
- #else
- {
- mcFocCtrl.State_Count = TAILWIND_TIME; // 顺逆风判断时间
- mcState = mcTailWind;
- }
- #endif
- }
- #endif
- }
-
- break;
- }
-
- case mcCharge:
- {
- Motor_Charge();
- #if (IPMTEST == Enable)
- #else
-
- if (mcFocCtrl.State_Count == 0)
- {
- MOE = 0; // 关闭输出
- #if (TAILWIND_MODE == NoTailWind)
- {
- #if (ALIGN_MOME != ALIGN_DSIABLE)
- mcFocCtrl.mcPosCheckAngle = Align_Angle;
- mcState = mcAlign;
- mcFocCtrl.State_Count = Align_Time;
- #else
- mcState = mcStart;
- #endif
- }
- #else
- mcFocCtrl.State_Count = TAILWIND_TIME; // 顺逆风判断时间
- mcState = mcTailWind;
- #endif
- }
-
- #endif
- break;
- }
-
- #if (TAILWIND_MODE != NoTailWind)
-
- case mcTailWind:
- {
- Motor_TailWind();
- break;
- }
-
- #endif
- #if (ALIGN_MOME != ALIGN_DSIABLE)
-
- case mcAlign:
- {
- Motor_Align();
- #if (ALIGN_MOME == ALIGN_TEST)
-
- while (1) ;
-
- #else
- {
- if (mcFocCtrl.State_Count == 0)
- { mcState = mcStart; }
- }
- #endif
- break;
- }
-
- #endif
-
- case mcStart:
- {
- if (mcFocCtrl.Start_Mode == TAILWIND_START) // 顺风启动
- {
- #if (TAILWIND_MODE == BEMFMethod)
- mcState = mcRun;
- #elif (TAILWIND_MODE == RSDMethod)
- mcState = mcRun;
- #elif (TAILWIND_MODE == FOCMethod)
- {
- Motor_FocTailWind_Open();
- mcState = mcRun;
- }
- #endif
- }
- else if (mcFocCtrl.Start_Mode == HEADWIND_START) // 逆风启动
- {
- if (mcFocCtrl.State_Count > 0) // 逆风启动刹车过程
- {
- // 配置刹车代码
- MC_Break();
- }
- else
- {
- mcFocCtrl.State_Count = 200; // 顺逆风判断时间
- mcState = mcReady; // 刹车结束 切回顺逆风检测
- }
- }
- else // 静止启动
- {
- Motor_Static_Open();
- mcState = mcRun;
- }
-
- break;
- }
-
- case mcRun:
- {
- if (isCtrlPowOn == false)
- {
- mcState = mcStop;
- mcFocCtrl.State_Count = 5; // 单位:1ms
- }
-
- break;
- }
-
- case mcStop:
- {
- MC_Stop();
- break;
- }
-
- case mcBrake:
- {
- if (mcFocCtrl.State_Count == 0)
- {
- fault.Voltage.VoltDetecBraketDuty = 0;
- fault.Voltage.FlagBrakeInit = 0;
- MOE = 0;
- DRV_OUT = 0x00;
- ClrBit(DRV_CR, FOCEN);
- mcState = mcReady;
- mcFocCtrl.State_Count = 10;
- }
-
- break;
- }
-
- case mcFault:
- {
- // 欠压保护刹车处理函数
- if (mcFaultSource == FaultUnderVoltageDC)
- { UnderProcess(); }
- else
- {
- MOE = 0;
- ClrBit(DRV_CR, FOCEN); // 关闭FOC
-
- if (mcFaultSource == FaultNoSource)
- { mcState = mcReady; }
- }
-
- break;
- }
-
- default:
- {
- mcState = mcReady;
- break;
- }
- }
- }
- /**
- @brief 默认1ms周期服务函数,运行信号采样,调速信号处理,闭环控制,故障检测,ATO爬坡函数
- 该函数运行于大循环中,由SYSTICK定时器间隔1ms触发运行。
- @date 2022-07-14
- */
- void TickCycle(void)
- {
- #if (VoltageCompensationEn == 1)
- {
- if (VoltageComp.cpscnt <= VoltageCompensationDelayCnt)
- { SetBit(ADC_CR, ADCBSY);}
- }
- #else
- // 使能ADC的DCBUS采样
- SetBit(ADC_CR, ADCBSY);
- #endif
-
- if ((mcState != mcInit) && (mcState != mcReady))
- {
- // 速度滤波
- mcFocCtrl.SpeedFlt = LPFFunction(FOC__EOME, mcFocCtrl.SpeedFlt, 50); // 注意低通滤波器系数范围为0---127
- mcFocCtrl.EMFsquare = Sqrt_alpbet(FOC__EALP, FOC__EBET);
- mcFocCtrl.Is = Sqrt_alpbet(FOC__IA, FOC__IBET);
-
- if (mcState == mcRun)
- { mcFocCtrl.Power = LPFFunction(FOC__POW << 2, mcFocCtrl.Power, 50); }
-
- mcFocCtrl.UqFlt = LPFFunction(FOC__UQ, mcFocCtrl.UqFlt, 50);
- mcFocCtrl.UdFlt = LPFFunction(FOC__UD, mcFocCtrl.UdFlt, 50);
- }
- else
- {
- mcFocCtrl.SpeedFlt = 0;
- mcFocCtrl.EMFsquare = 0;
- mcFocCtrl.Is = 0;
- mcFocCtrl.UqFlt = 0;
- mcFocCtrl.Power = 0;
- mcFocCtrl.UdFlt = 0;
- }
-
- // DCbus的采样获取值并滤波
- #if (VoltageCompensationEn == 1)
- {
- // 未进入电压补偿之前在1ms中断里面采集电压,进入之后在载波中断里面采集电压
- if (VoltageComp.cpscnt <= VoltageCompensationDelayCnt)
- { mcFocCtrl.mcDcbusFlt = LPFFunction(ADC2_DR, mcFocCtrl.mcDcbusFlt, 50); }
-
- if ((mcFocCtrl.CtrlMode == 1) && (mcState == mcRun) && (mcFaultSource == FaultNoSource)) // 进入速度环后进行延时计数
- {
- if (VoltageComp.cpscnt < VoltageCompensationDelayCnt + 10)
- { VoltageComp.cpscnt++; }
- else
- { VoltageComp.cpscnt = VoltageCompensationDelayCnt + 10; }
- }
- else
- { VoltageComp.cpscnt = 0; }
-
- // 母线电压平均值
- BusAverageVoltage();
- }
- #else
- mcFocCtrl.mcDcbusFlt = LPFFunction(ADC2_DR, mcFocCtrl.mcDcbusFlt, 50); // 母线电压值滤波
- #endif
- mcFocCtrl.NTCValue = LPFFunction(ADC8_DR, mcFocCtrl.NTCValue, 100);
- mcFocCtrl.SREFValue = LPFFunction(ADC9_DR, mcFocCtrl.SREFValue, 100);
- // 获取调速信号,不同调速模式(PWMMODE,NONEMODE,SREFMODE)的目标值修改
- GetTargetRef();
-
- // 启动ATO控制,环路响应,如速度环、转矩环、功率环等
- if ((mcState == mcRun) || (mcState == mcStop))
- { LoopResponse(); }
-
- //故障保护函数功能,如过欠压保护、启动保护、缺相、堵转等
- Fault_Detection();
-
- // 电机启动ATO爬坡函数处理
- if (mcState == mcRun)
- { ATORamp(); }
-
- // 电机状态机的时序处理
- if (mcFocCtrl.State_Count > 0)
- { mcFocCtrl.State_Count--; }
- }
|