|
@@ -130,9 +130,9 @@ void PWMDutyCal(void)
|
|
|
void VSPSample(void)
|
|
void VSPSample(void)
|
|
|
{
|
|
{
|
|
|
static int16 VSP = 0;
|
|
static int16 VSP = 0;
|
|
|
-
|
|
|
|
|
VSP = LPFFunction(ADC7_DR, VSP, 10); // 注意低通滤波器系数范围为0---127
|
|
VSP = LPFFunction(ADC7_DR, VSP, 10); // 注意低通滤波器系数范围为0---127
|
|
|
- if (VSP > ONPWMDuty)
|
|
|
|
|
|
|
+
|
|
|
|
|
+ if (VSP > ONPWMDuty)
|
|
|
{
|
|
{
|
|
|
isCtrlPowOn = 1; // 开机
|
|
isCtrlPowOn = 1; // 开机
|
|
|
}
|
|
}
|
|
@@ -167,6 +167,73 @@ void VSPSample(void)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * @function GetSrefKeyGear
|
|
|
|
|
+ * @brief 根据电压挡位确定输出
|
|
|
|
|
+ * @param[in] None
|
|
|
|
|
+ * @return None
|
|
|
|
|
+ * @date 2024-08-28
|
|
|
|
|
+*/
|
|
|
|
|
+void GetSrefKeyGear(void)
|
|
|
|
|
+{
|
|
|
|
|
+ static uint8 powONHoldCnt = 0;
|
|
|
|
|
+ static uint8 powOFFHoldCnt = 0;
|
|
|
|
|
+
|
|
|
|
|
+ if (isCtrlPowOn) // 开机状态
|
|
|
|
|
+ {
|
|
|
|
|
+ if (mcFocCtrl.SREFValue < VSP_OFF_MIN)
|
|
|
|
|
+ {
|
|
|
|
|
+ powOFFHoldCnt ++;
|
|
|
|
|
+
|
|
|
|
|
+ if (powOFFHoldCnt > 50)
|
|
|
|
|
+ {
|
|
|
|
|
+ powOFFHoldCnt = 0;
|
|
|
|
|
+ isCtrlPowOn = false; // 关机
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ powONHoldCnt = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else // 关机状态
|
|
|
|
|
+ {
|
|
|
|
|
+ if (mcFocCtrl.SREFValue > VSP_ON_MIN)
|
|
|
|
|
+ {
|
|
|
|
|
+ powONHoldCnt ++;
|
|
|
|
|
+
|
|
|
|
|
+ if (powONHoldCnt > 50)
|
|
|
|
|
+ {
|
|
|
|
|
+ powONHoldCnt = 0;
|
|
|
|
|
+ isCtrlPowOn = true; // 开机
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ powOFFHoldCnt = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //转速曲线计算
|
|
|
|
|
+ if (isCtrlPowOn)
|
|
|
|
|
+ {
|
|
|
|
|
+ // 计算公式为
|
|
|
|
|
+ // Ref = ( 区间UQ差 / 区间调速电压差) * (VSP - 调速下限) + 区间最小UQ值
|
|
|
|
|
+ if (mcFocCtrl.SREFValue <= 1408)
|
|
|
|
|
+ { mcFocCtrl.Ref = _Q15(0.120); }
|
|
|
|
|
+ else if (mcFocCtrl.SREFValue <= 11640 )
|
|
|
|
|
+ { mcFocCtrl.Ref = 0.864 * (mcFocCtrl.SREFValue - 1408) + _Q15(0.120); }
|
|
|
|
|
+ else if (mcFocCtrl.SREFValue <= 15530 )
|
|
|
|
|
+ { mcFocCtrl.Ref = 1.238 * (mcFocCtrl.SREFValue - 11640) + _Q15(0.390); }
|
|
|
|
|
+ else if (mcFocCtrl.SREFValue <= 19480 )
|
|
|
|
|
+ { mcFocCtrl.Ref = 1.543 * (mcFocCtrl.SREFValue - 15530) + _Q15(0.537); }
|
|
|
|
|
+ else if (mcFocCtrl.SREFValue <= 21962 )
|
|
|
|
|
+ { mcFocCtrl.Ref = 1.755 * (mcFocCtrl.SREFValue - 19480) + _Q15(0.723); }
|
|
|
|
|
+ else if (mcFocCtrl.SREFValue <= 23368 )
|
|
|
|
|
+ { mcFocCtrl.Ref = 2.004 * (mcFocCtrl.SREFValue - 21962) + _Q15(0.856); }
|
|
|
|
|
+ else
|
|
|
|
|
+ { mcFocCtrl.Ref = _Q15(0.942); }
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ { mcFocCtrl.Ref = 0; }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
@brief 启停测试工具,用于测试启动可靠性
|
|
@brief 启停测试工具,用于测试启动可靠性
|
|
|
@date 2022-07-14
|
|
@date 2022-07-14
|
|
@@ -209,7 +276,7 @@ void ONOFF_Test(void)
|
|
|
@brief 调速信号处理包含:开关机控制、将调速信号处理成控制目标给定信号
|
|
@brief 调速信号处理包含:开关机控制、将调速信号处理成控制目标给定信号
|
|
|
@date 2022-07-14
|
|
@date 2022-07-14
|
|
|
*/
|
|
*/
|
|
|
-void TargetRef_Process(void)
|
|
|
|
|
|
|
+void GetTargetRef(void)
|
|
|
{
|
|
{
|
|
|
#if (SPEED_MODE == PWMMODE)
|
|
#if (SPEED_MODE == PWMMODE)
|
|
|
{
|
|
{
|
|
@@ -221,11 +288,16 @@ void TargetRef_Process(void)
|
|
|
VSPSample();
|
|
VSPSample();
|
|
|
mcFocCtrl.PowerLimitValue = POWERLPFLIMIT;
|
|
mcFocCtrl.PowerLimitValue = POWERLPFLIMIT;
|
|
|
}
|
|
}
|
|
|
|
|
+ #elif (SPEED_MODE == SREFKEYMODE)
|
|
|
|
|
+ {
|
|
|
|
|
+ GetSrefKeyGear();
|
|
|
|
|
+ mcFocCtrl.PowerLimitValue = POWERLPFLIMIT;
|
|
|
|
|
+ }
|
|
|
#elif (SPEED_MODE == NONEMODE)
|
|
#elif (SPEED_MODE == NONEMODE)
|
|
|
{
|
|
{
|
|
|
|
|
+ isCtrlPowOn = true;
|
|
|
|
|
+ mcFocCtrl.Ref = NONE_MODE_SPEED;
|
|
|
mcFocCtrl.PowerLimitValue = POWERLPFLIMIT;
|
|
mcFocCtrl.PowerLimitValue = POWERLPFLIMIT;
|
|
|
- isCtrlPowOn = 1; // 开机
|
|
|
|
|
- mcFocCtrl.Ref = S_Value(1650);
|
|
|
|
|
}
|
|
}
|
|
|
#elif (SPEED_MODE == ONOFFTEST)
|
|
#elif (SPEED_MODE == ONOFFTEST)
|
|
|
{
|
|
{
|
|
@@ -239,7 +311,7 @@ void TargetRef_Process(void)
|
|
|
建议使用默认1ms周期运行
|
|
建议使用默认1ms周期运行
|
|
|
@date 2022-07-14
|
|
@date 2022-07-14
|
|
|
*/
|
|
*/
|
|
|
-void Speed_response(void)
|
|
|
|
|
|
|
+void LoopResponse(void)
|
|
|
{
|
|
{
|
|
|
static int16 refRampOut = 0;
|
|
static int16 refRampOut = 0;
|
|
|
|
|
|
|
@@ -262,12 +334,14 @@ void Speed_response(void)
|
|
|
// FOC_THECOMP = _Q15(-25.0 / 180.0); // SMO 估算补偿角
|
|
// FOC_THECOMP = _Q15(-25.0 / 180.0); // SMO 估算补偿角
|
|
|
// 启动电流环与外环给定衔接
|
|
// 启动电流环与外环给定衔接
|
|
|
#if (MOTOR_CTRL_MODE == SPEED_LOOP_CONTROL)
|
|
#if (MOTOR_CTRL_MODE == SPEED_LOOP_CONTROL)
|
|
|
- mcRefRamp.OutValue_float = mcFocCtrl.SpeedFlt;
|
|
|
|
|
- #elif (MOTOR_CTRL_MODE == POWER_LOOP_CONTROL)
|
|
|
|
|
- mcRefRamp.OutValue_float = mcFocCtrl.PowerFlt;
|
|
|
|
|
- #elif (MOTOR_CTRL_MODE == UQ_LOOP_CONTROL)
|
|
|
|
|
- mcRefRamp.OutValue_float = mcFocCtrl.UqFlt;
|
|
|
|
|
- #endif
|
|
|
|
|
|
|
+ mcRefRamp.OutValue_float = mcFocCtrl.SpeedFlt;
|
|
|
|
|
+ #elif (MOTOR_CTRL_MODE == POWER_LOOP_CONTROL)
|
|
|
|
|
+ mcRefRamp.OutValue_float = mcFocCtrl.Power;
|
|
|
|
|
+ #elif (MOTOR_CTRL_MODE == UQ_LOOP_CONTROL)
|
|
|
|
|
+ mcRefRamp.OutValue_float = mcFocCtrl.UqFlt;
|
|
|
|
|
+ #elif (MOTOR_CTRL_MODE == UQ_POWER_CONTROL)
|
|
|
|
|
+ mcRefRamp.OutValue_float = mcFocCtrl.UqFlt;
|
|
|
|
|
+ #endif
|
|
|
mcFocCtrl.LoopTime = LOOP_TIME;
|
|
mcFocCtrl.LoopTime = LOOP_TIME;
|
|
|
mcRefRamp.IncValue = RAMP_INC;
|
|
mcRefRamp.IncValue = RAMP_INC;
|
|
|
mcRefRamp.DecValue = RAMP_DEC;
|
|
mcRefRamp.DecValue = RAMP_DEC;
|
|
@@ -275,23 +349,24 @@ void Speed_response(void)
|
|
|
FOC_IDREF = ID_RUN_CURRENT; // D轴启动电流
|
|
FOC_IDREF = ID_RUN_CURRENT; // D轴启动电流
|
|
|
PI1_UKH = mcFocCtrl.IqRef;
|
|
PI1_UKH = mcFocCtrl.IqRef;
|
|
|
PI2_Init(); // PI初始化
|
|
PI2_Init(); // PI初始化
|
|
|
|
|
+ // 弱磁
|
|
|
#if (MotorFiledWeakenEn)
|
|
#if (MotorFiledWeakenEn)
|
|
|
- {
|
|
|
|
|
- FiledWeakenInit();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ FiledWeakenInit();
|
|
|
#endif
|
|
#endif
|
|
|
|
|
+ // 电压补偿
|
|
|
VoltageComp.Undervoltage_flag = 0;
|
|
VoltageComp.Undervoltage_flag = 0;
|
|
|
- VoltageComp.IncVoltage = _Q15(40.0 / HW_BOARD_VOLT_MAX);
|
|
|
|
|
- VoltageComp.LineAngel = LinearCompensationAngel;
|
|
|
|
|
|
|
+ VoltageComp.IncVoltage = _Q15(40.0 / HW_BOARD_VOLT_MAX);
|
|
|
|
|
+ VoltageComp.LineAngel = LinearCompensationAngel;
|
|
|
VoltageComp.LineAngelMax = LinearCompensationAngel_MAX;
|
|
VoltageComp.LineAngelMax = LinearCompensationAngel_MAX;
|
|
|
VoltageComp.LineAngelMin = LinearCompensationAngel_MIN;
|
|
VoltageComp.LineAngelMin = LinearCompensationAngel_MIN;
|
|
|
- VoltageComp.VCDelayCnt = VoltageCompensationDelayCnt;
|
|
|
|
|
|
|
+ VoltageComp.VCDelayCnt = VoltageCompensationDelayCnt;
|
|
|
mcFocCtrl.CtrlMode = 1;
|
|
mcFocCtrl.CtrlMode = 1;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{ mcFocCtrl.Mode0HoldCnt = 0; }
|
|
{ mcFocCtrl.Mode0HoldCnt = 0; }
|
|
|
- break;
|
|
|
|
|
|
|
+
|
|
|
|
|
+ break;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
case 1:
|
|
case 1:
|
|
@@ -310,7 +385,7 @@ void Speed_response(void)
|
|
|
#elif (MOTOR_CTRL_MODE == SPEED_LOOP_CONTROL)
|
|
#elif (MOTOR_CTRL_MODE == SPEED_LOOP_CONTROL)
|
|
|
{
|
|
{
|
|
|
mcFocCtrl.IqSpeedRef = HW_One_PI(refRampOut - mcFocCtrl.SpeedFlt);
|
|
mcFocCtrl.IqSpeedRef = HW_One_PI(refRampOut - mcFocCtrl.SpeedFlt);
|
|
|
- mcFocCtrl.LimitIqOut = HW_One_PI2(mcFocCtrl.PowerLimitValue - mcFocCtrl.PowerFlt); // 限制功率
|
|
|
|
|
|
|
+ mcFocCtrl.LimitIqOut = HW_One_PI2(mcFocCtrl.PowerLimitValue - mcFocCtrl.Power); // 限制功率
|
|
|
|
|
|
|
|
if ((mcFocCtrl.LimitIqOut < mcFocCtrl.IqSpeedRef)) // 限制输出电流
|
|
if ((mcFocCtrl.LimitIqOut < mcFocCtrl.IqSpeedRef)) // 限制输出电流
|
|
|
{
|
|
{
|
|
@@ -321,14 +396,14 @@ void Speed_response(void)
|
|
|
{ mcFocCtrl.IqRef = mcFocCtrl.IqSpeedRef; }
|
|
{ mcFocCtrl.IqRef = mcFocCtrl.IqSpeedRef; }
|
|
|
|
|
|
|
|
#if (MotorFiledWeakenEn)
|
|
#if (MotorFiledWeakenEn)
|
|
|
- FileWeakenControl();
|
|
|
|
|
- #else
|
|
|
|
|
- FOC_IQREF = mcFocCtrl.IqRef;
|
|
|
|
|
- #endif
|
|
|
|
|
|
|
+ FileWeakenControl();
|
|
|
|
|
+ #else
|
|
|
|
|
+ FOC_IQREF = mcFocCtrl.IqRef;
|
|
|
|
|
+ #endif
|
|
|
}
|
|
}
|
|
|
#elif (MOTOR_CTRL_MODE == POWER_LOOP_CONTROL)
|
|
#elif (MOTOR_CTRL_MODE == POWER_LOOP_CONTROL)
|
|
|
{
|
|
{
|
|
|
- mcFocCtrl.IqRef = HW_One_PI(refRampOut - mcFocCtrl.PowerFlt);
|
|
|
|
|
|
|
+ mcFocCtrl.IqRef = HW_One_PI(refRampOut - mcFocCtrl.Power);
|
|
|
FOC_IQREF = mcFocCtrl.IqRef;
|
|
FOC_IQREF = mcFocCtrl.IqRef;
|
|
|
}
|
|
}
|
|
|
#elif (MOTOR_CTRL_MODE == UQ_LOOP_CONTROL)
|
|
#elif (MOTOR_CTRL_MODE == UQ_LOOP_CONTROL)
|
|
@@ -336,8 +411,17 @@ void Speed_response(void)
|
|
|
mcFocCtrl.IqRef = HW_One_PI(refRampOut - mcFocCtrl.UqFlt);
|
|
mcFocCtrl.IqRef = HW_One_PI(refRampOut - mcFocCtrl.UqFlt);
|
|
|
FOC_IQREF = mcFocCtrl.IqRef;
|
|
FOC_IQREF = mcFocCtrl.IqRef;
|
|
|
}
|
|
}
|
|
|
- #else
|
|
|
|
|
|
|
+ #elif (MOTOR_CTRL_MODE == UQ_POWER_CONTROL)
|
|
|
{
|
|
{
|
|
|
|
|
+ // 反馈计算
|
|
|
|
|
+ mcFocCtrl.LoopCalcValue = mcFocCtrl.UqFlt * 0.65 + mcFocCtrl.Power * 0.61;
|
|
|
|
|
+
|
|
|
|
|
+ // 限幅
|
|
|
|
|
+ if (mcFocCtrl.LoopCalcValue > 32440)
|
|
|
|
|
+ { mcFocCtrl.LoopCalcValue = 32440;}
|
|
|
|
|
+
|
|
|
|
|
+ mcFocCtrl.IqRef = HW_One_PI(refRampOut - mcFocCtrl.LoopCalcValue);
|
|
|
|
|
+ FOC_IQREF = mcFocCtrl.IqRef;
|
|
|
}
|
|
}
|
|
|
#endif
|
|
#endif
|
|
|
}
|
|
}
|
|
@@ -350,7 +434,7 @@ void Speed_response(void)
|
|
|
{ ClrBit(FOC_CR2, F5SEG); }
|
|
{ ClrBit(FOC_CR2, F5SEG); }
|
|
|
}
|
|
}
|
|
|
#endif
|
|
#endif
|
|
|
- break;
|
|
|
|
|
|
|
+ break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -426,78 +510,3 @@ void ATORamp(void)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/**
|
|
|
|
|
- @brief 默认1ms周期服务函数,运行信号采样,调速信号处理,闭环控制,故障检测,ATO爬坡函数
|
|
|
|
|
- 该函数运行于大循环中,由SYSTICK定时器间隔1ms触发运行。
|
|
|
|
|
- @date 2022-07-14
|
|
|
|
|
-*/
|
|
|
|
|
-void TickCycle_1ms(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);
|
|
|
|
|
-
|
|
|
|
|
- if (mcState == mcRun)
|
|
|
|
|
- {
|
|
|
|
|
- mcFocCtrl.Power = FOC__POW << 3; // 功率滤波
|
|
|
|
|
- mcFocCtrl.PowerFlt = LPFFunction(mcFocCtrl.Power, mcFocCtrl.PowerFlt, 10);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- else
|
|
|
|
|
- {
|
|
|
|
|
- mcFocCtrl.SpeedFlt = 0;
|
|
|
|
|
- mcFocCtrl.PowerFlt = 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 = ADC7_DR;
|
|
|
|
|
- mcFocCtrl.NTCValueFlt = LPFFunction(mcFocCtrl.NTCValue, mcFocCtrl.NTCValueFlt, 60);
|
|
|
|
|
- mcFocCtrl.UqFlt = LPFFunction(FOC__UQ, mcFocCtrl.UqFlt, 50);
|
|
|
|
|
- mcFocCtrl.UdFlt = LPFFunction(FOC__UD, mcFocCtrl.UdFlt, 50);
|
|
|
|
|
- // 获取调速信号,不同调速模式(PWMMODE,NONEMODE,SREFMODE)的目标值修改
|
|
|
|
|
- TargetRef_Process();
|
|
|
|
|
- // 启动ATO控制,环路响应,如速度环、转矩环、功率环等
|
|
|
|
|
- Speed_response();
|
|
|
|
|
- //故障保护函数功能,如过欠压保护、启动保护、缺相、堵转等
|
|
|
|
|
- Fault_Detection();
|
|
|
|
|
- // 电机启动ATO爬坡函数处理
|
|
|
|
|
- ATORamp();
|
|
|
|
|
-
|
|
|
|
|
- // 电机状态机的时序处理
|
|
|
|
|
- if (mcFocCtrl.State_Count > 0)
|
|
|
|
|
- { mcFocCtrl.State_Count--; }
|
|
|
|
|
-}
|
|
|