motor_control.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842
  1. #include "motor_control.h"
  2. #include "MC_FOC_driver.h"
  3. #include "MC_PID_regulators.h"
  4. #include "MC_Globals.h"
  5. #include "stm32f10x_svpwm_3shunt.h"
  6. #include "hall_sensor.h"
  7. #include "cadence_sensor.h"
  8. #include "speed_sensor.h"
  9. #include "torque_sensor.h"
  10. #include "gas_sensor.h"
  11. #include "key_driver.h"
  12. #include "pwm_driver.h"
  13. #include "math_tools.h"
  14. #include "power12V_driver.h"
  15. /************************全局变量定义************************/
  16. //工作模式
  17. MC_WorkMode_Struct_t MC_WorkMode = MC_WorkMode_Run;
  18. MC_WorkMode_Struct_t MC_WorkMode_Back = ~MC_WorkMode_Run;
  19. //MC_CTL控制指令
  20. MC_ControlCode_Struct_t MC_ControlCode= {MC_GearSt_OFF, MC_LightSwitch_OFF};
  21. MC_ControlCode_Struct_t MC_ControlCode_Back = {(MC_GearSt_Struct_t)~MC_GearSt_OFF, (MC_LightSwitch_Struct_t)~MC_LightSwitch_OFF};
  22. //电机控制计算参数
  23. MC_CalParam_Struct_t MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
  24. MC_CalParam_Struct_t MC_CalParam_Back = {(MC_AssistRunMode_Struct_t)~MC_AssistRunMode_INVALID, ~0, ~0, (FlagStatus)~RESET};
  25. //踏频限流系数
  26. uint8_t MC_CadenceLimit_K = 100;
  27. //力矩助力控制参数
  28. MC_TorqueProcess_Param_Struct_t MC_TorqueProcess_Param = {SET, 0, 0, 0};
  29. //推行助力控制参数
  30. MC_WalkProcess_Param_Struct_t MC_WalkProcess_Param = {FALSE, 0};
  31. //电机启动标志
  32. FlagStatus MC_StarFlag = RESET;
  33. /*************************局部函数定义***********************/
  34. //限流值线性变化处理
  35. uint16_t MC_CurrentLimit_Linear_Process(uint16_t SetData, uint16_t PresentData)
  36. {
  37. int16_t ErrorData;
  38. uint16_t Result;
  39. ErrorData = SetData - PresentData;
  40. if(ErrorData > 0) //升速
  41. {
  42. Result = PresentData + 5;
  43. }
  44. else if(ErrorData < 0) //降速
  45. {
  46. Result = PresentData - 1;
  47. }
  48. else
  49. {
  50. Result = SetData;
  51. }
  52. return Result;
  53. }
  54. //助力模式判断处理
  55. MC_AssistRunMode_Struct_t MC_JudgeAsistRunMode_Process(uint16_t GasSensorData, MC_GearSt_Struct_t GearSt, TrueOrFalse_Flag_Struct_t Break_Flag)
  56. {
  57. MC_AssistRunMode_Struct_t MC_AssistRunMode_Result;
  58. if(MC_ErrorCode.Code == 0) // 无故障
  59. {
  60. if((GearSt != MC_GearSt_OFF) && (Break_Flag == FALSE))
  61. {
  62. //进入指拨模式
  63. if(GasSensorData > 100)
  64. {
  65. MC_AssistRunMode_Result = MC_AssistRunMode_GAS;
  66. }
  67. //退出指拨模式
  68. else if(GasSensorData < 50)
  69. {
  70. //进入推行模式
  71. if(GearSt == MC_GearSt_WALK)
  72. {
  73. MC_AssistRunMode_Result = MC_AssistRunMode_WALK;
  74. }
  75. else
  76. {
  77. //进入踏频模式
  78. if(((GearSt & 0xF0) != 0) && (GearSt != MC_GearSt_SMART))
  79. {
  80. MC_AssistRunMode_Result = MC_AssistRunMode_CADENCE;
  81. }
  82. //进入力矩模式
  83. else
  84. {
  85. MC_AssistRunMode_Result = MC_AssistRunMode_TORQUE;
  86. }
  87. }
  88. }
  89. }
  90. else
  91. {
  92. MC_AssistRunMode_Result = MC_AssistRunMode_INVALID;
  93. }
  94. }
  95. else //存在故障
  96. {
  97. MC_AssistRunMode_Result = MC_AssistRunMode_INVALID;
  98. MC_ControlCode.GearSt = MC_GearSt_OFF;
  99. MC_ControlCode_Back.GearSt = (MC_GearSt_Struct_t)~MC_ControlCode.GearSt;
  100. }
  101. return MC_AssistRunMode_Result;
  102. }
  103. //指拨模式处理
  104. MC_CalParam_Struct_t MC_AssistRunMode_Gas_Process(uint16_t SensorData, MC_GearSt_Struct_t GearSt)
  105. {
  106. MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
  107. //...插入指拨处理
  108. //电机启动
  109. MC_MotorStar(&MC_StarFlag);
  110. p_MC_CalParam.Foc_Flag = SET;
  111. p_MC_CalParam.AssistRunMode = MC_AssistRunMode_GAS;
  112. return (p_MC_CalParam);
  113. }
  114. //推行模式处理
  115. MC_CalParam_Struct_t MC_AssistRunMode_Walk_Process(MC_WorkMode_Struct_t p_MC_WorkMode)
  116. {
  117. MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
  118. int16_t TorQueBySpd = 0;
  119. int16_t SpdMotorByIdc = 0;
  120. //配置模式,设定转速 = 最高转速
  121. if(p_MC_WorkMode == MC_WorkMode_Config)
  122. {
  123. if(MC_WalkProcess_Param.MotorSpeedSetBigin < (MC_MotorParam.Rate_Speed << 5) * MC_WalkMode_Persent / 100 - 10)
  124. {
  125. MC_WalkProcess_Param.MotorSpeedSetBigin += 5;
  126. }
  127. else if(MC_WalkProcess_Param.MotorSpeedSetBigin > (MC_MotorParam.Rate_Speed << 5) * MC_WalkMode_Persent / 100 + 10)
  128. {
  129. if(MC_WalkProcess_Param.MotorSpeedSetBigin > 5)
  130. {
  131. MC_WalkProcess_Param.MotorSpeedSetBigin -= 5;
  132. }
  133. else
  134. {
  135. MC_WalkProcess_Param.MotorSpeedSetBigin = 0;
  136. }
  137. }
  138. else
  139. {
  140. MC_WalkProcess_Param.MotorSpeedSetBigin = (MC_MotorParam.Rate_Speed << 5 ) * MC_WalkMode_Persent / 100;
  141. }
  142. SpdMotorByIdc = PID_Regulator((MC_ConfigParam.CurrentLimit * 1000) >> 7, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower); // 母线电流闭环
  143. }
  144. //运行模式,设定转速 = 150rpm
  145. else
  146. {
  147. if(MC_WalkProcess_Param.MotorSpeedSetBigin < (135 << 5) - 10)
  148. {
  149. MC_WalkProcess_Param.MotorSpeedSetBigin += 4;
  150. }
  151. else if(MC_WalkProcess_Param.MotorSpeedSetBigin > (135 << 5) + 10)
  152. {
  153. MC_WalkProcess_Param.MotorSpeedSetBigin -= 4;
  154. }
  155. else
  156. {
  157. MC_WalkProcess_Param.MotorSpeedSetBigin = 135 << 5;
  158. }
  159. SpdMotorByIdc = PID_Regulator((MC_ConfigParam.CurrentLimit * 500) >> 7, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower); // 母线电流闭环
  160. }
  161. //速度环
  162. TorQueBySpd = PID_Regulator((MC_WalkProcess_Param.MotorSpeedSetBigin >> 5), MC_RunInfo.MotorSpeed, &PID_MotorSpd); // 电机速度闭环输出
  163. TorQueBySpd += SpdMotorByIdc;
  164. //限制车速低于6km/h
  165. if(p_MC_WorkMode != MC_WorkMode_Config) //运行模式,推行限速6km/h
  166. {
  167. TorQueBySpd = (uint16_t)((uint32_t)(TorQueBySpd * Function_Linear_3Stage(55, 0, 55, 128, MC_RunInfo.BikeSpeed)) >> 10);
  168. if(MC_RunInfo.BikeSpeed > 60)
  169. {
  170. MC_WalkProcess_Param.MotorSpeedSetBigin = 0;
  171. MC_MotorStop(&MC_StarFlag);
  172. }
  173. else
  174. {
  175. //电机启动
  176. MC_MotorStar(&MC_StarFlag);
  177. }
  178. }
  179. else //配置模式不限速
  180. {
  181. //电机启动
  182. MC_MotorStar(&MC_StarFlag);
  183. }
  184. #if 1
  185. //根据电压调节输出
  186. TorQueBySpd = (int16_t)((int32_t)TorQueBySpd * Function_Linear_3Stage(258, 21, 328, 0, MC_RunInfo.BusVoltage >> 7) >> 10);//电压单位按照(mV / 128)计算
  187. //根据温度调节输出
  188. TorQueBySpd = (int16_t)((int32_t)TorQueBySpd * Function_Linear_3Stage(MC_ConfigParam.TempTH_Alarm, 0, MC_ConfigParam.TempTH_Alarm, 26, MC_RunInfo.T_Roil) >> 10);
  189. #endif
  190. #if 0
  191. //限制最大输出功率为250W
  192. static uint16_t IqsMax;
  193. if(MC_RunInfo.MotorSpeed < 10)
  194. {
  195. IqsMax = 1050;
  196. }
  197. else
  198. {
  199. IqsMax = 235000 / MC_RunInfo.MotorSpeed;
  200. }
  201. IqsMax = (IqsMax > 1050) ? 1050 : IqsMax;
  202. if(TorQueBySpd > IqsMax)
  203. {
  204. TorQueBySpd = IqsMax;
  205. }
  206. #elif 0
  207. if(TorQueBySpd > 450)
  208. {
  209. TorQueBySpd = 450;
  210. }
  211. #endif
  212. p_MC_CalParam.Ref_Speed = TorQueBySpd;
  213. p_MC_CalParam.Foc_Flag = SET;
  214. p_MC_CalParam.AssistRunMode = MC_AssistRunMode_WALK;
  215. return (p_MC_CalParam);
  216. }
  217. //踏频模式处理
  218. MC_CalParam_Struct_t MC_AssistRunMode_Cadence_Process(MC_GearSt_Struct_t GearSt)
  219. {
  220. MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
  221. //...插入踏频处理
  222. //电机启动
  223. MC_MotorStar(&MC_StarFlag);
  224. p_MC_CalParam.Foc_Flag = SET;
  225. p_MC_CalParam.AssistRunMode = MC_AssistRunMode_CADENCE;
  226. return (p_MC_CalParam);
  227. }
  228. //力矩模式处理
  229. MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_GearSt_Struct_t GearSt)
  230. {
  231. MC_CalParam_Struct_t p_MC_CalParam = {MC_AssistRunMode_INVALID, 0, 0, RESET};
  232. uint8_t TorqueAccStep = 0;//力矩上升斜率
  233. uint8_t TorqueDecStep = 0;//力矩下降斜率
  234. uint16_t TorqueStartData, TorqueStopData;//力矩启动值,力矩停机值
  235. int16_t Torque_Temp;
  236. static uint32_t TorqueStopDelayTimeCnt = 0; //低力矩停机计时
  237. uint16_t TorqueStopDelayTime;
  238. static int16_t IqRefByInPower; //限流计算结果
  239. static uint16_t CurrentLimitPresent; //限流实际值,做升降速处理
  240. uint16_t CurrentLimitSet; //限流设置值,不同助力档位更新
  241. #if 1
  242. //踩踏力矩输入
  243. MC_TorqueProcess_Param.TorqueApp = SenorData;
  244. #elif 0
  245. //输入阶跃
  246. MC_TorqueProcess_Param.TorqueApp = 1000;
  247. //踏频设为启动
  248. MC_CadenceResult.Cadence_Dir = MC_Cadence_Forward;
  249. MC_CadenceResult.IsStopFlag = FALSE;
  250. #elif 1
  251. //输入斜坡
  252. static uint32_t WaveTime_Zero = 0;
  253. static uint32_t Time_Enter = 0;
  254. if((HAL_GetTick() - Time_Enter) > 10) // 超时10ms未进入,波形发生初始时刻清零
  255. {
  256. WaveTime_Zero = HAL_GetTick();
  257. }
  258. Time_Enter = HAL_GetTick();
  259. MC_TorqueProcess_Param.TorqueApp = RampWaveGenerate(WaveTime_Zero, 6000, 2100);
  260. //踏频设为启动
  261. MC_CadenceResult.Cadence_Dir = MC_Cadence_Forward;
  262. MC_CadenceResult.IsStopFlag = FALSE;
  263. #elif 1
  264. //输入三角波,测试输出响应
  265. static uint32_t WaveTime_Zero = 0;
  266. static uint32_t Time_Enter = 0;
  267. if((HAL_GetTick() - Time_Enter) > 10) // 超时10ms未进入,波形发生初始时刻清零
  268. {
  269. WaveTime_Zero = HAL_GetTick();
  270. }
  271. Time_Enter = HAL_GetTick();
  272. MC_TorqueProcess_Param.TorqueApp = TriangleWaveGenerate(WaveTime_Zero, 500, 1000 ,1500);
  273. //踏频设为启动
  274. MC_CadenceResult.Cadence_Dir = MC_Cadence_Forward;
  275. MC_CadenceResult.IsStopFlag = FALSE;
  276. #elif 1
  277. //输入方波,测试输出响应
  278. static uint32_t WaveTime_Zero = 0;
  279. static uint32_t Time_Enter = 0;
  280. if((HAL_GetTick() - Time_Enter) > 10) // 超时10ms未进入,波形发生初始时刻清零
  281. {
  282. WaveTime_Zero = HAL_GetTick();
  283. }
  284. Time_Enter = HAL_GetTick();
  285. MC_TorqueProcess_Param.TorqueApp = SquareWaveGenerate(WaveTime_Zero, 5000, 8000, 1500);
  286. //踏频设为启动
  287. MC_CadenceResult.Cadence_Dir = MC_Cadence_Forward;
  288. MC_CadenceResult.IsStopFlag = FALSE;
  289. #endif
  290. //低力矩停机
  291. TorqueStopData = (MC_TorqueCorrectParam.StarData < 200) ? 100 : (MC_TorqueCorrectParam.StarData >> 1);
  292. if(MC_TorqueProcess_Param.TorqueApp >= (TorqueStopData))
  293. {
  294. TorqueStopDelayTimeCnt = HAL_GetTick();
  295. }
  296. else
  297. {
  298. if(MC_RunInfo.MotorSpeed > 300)
  299. {
  300. TorqueStopDelayTime = 327600 / MC_RunInfo.MotorSpeed + 200;
  301. }
  302. else
  303. {
  304. TorqueStopDelayTime = 1200;
  305. }
  306. TorqueStopDelayTime = (TorqueStopDelayTime > 1200) ? 1200 : TorqueStopDelayTime;
  307. TorqueStopDelayTime = (TorqueStopDelayTime < 300) ? 300 : TorqueStopDelayTime;
  308. if((HAL_GetTick() - TorqueStopDelayTimeCnt) > TorqueStopDelayTime)//超时1200ms
  309. {
  310. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  311. }
  312. }
  313. //启动值判断
  314. if(MC_RunInfo.BikeSpeed > 60)
  315. {
  316. TorqueStartData = (MC_TorqueCorrectParam.StarData < 200 ? 150 \
  317. : (MC_TorqueCorrectParam.StarData > 700 ? 525 \
  318. : (MC_TorqueCorrectParam.StarData * 3 >> 2)));
  319. }
  320. else
  321. {
  322. TorqueStartData = (MC_TorqueCorrectParam.StarData < 200 ? 150 \
  323. : (MC_TorqueCorrectParam.StarData > 700 ? 525 \
  324. : MC_TorqueCorrectParam.StarData));
  325. }
  326. if(MC_TorqueProcess_Param.TorqueApp >= TorqueStartData)
  327. {
  328. MC_TorqueProcess_Param.MotorStopLock_Flag = RESET;
  329. }
  330. //踏频反向或踏频停止停机
  331. if((MC_CadenceResult.Cadence_Dir == MC_Cadence_Backward) ||
  332. (MC_CadenceResult.IsStopFlag == TRUE)
  333. )
  334. {
  335. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  336. }
  337. //停机状态,延时处理
  338. if(MC_TorqueProcess_Param.MotorStopLock_Flag == SET)
  339. {
  340. if(MC_TorqueProcess_Param.TorqueRefEnd < 10)
  341. {
  342. MC_TorqueProcess_Param.TorqueRefEnd = 0;
  343. //停机处理
  344. MC_MotorStop(&MC_StarFlag);
  345. }
  346. else
  347. {
  348. MC_TorqueProcess_Param.TorqueRefEnd -= 14; //这里影响到停止踩踏后的断电时间
  349. MC_MotorStar(&MC_StarFlag);
  350. }
  351. }
  352. //力矩给定升降速处理
  353. else
  354. {
  355. //按照助力档位调节力矩输入值
  356. switch(GearSt)
  357. {
  358. case MC_GearSt_Torque_ECO:
  359. {
  360. //控制输入给定加速斜率
  361. TorqueAccStep = MC_AssisParam.Gear_ECO.AccCnt;
  362. //控制输入给定减速斜率
  363. TorqueDecStep = MC_AssisParam.Gear_ECO.DecCnt;
  364. //随力矩输入调节助力比
  365. if(MC_ConfigParam.StarModel == MC_StarMode_DYNAMIC)//强劲模式
  366. {
  367. 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);
  368. TorqueAccStep <<= 1;
  369. TorqueDecStep <<= 1;
  370. }
  371. else
  372. {
  373. 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);
  374. }
  375. //给定下限
  376. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_ECO.Lower_Iq) ? MC_AssisParam.Gear_ECO.Lower_Iq : Torque_Temp;
  377. //给定上限
  378. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_ECO.Upper_Iq) ? MC_AssisParam.Gear_ECO.Upper_Iq : Torque_Temp;
  379. //限流参数设置
  380. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_ECO.CurrentMax_K * MC_ConfigParam.CurrentLimit * 1000 >> 17);
  381. CurrentLimitPresent = CurrentLimitSet * 100;
  382. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_ECO.Upper_Iq); //Lower Limit for Output limitation
  383. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  384. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_ECO.Upper_Iq << 10); // 放大1024
  385. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  386. break;
  387. }
  388. case MC_GearSt_Torque_NORM:
  389. {
  390. //控制输入给定加速斜率
  391. TorqueAccStep = MC_AssisParam.Gear_NORM.AccCnt;
  392. //控制输入给定减速斜率
  393. TorqueDecStep = MC_AssisParam.Gear_NORM.DecCnt;
  394. //随力矩输入调节助力比
  395. if(MC_ConfigParam.StarModel == MC_StarMode_DYNAMIC)//强劲模式
  396. {
  397. 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);
  398. TorqueAccStep <<= 1;
  399. TorqueDecStep <<= 1;
  400. }
  401. else
  402. {
  403. 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);
  404. }
  405. //给定下限
  406. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_NORM.Lower_Iq) ? MC_AssisParam.Gear_NORM.Lower_Iq : Torque_Temp;
  407. //给定上限
  408. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_NORM.Upper_Iq) ? MC_AssisParam.Gear_NORM.Upper_Iq : Torque_Temp;
  409. //限流参数设置
  410. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_NORM.CurrentMax_K * MC_ConfigParam.CurrentLimit * 1000 >> 17);
  411. CurrentLimitPresent = CurrentLimitSet * 100;
  412. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_NORM.Upper_Iq); //Lower Limit for Output limitation
  413. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  414. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_NORM.Upper_Iq << 10); // 放大1024
  415. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  416. break;
  417. }
  418. case MC_GearSt_Torque_SPORT:
  419. {
  420. //控制输入给定加速斜率
  421. TorqueAccStep = MC_AssisParam.Gear_SPORT.AccCnt;
  422. //控制输入给定减速斜率
  423. TorqueDecStep = MC_AssisParam.Gear_SPORT.DecCnt;
  424. //随力矩输入调节助力比
  425. if(MC_ConfigParam.StarModel == MC_StarMode_DYNAMIC)//强劲模式
  426. {
  427. 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);
  428. TorqueAccStep <<= 1;
  429. TorqueDecStep <<= 1;
  430. }
  431. else
  432. {
  433. 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);
  434. }
  435. //给定下限
  436. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_SPORT.Lower_Iq) ? MC_AssisParam.Gear_SPORT.Lower_Iq : Torque_Temp;
  437. //给定上限
  438. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_SPORT.Upper_Iq) ? MC_AssisParam.Gear_SPORT.Upper_Iq : Torque_Temp;
  439. //限流参数设置
  440. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SPORT.CurrentMax_K * MC_ConfigParam.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
  441. CurrentLimitPresent = MC_CurrentLimit_Linear_Process(CurrentLimitSet, CurrentLimitPresent);
  442. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_SPORT.Upper_Iq); //Lower Limit for Output limitation
  443. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  444. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_SPORT.Upper_Iq << 10); // 放大1024
  445. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  446. break;
  447. }
  448. case MC_GearSt_Torque_TURBO:
  449. {
  450. //控制输入给定加速斜率
  451. TorqueAccStep = MC_AssisParam.Gear_TURBO.AccCnt;
  452. //控制输入给定减速斜率
  453. TorqueDecStep = MC_AssisParam.Gear_TURBO.DecCnt;
  454. //随力矩输入调节助力比
  455. if(MC_ConfigParam.StarModel == MC_StarMode_DYNAMIC)//强劲模式
  456. {
  457. 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);
  458. TorqueAccStep <<= 1;
  459. TorqueDecStep <<= 1;
  460. }
  461. else
  462. {
  463. 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);
  464. }
  465. //给定下限
  466. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_TURBO.Lower_Iq) ? MC_AssisParam.Gear_TURBO.Lower_Iq : Torque_Temp;
  467. //给定上限
  468. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_TURBO.Upper_Iq) ? MC_AssisParam.Gear_TURBO.Upper_Iq : Torque_Temp;
  469. //限流参数设置
  470. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_TURBO.CurrentMax_K * MC_ConfigParam.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
  471. CurrentLimitPresent = MC_CurrentLimit_Linear_Process(CurrentLimitSet, CurrentLimitPresent);
  472. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_TURBO.Upper_Iq); //Lower Limit for Output limitation
  473. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  474. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_TURBO.Upper_Iq << 10); // 放大1024
  475. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  476. break;
  477. }
  478. case MC_GearSt_SMART:
  479. {
  480. //控制输入给定加速斜率
  481. TorqueAccStep = MC_AssisParam.Gear_SMART.AccCnt;
  482. //控制输入给定减速斜率
  483. TorqueDecStep = MC_AssisParam.Gear_SMART.DecCnt;
  484. //助力比控制系数
  485. Torque_Temp = (uint32_t)(MC_TorqueProcess_Param.TorqueApp * MC_TorqueProcess_Param.TorqueApp) / (MC_AssisParam.Gear_SMART.i_Sport_TH);
  486. if(MC_ConfigParam.StarModel == MC_StarMode_DYNAMIC)//强劲模式
  487. {
  488. Torque_Temp = (uint16_t)((uint32_t)(Torque_Temp * Coefficient_GainCal(1024, 1382, MC_AssisParam.Gear_SMART.i_Sport_TH, Torque_Temp)) >> 10);
  489. TorqueAccStep <<= 1;
  490. TorqueDecStep <<= 1;
  491. }
  492. //给定下限
  493. Torque_Temp = (Torque_Temp < MC_AssisParam.Gear_SMART.Lower_Iq) ? MC_AssisParam.Gear_SMART.Lower_Iq : Torque_Temp;
  494. //给定上限
  495. Torque_Temp = (Torque_Temp > MC_AssisParam.Gear_SMART.Upper_Iq) ? MC_AssisParam.Gear_SMART.Upper_Iq : Torque_Temp;
  496. //限流参数设置
  497. CurrentLimitSet = (uint32_t)(MC_AssisParam.Gear_SMART.CurrentMax_K * MC_ConfigParam.CurrentLimit * 1000 >> 17) * MC_CadenceLimit_K;
  498. CurrentLimitPresent = MC_CurrentLimit_Linear_Process(CurrentLimitSet, CurrentLimitPresent);
  499. PID_IMax.hLower_Limit_Output = -(MC_AssisParam.Gear_SMART.Upper_Iq); //Lower Limit for Output limitation
  500. PID_IMax.hUpper_Limit_Output = 0; //Upper Limit for Output limitation
  501. PID_IMax.wLower_Limit_Integral = -(MC_AssisParam.Gear_SMART.Upper_Iq << 10); // 放大1024
  502. PID_IMax.wUpper_Limit_Integral = 0; // 放大1024
  503. break;
  504. }
  505. default:
  506. {
  507. TorqueAccStep = 0;
  508. TorqueDecStep = 0;
  509. Torque_Temp = 0;
  510. break;
  511. }
  512. }
  513. //随车速调节助力比
  514. if(MC_ConfigParam.StarModel == MC_StarMode_DYNAMIC)
  515. {
  516. Torque_Temp = (uint16_t)((uint32_t)(Torque_Temp * Function_Linear_3Stage(90, -2, MC_ConfigParam.SpeedLimit * 10, 82, MC_RunInfo.BikeSpeed)) >> 10);
  517. }
  518. else if(MC_ConfigParam.StarModel == MC_StarMode_SOFT)
  519. {
  520. Torque_Temp = (uint16_t)((uint32_t)(Torque_Temp * Function_Linear_3Stage(120, -3, MC_ConfigParam.SpeedLimit * 10, 82, MC_RunInfo.BikeSpeed)) >> 10);
  521. }
  522. else
  523. {
  524. 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);
  525. }
  526. //限流计算
  527. IqRefByInPower = PID_Regulator(CurrentLimitPresent / 100, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
  528. MC_TorqueProcess_Param.TorqueRef = Torque_Temp + IqRefByInPower;
  529. if(MC_TorqueProcess_Param.TorqueRef <= 0)
  530. {
  531. MC_TorqueProcess_Param.TorqueRef = 0;
  532. }
  533. //升降速曲线计算
  534. if(IqRefByInPower < 0)
  535. {
  536. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  537. {
  538. MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
  539. }
  540. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  541. {
  542. MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep * 5;
  543. }
  544. }
  545. else
  546. {
  547. if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) > 2)
  548. {
  549. MC_TorqueProcess_Param.TorqueRefEnd += TorqueAccStep;
  550. }
  551. else if((MC_TorqueProcess_Param.TorqueRef - MC_TorqueProcess_Param.TorqueRefEnd) < (- 1))
  552. {
  553. MC_TorqueProcess_Param.TorqueRefEnd -= TorqueDecStep;
  554. }
  555. }
  556. MC_TorqueProcess_Param.TorqueRefEnd = (MC_TorqueProcess_Param.TorqueRefEnd < 6) ? 6 : MC_TorqueProcess_Param.TorqueRefEnd;
  557. //限速点处理
  558. if(MC_RunInfo.BikeSpeed > ((MC_ConfigParam.SpeedLimit + 1) * 10))
  559. {
  560. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  561. MC_TorqueProcess_Param.TorqueRefEnd = 0;
  562. //停机处理
  563. MC_MotorStop(&MC_StarFlag);
  564. }
  565. else if(MC_RunInfo.BikeSpeed < ((MC_ConfigParam.SpeedLimit - 1) * 10))
  566. {
  567. MC_MotorStar(&MC_StarFlag);
  568. }
  569. }
  570. #if 1
  571. //根据电压调节输出
  572. 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)计算
  573. //根据温度调节输出
  574. 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);
  575. #endif
  576. p_MC_CalParam.Ref_Torque = (int16_t)(MC_TorqueProcess_Param.TorqueRefEnd >> 1);
  577. p_MC_CalParam.Foc_Flag = SET;
  578. p_MC_CalParam.AssistRunMode = MC_AssistRunMode_TORQUE;
  579. return (p_MC_CalParam);
  580. }
  581. /******************************全局函数定义*****************************/
  582. //传感器初始化
  583. void MC_SensorInit(void)
  584. {
  585. //霍尔传感器IO设置
  586. HallSensor_GPIO_Init();
  587. //霍尔电角度初始化
  588. HallSensorAngle_Init();
  589. //踏频传感器IO设置
  590. CadenceSensor_GPIO_Init();
  591. //速度传感器IO设置
  592. SpeedSensor_GPIO_Init();
  593. //刹车信号和Gear信号检测IO设置
  594. KeyInitial();
  595. //力矩传感器零点初值
  596. TorqueOffSetDefaultData_Init(&TorqueOffSetData, ADC1_Result[ADC1_RANK_TORQUE_SENSOR]);
  597. //指拨零点初值
  598. GasSensorOffSet_Init(&GasSensor_OffSet, ADC1_Result[ADC1_RANK_GAS]);
  599. }
  600. //MC控制初始化
  601. void MC_Init(void)
  602. {
  603. //PID参数初始化
  604. PID_Init(&PID_Torque_InitStructure,\
  605. &PID_Flux_InitStructure,\
  606. &PID_Weak_InitStructure,\
  607. &PID_IMax,\
  608. &PID_MotorSpd,\
  609. &PID_ConstantPower\
  610. );
  611. //助力参数初始化
  612. UpdateGearParam(MC_ConfigParam.SerialNum);
  613. //三相电流零点校准
  614. SVPWM_3ShuntCurrentReadingCalibration(&MC_ErrorCode);
  615. //母线电流零点校准
  616. CurrentReadingCalibration(&MC_ErrorCode);
  617. //力矩传感器零点值处理
  618. TorqueOffSetData_Process(&TorqueOffSetData, ADC1_Result[ADC1_RANK_TORQUE_SENSOR]);
  619. //智能档位初始化处理
  620. if(MC_ConfigParam.NoPBU_Flag == MC_SUPPORT_ENABLE)
  621. {
  622. MC_ControlCode.GearSt = MC_GearSt_SMART;
  623. Update_MC_ControlCode_Back();
  624. }
  625. //12V驱动电源初始化
  626. Power12V_Driver_Init();
  627. //打开12V驱动电源
  628. Power12V_Driver_Process(SET);
  629. }
  630. //MC控制参数初始化
  631. void MC_ControlParam_Init(void)
  632. {
  633. //清除推行模式初始变量
  634. MC_WalkProcess_Param.IsEnterFlag = FALSE;
  635. MC_WalkProcess_Param.MotorSpeedSetBigin = 0;
  636. //清除力矩模式初始变量
  637. MC_TorqueProcess_Param.MotorStopLock_Flag = SET;
  638. MC_TorqueProcess_Param.TorqueApp = 0;
  639. MC_TorqueProcess_Param.TorqueRef = 0;
  640. MC_TorqueProcess_Param.TorqueRefEnd = 0;
  641. //全局运算变量归零
  642. IqFdbFlt =0;
  643. IdFdbFlt = 0;
  644. VoltSquareFlt = 0;
  645. UqVoltFlt = 0;
  646. UdVoltFlt = 0;
  647. //PDI积分清零
  648. PID_Flux_InitStructure.wIntegral = 0;
  649. PID_Torque_InitStructure.wIntegral = 0;
  650. PID_Weak_InitStructure.wIntegral = 0;
  651. PID_IMax.wIntegral = 0;
  652. PID_MotorSpd.wIntegral = 0;
  653. PID_ConstantPower.wIntegral = 0;
  654. }
  655. //控制参数输入值计算
  656. 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)
  657. {
  658. MC_AssistRunMode_Struct_t MC_AssistRunMode_Temp;
  659. static FlagStatus MC_AssistRunMode_ShiftFlag = RESET; //电机助力模式切换标志
  660. //根据指拨信号、助力档位指令、刹车信号判断助力模式
  661. MC_AssistRunMode_Temp = MC_JudgeAsistRunMode_Process(p_ADC_SensorData.GasSensor, GearSt, Break_Flag);
  662. //发生助力模式切换时,清空变量
  663. if(MC_AssistRunMode_Temp != p_MC_CalParam->AssistRunMode)
  664. {
  665. if(MC_AssistRunMode_ShiftFlag == RESET)
  666. {
  667. MC_AssistRunMode_Temp = MC_AssistRunMode_INVALID;
  668. MC_AssistRunMode_ShiftFlag = SET;
  669. }
  670. }
  671. //助力模式处理
  672. switch(MC_AssistRunMode_Temp)
  673. {
  674. //指拨模式
  675. case MC_AssistRunMode_GAS:
  676. {
  677. //计算FOC控制输入
  678. *p_MC_CalParam = MC_AssistRunMode_Gas_Process(p_ADC_SensorData.GasSensor, (MC_GearSt_Struct_t)(GearSt & 0x0F));
  679. //助力模式切换标志复位
  680. MC_AssistRunMode_ShiftFlag = RESET;
  681. break;
  682. }
  683. //推行模式
  684. case MC_AssistRunMode_WALK:
  685. {
  686. //计算FOC控制输入
  687. if(MC_WalkProcess_Param.IsEnterFlag == FALSE)
  688. {
  689. MC_WalkProcess_Param.MotorSpeedSetBigin = (uint32_t)MC_RunInfo.MotorSpeed << 5;
  690. MC_WalkProcess_Param.IsEnterFlag = TRUE;
  691. }
  692. *p_MC_CalParam = MC_AssistRunMode_Walk_Process(p_MC_WorkMode);
  693. //助力模式切换标志复位
  694. MC_AssistRunMode_ShiftFlag = RESET;
  695. break;
  696. }
  697. //踏频模式
  698. case MC_AssistRunMode_CADENCE:
  699. {
  700. //计算FOC控制输入
  701. *p_MC_CalParam = MC_AssistRunMode_Cadence_Process(GearSt);
  702. //助力模式切换标志复位
  703. MC_AssistRunMode_ShiftFlag = RESET;
  704. break;
  705. }
  706. //力矩模式
  707. case MC_AssistRunMode_TORQUE:
  708. {
  709. //计算FOC控制输入
  710. *p_MC_CalParam = MC_AssistRunMode_Torque_Process(p_ADC_SensorData.TorqueSensor, GearSt);
  711. //助力模式切换标志复位
  712. MC_AssistRunMode_ShiftFlag = RESET;
  713. break;
  714. }
  715. //空闲模式或存在故障
  716. case MC_AssistRunMode_INVALID: default:
  717. {
  718. //停机处理
  719. MC_MotorStop(&MC_StarFlag);
  720. //更新母线电流零点值
  721. CurrentReadingCalibration(&MC_ErrorCode);
  722. //控制计算值初始化为默认值
  723. p_MC_CalParam->AssistRunMode = MC_AssistRunMode_INVALID;
  724. p_MC_CalParam->Foc_Flag = RESET;
  725. p_MC_CalParam->Ref_Torque = 0;
  726. p_MC_CalParam->Ref_Speed = 0;
  727. break;
  728. }
  729. }
  730. }
  731. void MC_MotorStop(FlagStatus* StarFlag)
  732. {
  733. //关闭PWM输出
  734. Pwm_Timer_Stop();
  735. //FOC运算停止
  736. FOC_Disable();
  737. //控制参数归零
  738. MC_ControlParam_Init();
  739. //电机启动标志复位
  740. *StarFlag = RESET;
  741. }
  742. void MC_MotorStar(FlagStatus* StarFlag)
  743. {
  744. if(*StarFlag == RESET)
  745. {
  746. //开启PWM输出
  747. Enable_Pwm_Output();
  748. //霍尔电角度初始化
  749. HallSensorAngle_Init();
  750. //FOC运算启动
  751. FOC_Enable();
  752. //电机启动标志置位
  753. *StarFlag = SET;
  754. }
  755. }