123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842 |
- #include "motor_control.h"
- #include "MC_FOC_driver.h"
- #include "MC_PID_regulators.h"
- #include "MC_Globals.h"
- #include "stm32f10x_svpwm_3shunt.h"
- #include "hall_sensor.h"
- #include "cadence_sensor.h"
- #include "speed_sensor.h"
- #include "torque_sensor.h"
- #include "gas_sensor.h"
- #include "key_driver.h"
- #include "pwm_driver.h"
- #include "math_tools.h"
- #include "power12V_driver.h"
- /************************全局变量定义************************/
- //工作模式
- MC_WorkMode_Struct_t MC_WorkMode = MC_WorkMode_Run;
- MC_WorkMode_Struct_t MC_WorkMode_Back = ~MC_WorkMode_Run;
- //MC_CTL控制指令
- MC_ControlCode_Struct_t MC_ControlCode= {MC_GearSt_OFF, MC_LightSwitch_OFF};
- MC_ControlCode_Struct_t MC_ControlCode_Back = {(MC_GearSt_Struct_t)~MC_GearSt_OFF, (MC_LightSwitch_Struct_t)~MC_LightSwitch_OFF};
- //电机控制计算参数
- MC_CalParam_Struct_t MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
- MC_CalParam_Struct_t MC_CalParam_Back = {(MC_AssistRunMode_Struct_t)~MC_AssistRunMode_INVALID, ~0, ~0, (FlagStatus)~RESET};
- //踏频限流系数
- uint8_t MC_CadenceLimit_K = 100;
- //力矩助力控制参数
- MC_TorqueProcess_Param_Struct_t MC_TorqueProcess_Param = {SET, 0, 0, 0};
- //推行助力控制参数
- MC_WalkProcess_Param_Struct_t MC_WalkProcess_Param = {FALSE, 0};
- //电机启动标志
- FlagStatus MC_StarFlag = RESET;
- /*************************局部函数定义***********************/
- //限流值线性变化处理
- uint16_t MC_CurrentLimit_Linear_Process(uint16_t SetData, uint16_t PresentData)
- {
- int16_t ErrorData;
- uint16_t Result;
-
- ErrorData = SetData - PresentData;
- if(ErrorData > 0) //升速
- {
- Result = PresentData + 5;
- }
- else if(ErrorData < 0) //降速
- {
- Result = PresentData - 1;
- }
- else
- {
- Result = SetData;
- }
-
- return Result;
- }
- //助力模式判断处理
- MC_AssistRunMode_Struct_t MC_JudgeAsistRunMode_Process(uint16_t GasSensorData, MC_GearSt_Struct_t GearSt, TrueOrFalse_Flag_Struct_t Break_Flag)
- {
- MC_AssistRunMode_Struct_t MC_AssistRunMode_Result;
-
- if(MC_ErrorCode.Code == 0) // 无故障
- {
- if((GearSt != MC_GearSt_OFF) && (Break_Flag == FALSE))
- {
- //进入指拨模式
- if(GasSensorData > 100)
- {
- MC_AssistRunMode_Result = MC_AssistRunMode_GAS;
- }
- //退出指拨模式
- else if(GasSensorData < 50)
- {
- //进入推行模式
- if(GearSt == MC_GearSt_WALK)
- {
- MC_AssistRunMode_Result = MC_AssistRunMode_WALK;
- }
- else
- {
- //进入踏频模式
- if(((GearSt & 0xF0) != 0) && (GearSt != MC_GearSt_SMART))
- {
- MC_AssistRunMode_Result = MC_AssistRunMode_CADENCE;
- }
- //进入力矩模式
- else
- {
- MC_AssistRunMode_Result = MC_AssistRunMode_TORQUE;
- }
- }
- }
- }
- else
- {
- MC_AssistRunMode_Result = MC_AssistRunMode_INVALID;
- }
- }
- else //存在故障
- {
- MC_AssistRunMode_Result = MC_AssistRunMode_INVALID;
- MC_ControlCode.GearSt = MC_GearSt_OFF;
- MC_ControlCode_Back.GearSt = (MC_GearSt_Struct_t)~MC_ControlCode.GearSt;
- }
-
- return MC_AssistRunMode_Result;
- }
- //指拨模式处理
- MC_CalParam_Struct_t MC_AssistRunMode_Gas_Process(uint16_t SensorData, MC_GearSt_Struct_t GearSt)
- {
- MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
-
- //...插入指拨处理
-
- //电机启动
- MC_MotorStar(&MC_StarFlag);
-
- p_MC_CalParam.Foc_Flag = SET;
- p_MC_CalParam.AssistRunMode = MC_AssistRunMode_GAS;
-
- return (p_MC_CalParam);
- }
- //推行模式处理
- MC_CalParam_Struct_t MC_AssistRunMode_Walk_Process(MC_WorkMode_Struct_t p_MC_WorkMode)
- {
- MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
- int16_t TorQueBySpd = 0;
- int16_t SpdMotorByIdc = 0;
-
-
- //配置模式,设定转速 = 最高转速
- if(p_MC_WorkMode == MC_WorkMode_Config)
- {
- if(MC_WalkProcess_Param.MotorSpeedSetBigin < (MC_MotorParam.Rate_Speed << 5) * MC_WalkMode_Persent / 100 - 10)
- {
- MC_WalkProcess_Param.MotorSpeedSetBigin += 5;
- }
- else if(MC_WalkProcess_Param.MotorSpeedSetBigin > (MC_MotorParam.Rate_Speed << 5) * MC_WalkMode_Persent / 100 + 10)
- {
- if(MC_WalkProcess_Param.MotorSpeedSetBigin > 5)
- {
- MC_WalkProcess_Param.MotorSpeedSetBigin -= 5;
- }
- else
- {
- MC_WalkProcess_Param.MotorSpeedSetBigin = 0;
- }
- }
- else
- {
- MC_WalkProcess_Param.MotorSpeedSetBigin = (MC_MotorParam.Rate_Speed << 5 ) * MC_WalkMode_Persent / 100;
- }
- SpdMotorByIdc = PID_Regulator((MC_ConfigParam.CurrentLimit * 1000) >> 7, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower); // 母线电流闭环
- }
-
- //运行模式,设定转速 = 150rpm
- else
- {
- if(MC_WalkProcess_Param.MotorSpeedSetBigin < (135 << 5) - 10)
- {
- MC_WalkProcess_Param.MotorSpeedSetBigin += 4;
- }
- else if(MC_WalkProcess_Param.MotorSpeedSetBigin > (135 << 5) + 10)
- {
- MC_WalkProcess_Param.MotorSpeedSetBigin -= 4;
- }
- else
- {
- MC_WalkProcess_Param.MotorSpeedSetBigin = 135 << 5;
- }
- SpdMotorByIdc = PID_Regulator((MC_ConfigParam.CurrentLimit * 500) >> 7, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower); // 母线电流闭环
- }
-
- //速度环
- TorQueBySpd = PID_Regulator((MC_WalkProcess_Param.MotorSpeedSetBigin >> 5), MC_RunInfo.MotorSpeed, &PID_MotorSpd); // 电机速度闭环输出
- TorQueBySpd += SpdMotorByIdc;
-
- //限制车速低于6km/h
- if(p_MC_WorkMode != MC_WorkMode_Config) //运行模式,推行限速6km/h
- {
- TorQueBySpd = (uint16_t)((uint32_t)(TorQueBySpd * Function_Linear_3Stage(55, 0, 55, 128, MC_RunInfo.BikeSpeed)) >> 10);
- if(MC_RunInfo.BikeSpeed > 60)
- {
- MC_WalkProcess_Param.MotorSpeedSetBigin = 0;
- MC_MotorStop(&MC_StarFlag);
- }
- else
- {
- //电机启动
- MC_MotorStar(&MC_StarFlag);
- }
- }
- else //配置模式不限速
- {
- //电机启动
- MC_MotorStar(&MC_StarFlag);
- }
-
- #if 1
- //根据电压调节输出
- TorQueBySpd = (int16_t)((int32_t)TorQueBySpd * Function_Linear_3Stage(258, 21, 328, 0, MC_RunInfo.BusVoltage >> 7) >> 10);//电压单位按照(mV / 128)计算
-
- //根据温度调节输出
- TorQueBySpd = (int16_t)((int32_t)TorQueBySpd * Function_Linear_3Stage(MC_ConfigParam.TempTH_Alarm, 0, MC_ConfigParam.TempTH_Alarm, 26, MC_RunInfo.T_Roil) >> 10);
- #endif
-
- #if 0
- //限制最大输出功率为250W
- static uint16_t IqsMax;
- if(MC_RunInfo.MotorSpeed < 10)
- {
- IqsMax = 1050;
- }
- else
- {
- IqsMax = 235000 / MC_RunInfo.MotorSpeed;
- }
- IqsMax = (IqsMax > 1050) ? 1050 : IqsMax;
- if(TorQueBySpd > IqsMax)
- {
- TorQueBySpd = IqsMax;
- }
- #elif 0
- if(TorQueBySpd > 450)
- {
- TorQueBySpd = 450;
- }
- #endif
- p_MC_CalParam.Ref_Speed = TorQueBySpd;
- p_MC_CalParam.Foc_Flag = SET;
- p_MC_CalParam.AssistRunMode = MC_AssistRunMode_WALK;
-
- return (p_MC_CalParam);
- }
- //踏频模式处理
- MC_CalParam_Struct_t MC_AssistRunMode_Cadence_Process(MC_GearSt_Struct_t GearSt)
- {
- MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
-
- //...插入踏频处理
-
- //电机启动
- MC_MotorStar(&MC_StarFlag);
-
- p_MC_CalParam.Foc_Flag = SET;
- p_MC_CalParam.AssistRunMode = MC_AssistRunMode_CADENCE;
-
- return (p_MC_CalParam);
- }
- //力矩模式处理
- MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_GearSt_Struct_t GearSt)
- {
- MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
- uint8_t TorqueAccStep = 0;//力矩上升斜率
- uint8_t TorqueDecStep = 0;//力矩下降斜率
- uint16_t TorqueStartData, TorqueStopData;//力矩启动值,力矩停机值
- int16_t Torque_Temp;
- static uint32_t TorqueStopDelayTimeCnt = 0; //低力矩停机计时
- uint16_t TorqueStopDelayTime;
- static int16_t IqRefByInPower; //限流计算结果
- static uint16_t CurrentLimitPresent; //限流实际值,做升降速处理
- uint16_t CurrentLimitSet; //限流设置值,不同助力档位更新
-
- #if 1
-
- //踩踏力矩输入
- MC_TorqueProcess_Param.TorqueApp = SenorData;
-
- #elif 0
-
- //输入阶跃
- MC_TorqueProcess_Param.TorqueApp = 1000;
-
- //踏频设为启动
- MC_CadenceResult.Cadence_Dir = MC_Cadence_Forward;
- MC_CadenceResult.IsStopFlag = FALSE;
-
- #elif 1
-
- //输入斜坡
- static uint32_t WaveTime_Zero = 0;
- static uint32_t Time_Enter = 0;
- if((HAL_GetTick() - Time_Enter) > 10) // 超时10ms未进入,波形发生初始时刻清零
- {
- WaveTime_Zero = HAL_GetTick();
- }
- Time_Enter = HAL_GetTick();
- MC_TorqueProcess_Param.TorqueApp = RampWaveGenerate(WaveTime_Zero, 6000, 2100);
-
- //踏频设为启动
- MC_CadenceResult.Cadence_Dir = MC_Cadence_Forward;
- MC_CadenceResult.IsStopFlag = FALSE;
-
- #elif 1
-
- //输入三角波,测试输出响应
- static uint32_t WaveTime_Zero = 0;
- static uint32_t Time_Enter = 0;
- if((HAL_GetTick() - Time_Enter) > 10) // 超时10ms未进入,波形发生初始时刻清零
- {
- WaveTime_Zero = HAL_GetTick();
- }
- Time_Enter = HAL_GetTick();
- MC_TorqueProcess_Param.TorqueApp = TriangleWaveGenerate(WaveTime_Zero, 500, 1000 ,1500);
-
- //踏频设为启动
- MC_CadenceResult.Cadence_Dir = MC_Cadence_Forward;
- MC_CadenceResult.IsStopFlag = FALSE;
-
- #elif 1
-
- //输入方波,测试输出响应
- static uint32_t WaveTime_Zero = 0;
- static uint32_t Time_Enter = 0;
- if((HAL_GetTick() - Time_Enter) > 10) // 超时10ms未进入,波形发生初始时刻清零
- {
- WaveTime_Zero = HAL_GetTick();
- }
- Time_Enter = HAL_GetTick();
- MC_TorqueProcess_Param.TorqueApp = SquareWaveGenerate(WaveTime_Zero, 5000, 8000, 1500);
-
- //踏频设为启动
- MC_CadenceResult.Cadence_Dir = MC_Cadence_Forward;
- MC_CadenceResult.IsStopFlag = FALSE;
-
- #endif
-
- //低力矩停机
- TorqueStopData = (MC_TorqueCorrectParam.StarData < 200) ? 100 : (MC_TorqueCorrectParam.StarData >> 1);
- if(MC_TorqueProcess_Param.TorqueApp >= (TorqueStopData))
- {
- TorqueStopDelayTimeCnt = HAL_GetTick();
- }
- else
- {
- if(MC_RunInfo.MotorSpeed > 300)
- {
- TorqueStopDelayTime = 327600 / MC_RunInfo.MotorSpeed + 200;
- }
- else
- {
- TorqueStopDelayTime = 1200;
- }
- TorqueStopDelayTime = (TorqueStopDelayTime > 1200) ? 1200 : TorqueStopDelayTime;
- TorqueStopDelayTime = (TorqueStopDelayTime < 300) ? 300 : TorqueStopDelayTime;
-
- if((HAL_GetTick() - TorqueStopDelayTimeCnt) > TorqueStopDelayTime)//超时1200ms
- {
- MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
- }
- }
-
- //启动值判断
- if(MC_RunInfo.BikeSpeed > 60)
- {
- TorqueStartData = (MC_TorqueCorrectParam.StarData < 200 ? 150 \
- : (MC_TorqueCorrectParam.StarData > 700 ? 525 \
- : (MC_TorqueCorrectParam.StarData * 3 >> 2)));
- }
- else
- {
- TorqueStartData = (MC_TorqueCorrectParam.StarData < 200 ? 150 \
- : (MC_TorqueCorrectParam.StarData > 700 ? 525 \
- : MC_TorqueCorrectParam.StarData));
- }
- if(MC_TorqueProcess_Param.TorqueApp >= TorqueStartData)
- {
- MC_TorqueProcess_Param.MotorStopLock_Flag = RESET;
- }
-
- //踏频反向或踏频停止停机
- if((MC_CadenceResult.Cadence_Dir == MC_Cadence_Backward) ||
- (MC_CadenceResult.IsStopFlag == TRUE)
- )
- {
- MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
- }
-
- //停机状态,延时处理
- if(MC_TorqueProcess_Param.MotorStopLock_Flag == SET)
- {
- if(MC_TorqueProcess_Param.TorqueRefEnd < 10)
- {
- MC_TorqueProcess_Param.TorqueRefEnd = 0;
- //停机处理
- MC_MotorStop(&MC_StarFlag);
- }
- else
- {
- MC_TorqueProcess_Param.TorqueRefEnd -= 14; //这里影响到停止踩踏后的断电时间
- MC_MotorStar(&MC_StarFlag);
- }
- }
- //力矩给定升降速处理
- else
- {
- //按照助力档位调节力矩输入值
- switch(GearSt)
- {
- case MC_GearSt_Torque_ECO:
- {
- //控制输入给定加速斜率
- TorqueAccStep = MC_AssisParam.Gear_ECO.AccCnt;
- //控制输入给定减速斜率
- TorqueDecStep = MC_AssisParam.Gear_ECO.DecCnt;
- //随力矩输入调节助力比
- if(MC_ConfigParam.StarModel == MC_StarMode_DYNAMIC)//强劲模式
- {
- Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(307, MC_AssisParam.Gear_ECO.Gain_K, MC_AssisParam.Gear_ECO.Upper_Iq, MC_TorqueProcess_Param.TorqueApp)) >> 10);
- TorqueAccStep <<= 1;
- TorqueDecStep <<= 1;
- }
- else
- {
- Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(102, MC_AssisParam.Gear_ECO.Gain_K, MC_AssisParam.Gear_ECO.Upper_Iq, MC_TorqueProcess_Param.TorqueApp)) >> 10);
- }
- //给定下限
- Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_ECO.Lower_Iq) ? MC_AssisParam.Gear_ECO.Lower_Iq : Torque_Temp;
- //给定上限
- Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_ECO.Upper_Iq) ? MC_AssisParam.Gear_ECO.Upper_Iq : Torque_Temp;
-
- //限流参数设置
- CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_ECO.CurrentMax_K * MC_ConfigParam.CurrentLimit * 1000 >> 17);
- CurrentLimitPresent = CurrentLimitSet * 100;
- PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_ECO.Upper_Iq); //Lower Limit for Output limitation
- PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
- PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_ECO.Upper_Iq << 10); // 放大1024
- PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
- break;
- }
- case MC_GearSt_Torque_NORM:
- {
- //控制输入给定加速斜率
- TorqueAccStep = MC_AssisParam.Gear_NORM.AccCnt;
- //控制输入给定减速斜率
- TorqueDecStep = MC_AssisParam.Gear_NORM.DecCnt;
- //随力矩输入调节助力比
- if(MC_ConfigParam.StarModel == MC_StarMode_DYNAMIC)//强劲模式
- {
- Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(512, MC_AssisParam.Gear_NORM.Gain_K, MC_AssisParam.Gear_NORM.Upper_Iq, MC_TorqueProcess_Param.TorqueApp)) >> 10);
- TorqueAccStep <<= 1;
- TorqueDecStep <<= 1;
- }
- else
- {
- Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(204, MC_AssisParam.Gear_NORM.Gain_K, MC_AssisParam.Gear_NORM.Upper_Iq, MC_TorqueProcess_Param.TorqueApp)) >> 10);
- }
- //给定下限
- Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_NORM.Lower_Iq) ? MC_AssisParam.Gear_NORM.Lower_Iq : Torque_Temp;
- //给定上限
- Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_NORM.Upper_Iq) ? MC_AssisParam.Gear_NORM.Upper_Iq : Torque_Temp;
-
- //限流参数设置
- CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_NORM.CurrentMax_K * MC_ConfigParam.CurrentLimit * 1000 >> 17);
- CurrentLimitPresent = CurrentLimitSet * 100;
- PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_NORM.Upper_Iq); //Lower Limit for Output limitation
- PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
- PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_NORM.Upper_Iq << 10); // 放大1024
- PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
- break;
- }
- case MC_GearSt_Torque_SPORT:
- {
- //控制输入给定加速斜率
- TorqueAccStep = MC_AssisParam.Gear_SPORT.AccCnt;
- //控制输入给定减速斜率
- TorqueDecStep = MC_AssisParam.Gear_SPORT.DecCnt;
- //随力矩输入调节助力比
- if(MC_ConfigParam.StarModel == MC_StarMode_DYNAMIC)//强劲模式
- {
- Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(718, MC_AssisParam.Gear_SPORT.Gain_K, MC_AssisParam.Gear_SPORT.Upper_Iq, MC_TorqueProcess_Param.TorqueApp)) >> 10);
- TorqueAccStep <<= 1;
- TorqueDecStep <<= 1;
- }
- else
- {
- Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(307, MC_AssisParam.Gear_SPORT.Gain_K, MC_AssisParam.Gear_SPORT.Upper_Iq, MC_TorqueProcess_Param.TorqueApp)) >> 10);
- }
- //给定下限
- Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_SPORT.Lower_Iq) ? MC_AssisParam.Gear_SPORT.Lower_Iq : Torque_Temp;
- //给定上限
- Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_SPORT.Upper_Iq) ? MC_AssisParam.Gear_SPORT.Upper_Iq : Torque_Temp;
-
- //限流参数设置
- CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SPORT.CurrentMax_K * MC_ConfigParam.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
- CurrentLimitPresent = MC_CurrentLimit_Linear_Process(CurrentLimitSet, CurrentLimitPresent);
- PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_SPORT.Upper_Iq); //Lower Limit for Output limitation
- PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
- PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_SPORT.Upper_Iq << 10); // 放大1024
- PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
- break;
- }
- case MC_GearSt_Torque_TURBO:
- {
- //控制输入给定加速斜率
- TorqueAccStep = MC_AssisParam.Gear_TURBO.AccCnt;
- //控制输入给定减速斜率
- TorqueDecStep = MC_AssisParam.Gear_TURBO.DecCnt;
- //随力矩输入调节助力比
- if(MC_ConfigParam.StarModel == MC_StarMode_DYNAMIC)//强劲模式
- {
- Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(819, MC_AssisParam.Gear_TURBO.Gain_K, MC_AssisParam.Gear_TURBO.Upper_Iq, MC_TorqueProcess_Param.TorqueApp)) >> 10);
- TorqueAccStep <<= 1;
- TorqueDecStep <<= 1;
- }
- else
- {
- Torque_Temp = (uint16_t)((uint32_t)(MC_TorqueProcess_Param.TorqueApp * Coefficient_GainCal(409, MC_AssisParam.Gear_TURBO.Gain_K, MC_AssisParam.Gear_TURBO.Upper_Iq, MC_TorqueProcess_Param.TorqueApp)) >> 10);
- }
- //给定下限
- Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_TURBO.Lower_Iq) ? MC_AssisParam.Gear_TURBO.Lower_Iq : Torque_Temp;
- //给定上限
- Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_TURBO.Upper_Iq) ? MC_AssisParam.Gear_TURBO.Upper_Iq : Torque_Temp;
-
- //限流参数设置
- CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_TURBO.CurrentMax_K * MC_ConfigParam.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
- CurrentLimitPresent = MC_CurrentLimit_Linear_Process(CurrentLimitSet, CurrentLimitPresent);
- PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_TURBO.Upper_Iq); //Lower Limit for Output limitation
- PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
- PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_TURBO.Upper_Iq << 10); // 放大1024
- PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
- break;
- }
- case MC_GearSt_SMART:
- {
- //控制输入给定加速斜率
- TorqueAccStep = MC_AssisParam.Gear_SMART.AccCnt;
- //控制输入给定减速斜率
- TorqueDecStep = MC_AssisParam.Gear_SMART.DecCnt;
- //助力比控制系数
- Torque_Temp = (uint32_t)(MC_TorqueProcess_Param.TorqueApp * MC_TorqueProcess_Param.TorqueApp) / (MC_AssisParam.Gear_SMART.i_Sport_TH);
- if(MC_ConfigParam.StarModel == MC_StarMode_DYNAMIC)//强劲模式
- {
- Torque_Temp = (uint16_t)((uint32_t)(Torque_Temp * Coefficient_GainCal(1024, 1382, MC_AssisParam.Gear_SMART.i_Sport_TH, Torque_Temp)) >> 10);
- TorqueAccStep <<= 1;
- TorqueDecStep <<= 1;
- }
- //给定下限
- Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_SMART.Lower_Iq) ? MC_AssisParam.Gear_SMART.Lower_Iq : Torque_Temp;
- //给定上限
- Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_SMART.Upper_Iq) ? MC_AssisParam.Gear_SMART.Upper_Iq : Torque_Temp;
-
- //限流参数设置
- CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SMART.CurrentMax_K * MC_ConfigParam.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
- CurrentLimitPresent = MC_CurrentLimit_Linear_Process(CurrentLimitSet, CurrentLimitPresent);
- PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_SMART.Upper_Iq); //Lower Limit for Output limitation
- PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
- PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_SMART.Upper_Iq << 10); // 放大1024
- PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
- break;
- }
- default:
- {
- TorqueAccStep = 0;
- TorqueDecStep = 0;
- Torque_Temp = 0;
- break;
- }
- }
-
- //随车速调节助力比
- if(MC_ConfigParam.StarModel == MC_StarMode_DYNAMIC)
- {
- Torque_Temp = (uint16_t)((uint32_t)(Torque_Temp * Function_Linear_3Stage(90, -2, MC_ConfigParam.SpeedLimit * 10, 82, MC_RunInfo.BikeSpeed)) >> 10);
- }
- else if(MC_ConfigParam.StarModel == MC_StarMode_SOFT)
- {
- Torque_Temp = (uint16_t)((uint32_t)(Torque_Temp * Function_Linear_3Stage(120, -3, MC_ConfigParam.SpeedLimit * 10, 82, MC_RunInfo.BikeSpeed)) >> 10);
- }
- else
- {
- Torque_Temp = (uint16_t)((uint32_t)(Torque_Temp * Function_Linear_3Stage(MC_ConfigParam.SpeedLimit * 10, 0, MC_ConfigParam.SpeedLimit * 10, 82, MC_RunInfo.BikeSpeed)) >> 10);
- }
-
- //限流计算
- IqRefByInPower = PID_Regulator(CurrentLimitPresent / 100, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
- MC_TorqueProcess_Param.TorqueRef = Torque_Temp + IqRefByInPower;
- if(MC_TorqueProcess_Param.TorqueRef <= 0)
- {
- MC_TorqueProcess_Param.TorqueRef = 0;
- }
-
- //升降速曲线计算
- if(IqRefByInPower < 0)
- {
- if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
- {
- MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
- }
- else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
- {
- MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep * 5;
- }
- }
- else
- {
- if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
- {
- MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
- }
- else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
- {
- MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
- }
- }
- MC_TorqueProcess_Param.TorqueRefEnd = (MC_TorqueProcess_Param.TorqueRefEnd < 6) ? 6 : MC_TorqueProcess_Param.TorqueRefEnd;
-
- //限速点处理
- if(MC_RunInfo.BikeSpeed > ((MC_ConfigParam.SpeedLimit + 1) * 10))
- {
- MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
- MC_TorqueProcess_Param.TorqueRefEnd = 0;
- //停机处理
- MC_MotorStop(&MC_StarFlag);
- }
- else if(MC_RunInfo.BikeSpeed < ((MC_ConfigParam.SpeedLimit - 1) * 10))
- {
- MC_MotorStar(&MC_StarFlag);
- }
- }
-
- #if 1
- //根据电压调节输出
- MC_TorqueProcess_Param.TorqueRefEnd = (int16_t)((int32_t)MC_TorqueProcess_Param.TorqueRefEnd * Function_Linear_3Stage(258, 21, 328, 0, MC_RunInfo.BusVoltage >> 7) >> 10);//电压单位按照(mV / 128)计算
-
- //根据温度调节输出
- MC_TorqueProcess_Param.TorqueRefEnd = (int16_t)((int32_t)MC_TorqueProcess_Param.TorqueRefEnd * Function_Linear_3Stage(MC_ConfigParam.TempTH_Alarm, 0, MC_ConfigParam.TempTH_Alarm, 26, MC_RunInfo.T_Roil) >> 10);
- #endif
-
- p_MC_CalParam.Ref_Torque = (int16_t)(MC_TorqueProcess_Param.TorqueRefEnd >> 1);
- p_MC_CalParam.Foc_Flag = SET;
- p_MC_CalParam.AssistRunMode = MC_AssistRunMode_TORQUE;
-
- return (p_MC_CalParam);
- }
- /******************************全局函数定义*****************************/
- //传感器初始化
- void MC_SensorInit(void)
- {
- //霍尔传感器IO设置
- HallSensor_GPIO_Init();
- //霍尔电角度初始化
- HallSensorAngle_Init();
- //踏频传感器IO设置
- CadenceSensor_GPIO_Init();
- //速度传感器IO设置
- SpeedSensor_GPIO_Init();
- //刹车信号和Gear信号检测IO设置
- KeyInitial();
- //力矩传感器零点初值
- TorqueOffSetDefaultData_Init(&TorqueOffSetData, ADC1_Result[ADC1_RANK_TORQUE_SENSOR]);
- //指拨零点初值
- GasSensorOffSet_Init(&GasSensor_OffSet, ADC1_Result[ADC1_RANK_GAS]);
- }
- //MC控制初始化
- void MC_Init(void)
- {
- //PID参数初始化
- PID_Init(&PID_Torque_InitStructure,\
- &PID_Flux_InitStructure,\
- &PID_Weak_InitStructure,\
- &PID_IMax,\
- &PID_MotorSpd,\
- &PID_ConstantPower\
- );
-
- //助力参数初始化
- UpdateGearParam(MC_ConfigParam.SerialNum);
-
- //三相电流零点校准
- SVPWM_3ShuntCurrentReadingCalibration(&MC_ErrorCode);
-
- //母线电流零点校准
- CurrentReadingCalibration(&MC_ErrorCode);
-
- //力矩传感器零点值处理
- TorqueOffSetData_Process(&TorqueOffSetData, ADC1_Result[ADC1_RANK_TORQUE_SENSOR]);
-
- //智能档位初始化处理
- if(MC_ConfigParam.NoPBU_Flag == MC_SUPPORT_ENABLE)
- {
- MC_ControlCode.GearSt = MC_GearSt_SMART;
- Update_MC_ControlCode_Back();
- }
-
- //12V驱动电源初始化
- Power12V_Driver_Init();
-
- //打开12V驱动电源
- Power12V_Driver_Process(SET);
- }
- //MC控制参数初始化
- void MC_ControlParam_Init(void)
- {
- //清除推行模式初始变量
- MC_WalkProcess_Param.IsEnterFlag = FALSE;
- MC_WalkProcess_Param.MotorSpeedSetBigin = 0;
-
- //清除力矩模式初始变量
- MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
- MC_TorqueProcess_Param.TorqueApp = 0;
- MC_TorqueProcess_Param.TorqueRef = 0;
- MC_TorqueProcess_Param.TorqueRefEnd = 0;
-
- //全局运算变量归零
- IqFdbFlt =0;
- IdFdbFlt = 0;
- VoltSquareFlt = 0;
- UqVoltFlt = 0;
- UdVoltFlt = 0;
-
- //PDI积分清零
- PID_Flux_InitStructure.wIntegral = 0;
- PID_Torque_InitStructure.wIntegral = 0;
- PID_Weak_InitStructure.wIntegral = 0;
- PID_IMax.wIntegral = 0;
- PID_MotorSpd.wIntegral = 0;
- PID_ConstantPower.wIntegral = 0;
- }
- //控制参数输入值计算
- void MC_CalParam_Cal(MC_WorkMode_Struct_t p_MC_WorkMode, ADC_SensorData_Struct_t p_ADC_SensorData, MC_GearSt_Struct_t GearSt, TrueOrFalse_Flag_Struct_t Break_Flag, MC_CalParam_Struct_t* p_MC_CalParam)
- {
- MC_AssistRunMode_Struct_t MC_AssistRunMode_Temp;
- static FlagStatus MC_AssistRunMode_ShiftFlag = RESET; //电机助力模式切换标志
-
- //根据指拨信号、助力档位指令、刹车信号判断助力模式
- MC_AssistRunMode_Temp = MC_JudgeAsistRunMode_Process(p_ADC_SensorData.GasSensor, GearSt, Break_Flag);
-
- //发生助力模式切换时,清空变量
- if(MC_AssistRunMode_Temp != p_MC_CalParam->AssistRunMode)
- {
- if(MC_AssistRunMode_ShiftFlag == RESET)
- {
- MC_AssistRunMode_Temp = MC_AssistRunMode_INVALID;
- MC_AssistRunMode_ShiftFlag = SET;
- }
- }
- //助力模式处理
- switch(MC_AssistRunMode_Temp)
- {
- //指拨模式
- case MC_AssistRunMode_GAS:
- {
- //计算FOC控制输入
- *p_MC_CalParam = MC_AssistRunMode_Gas_Process(p_ADC_SensorData.GasSensor, (MC_GearSt_Struct_t)(GearSt & 0x0F));
- //助力模式切换标志复位
- MC_AssistRunMode_ShiftFlag = RESET;
- break;
- }
- //推行模式
- case MC_AssistRunMode_WALK:
- {
- //计算FOC控制输入
- if(MC_WalkProcess_Param.IsEnterFlag == FALSE)
- {
- MC_WalkProcess_Param.MotorSpeedSetBigin = (uint32_t)MC_RunInfo.MotorSpeed << 5;
- MC_WalkProcess_Param.IsEnterFlag = TRUE;
- }
- *p_MC_CalParam = MC_AssistRunMode_Walk_Process(p_MC_WorkMode);
- //助力模式切换标志复位
- MC_AssistRunMode_ShiftFlag = RESET;
- break;
- }
- //踏频模式
- case MC_AssistRunMode_CADENCE:
- {
- //计算FOC控制输入
- *p_MC_CalParam = MC_AssistRunMode_Cadence_Process(GearSt);
- //助力模式切换标志复位
- MC_AssistRunMode_ShiftFlag = RESET;
- break;
- }
- //力矩模式
- case MC_AssistRunMode_TORQUE:
- {
- //计算FOC控制输入
- *p_MC_CalParam = MC_AssistRunMode_Torque_Process(p_ADC_SensorData.TorqueSensor, GearSt);
- //助力模式切换标志复位
- MC_AssistRunMode_ShiftFlag = RESET;
- break;
- }
- //空闲模式或存在故障
- case MC_AssistRunMode_INVALID: default:
- {
- //停机处理
- MC_MotorStop(&MC_StarFlag);
- //更新母线电流零点值
- CurrentReadingCalibration(&MC_ErrorCode);
- //控制计算值初始化为默认值
- p_MC_CalParam->AssistRunMode = MC_AssistRunMode_INVALID;
- p_MC_CalParam->Foc_Flag = RESET;
- p_MC_CalParam->Ref_Torque = 0;
- p_MC_CalParam->Ref_Speed = 0;
- break;
- }
- }
- }
- void MC_MotorStop(FlagStatus* StarFlag)
- {
- //关闭PWM输出
- Pwm_Timer_Stop();
-
- //FOC运算停止
- FOC_Disable();
-
- //控制参数归零
- MC_ControlParam_Init();
-
- //电机启动标志复位
- *StarFlag = RESET;
- }
- void MC_MotorStar(FlagStatus* StarFlag)
- {
- if(*StarFlag == RESET)
- {
- //开启PWM输出
- Enable_Pwm_Output();
-
- //霍尔电角度初始化
- HallSensorAngle_Init();
-
- //FOC运算启动
- FOC_Enable();
-
- //电机启动标志置位
- *StarFlag = SET;
- }
- }
|