| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- #include <Myproject.h>
- MotStaType mcState;
- MotStaM McStaSet;
- /**
- @function Motor_Control_State
- @brief 电机控制状态机 负责状态跳转
- @date 2025-11-03
- */
- void Motor_Control_State(void)
- {
- // 故障直接跳转Fault
- if (mcFaultSource != FaultNoSource)
- { mcState = mcFault; }
- // 非Ready状态检测到关机信号跳转Stop
- else if ((isCtrlPowOn == false) && (mcState != mcReady))
- {
- // 若当前为Run 配置停机时间再跳转Stop
- if (mcState == mcRun)
- { mcFocCtrl.State_Count = 30000; }
-
- mcState = mcStop;
- }
-
- switch (mcState)
- {
- case mcReady:
- {
- if (McStaSet.SetFlag.CalibFlag == 0)
- {
- McStaSet.SetFlag.CalibFlag = 1;
- ClrBit(DRV_CR, FOCEN);
- MOE = 0;
- SetBit(ADC_MASK, CH1EN | CH0EN);
- mcCurOffset.OffsetCount = 0;
- mcCurOffset.OffsetFlag = 0; // 开始电流采集
- }
-
- if (mcCurOffset.OffsetFlag && isCtrlPowOn)
- {
- mcState = mcInit;
- ClrBit(DRV_CR, DRVEN);
- _nop_(); _nop_(); _nop_(); _nop_();
- SetBit(DRV_CR, DRVEN);
- }
-
- break;
- }
-
- case mcInit:
- {
- if ((mcFocCtrl.mcDcbusFlt > _Q15(Under_Protect_Voltage / HW_BOARD_VOLT_MAX)))
- {
- // 关闭软件电流采样的ADC FOC模块会自动调用相应ADC 无需外部使能
- ClrBit(ADC_MASK, CH1EN | CH0EN);
- mcFaultSource = 0;
- memset(&mcFaultDect, 0, sizeof(FaultVarible));
- memset(&mcFocCtrl, 0, sizeof(FOCCTRL));
- memset(&mcIimit, 0, sizeof(ILIMIT));
- mcFocCtrl.mcDcbus_chazhi = 32760;
- McStaSet.SetMode = 0;
- memset(&VoltageComp, 0, sizeof(VOLCOMP));
- HW_Zero_PI_Init();
- HW_One_PI_Init();
- #if (FiledWeakenCompEnable)
- memset(&mcFieldWeaken, 0, sizeof(FieldWeakeningTypeDef));
- #endif
- mcState = mcAlign;
- mcFocCtrl.State_Count = Align_Time;
- }
-
- break;
- }
-
- case mcCharge: // 预充电状态,MCU输出固定频率占空比,预充电结束后,跳入mcTailWind
- {
- Motor_Charge();
-
- if (mcFocCtrl.State_Count == 0)
- {
- MOE = 0; // 关闭输出
- mcState = mcAlign;
- mcFocCtrl.State_Count = Align_Time;
- }
-
- break;
- }
-
- case mcAlign: // 预定位时间结束后,直接启动; AlignTestMode=1用于初始位置检测调试用
- {
- Motor_Align();
- #if (AlignTestMode)
- {
- while (1);
- }
- #endif
- break;
- }
-
- case mcStart: // 配置电机启动参数,进入mcRun状态。
- {
- Motor_Open();
- break;
- }
-
- case mcRun: // 运行状态,若运行状态的给定变为0,进入mcStop状态。
- {
- break;
- }
-
- case mcStop:
- {
- #if (StopBrakeFlag == 0)
- {
- mcState = mcReady;
- FOC_CR1 = 0x00;
- ClrBit(DRV_CR, FOCEN); //关闭FOC
- MOE = 0;
- }
- #else
-
- if (motorControl.ActualSpeed < MOTOR_STOP_SPEED)
- {
- MOE = 0;
- FOC_CR1 = 0x00;
- ClrBit(DRV_CR, FOCEN);
- DRV_DR = DRV_ARR + 1;
- DRV_CMR = 0x00;
- DRV_CMR |= 0x015; // 三相下桥臂通,刹车
- ClrBit(DRV_CR, OCS); // OCS = 0, DRV_COMR;OCS = 1, FOC/SVPWM/SPWM
- MOE = 1;
- mcState = mcBrake;
- mcFocCtrl.State_Count = StopWaitTime;
- }
-
- #endif
- break;
- }
-
- case mcBrake:
- {
- if (isCtrlPowOn)
- {
- mcState = mcReady;
- mcFocCtrl.State_Count = 0; //单位:1ms 强制关机时间
- }
- else if (mcFocCtrl.State_Count == 0)
- {
- mcState = mcReady;
- MOE = 0;
- ClrBit(DRV_CR, FOCEN);
- }
-
- break;
- }
-
- case mcFault:
- {
- if (mcFaultSource == FaultNoSource)
- { mcState = mcReady;}
-
- break;
- }
-
- default:
- {
- mcState = mcReady;
- break;
- }
- }
- }
- /**
- @function Tick_Task
- @brief 周期任务
- @date 2025-11-03
- */
- void Tick_Task(void)
- {
- if ((mcState == mcStart) || (mcState == mcRun) || (mcState == mcStop))
- {
- mcFocCtrl.BEmf = LPF_Zero_Update(FOC__EMF, mcFocCtrl.BEmf, LPF_K(5.0));
- mcFocCtrl.Powerlpf = LPF_Zero_Update(FOC__POW, mcFocCtrl.Powerlpf, LPF_K(1.0));
- mcFocCtrl.IDQFlt = LPF_Zero_Update(mcCurVarible.Max_is, mcFocCtrl.IDQFlt, LPF_K(1.0));
- mcFocCtrl.UDFlt = LPF_Zero_Update(FOC__UD, mcFocCtrl.UDFlt, LPF_K(30.0)); //LPF_K(30.0)
- mcFocCtrl.UQFlt = LPF_Zero_Update(FOC__UQ, mcFocCtrl.UQFlt, LPF_K(30.0)); //LPF_K(30.0)
- motorControl.ActualSpeed = LPF_Zero_Update(FOC__EOME, motorControl.ActualSpeed, LPF_K(71.0));
-
- if (mcFocCtrl.Powerlpf <= 0)
- {mcFocCtrl.Powerlpf = 0;}
- }
- else
- {
- mcFocCtrl.IDQFlt = 0;
- mcFocCtrl.BEmf = 0;
- mcFocCtrl.Powerlpf = 0;
- motorControl.ActualSpeed = 0;
- }
-
- #if 0
- User_Dri_timer1ms(); //user控制1ms中断
- IsLimit_Over_tect(); //限流处理
- #if (Debugg==1)
- {
- PC_MONITOR_1MS(); //工具
- CMDMONI_WT_SENDCMD();
- }
- #endif
- #endif
- StarRampDealwith();
- }
|